FFmpeg SDK 開發(一)

FFMpeg 中比較重要的函數以及數據結構如下:

1. 數據結構:

  • (1) AVFormatContext
    此結構包含了一個視頻流的格式內容。其中存有了 AVInputFormat(or AVOutputFormat 同一時間 AVFormatContext 內只能存在其中一個),和 AVStream、AVPacket 這幾個重要的數據結構以及一些其他的 相關信息,比如 title,author,copyright 等。還有一些可能在編解碼中會用到的信息,諸如:duration, file_size, bit_rate 等。參考 avformat.h 頭文件。
  • (2) AVOutputFormat
  • (3) AVInputFormat
  • (4) AVCodecContext
    此結構在Ffmpeg SDK中的註釋是:main external api structure其重要性可見一斑。而且在avcodec它的定 義處,對其每個成員變量,都給出了十分詳細的介紹。應該說AVCodecContext的初始化是Codec使用中最重 要的一環。雖然在前面的AVStream中已經有所提及,但是這裏還是要在說一遍。AVCodecContext作爲 Avstream的一個成員結構,必須要在Avstream初始化後(30)再對其初始化(AVStream的初始化用到 AVFormatContex)。雖然成員變量比較多,但是這裏只說一下在output_example.c中用到了,其他的請查閱 avcodec.h文件中介紹。
  • (5) AVCodec
    結構 AVCodec 中成員變量和成員函數比較少,但是很重要。他包含了 CodecID,也就是用哪個 Codec 像素格式信息。還有前面提到過的 5 個函數(init、encode、close、decoder、flush)。順便提一下,雖然在 參考代碼 output_example.c 中的編碼函數用的是 avcodec_encode_video(),我懷疑在其中就是調用了 AVCodec 的 encode 函數,他們傳遞的參數和返回值都是一致的,當然還沒有得到確認,有興趣可以看看 ffmpeg 源代碼。在參考代碼中,AVCodec 的初始化後的使用都是依附於 AVCodecContex,前者是後者的成 員。在 AVCodecContext 初始化後(add_video_stream()),AVCodec 也就能很好的初始化了
  • (6) AVFrame
    AVFrame 是作爲一個描述“原始圖像”(也就是 YUV 或是 RGB…還有其他的嗎?)的結構,他的頭兩 個成員數據,uint8_t *data[4],int linesize[4],第一個存放的是 Y、Cb、Cr(yuv 格式),linesize 是啥?由這 兩個數據還能提取處另外一個數據結構。
  • (7) AVPacket
    AVPacket 的存在是作爲寫入文件的基本單元而存在的。我們可能會認爲直接把編碼後的比特流寫入文 件不就可以了,爲什麼還要麻煩設置一個 AVPacket 結構。在我看來這樣的編碼設置是十分有必要的,特別 是在做視頻實時傳輸,同步、邊界問題可以通過 AVPacket 來解決。AVPacket 的成員數據有兩個時間戳、 數據 data(通常是編碼後數據)、大小 size 等等(參見 avformat.h 48 行)。講 AVPacket 的用法就不得不提到 編解碼函數,因爲 AVPacket 的好些信息只有在編解碼後才能的知。在參考代碼中(ouput_example.c 從 362 到 394 行),做的一個判斷分支。如果輸出文件格式是 RAW 圖像(即 YUV 或 RGB)那麼就沒有編碼函數, 直接寫入文件(因爲程序本身生成一個 YUV 文件),這裏的代碼雖然在此看來沒什麼價值,但是如果是解 碼函數解出 yuv 文件(或 rgb)那麼基本的寫文件操作就是這樣的
  • (8) AVPicture
    AVPicture 的存在有以下原因,AVPicture 將 Picture 的概念從 Frame 中提取出來,就只 由Picture(圖片)本身的信息,亮度、色度和行大小。而Frame還有如是否是key frame之類的信息。這樣的類似“分級”是整個概念更加清晰。
  • (9) AVStream
    AVStream作爲繼AVFormatContext後第二個貫穿始終的結構是有其理由的。他的成員數據中有 AVCodecContext這基本的上是對所使用的Video Codec的參數進行設定的(包括bit rate、分辨率等重要信息)。 同時作爲“Stream”,它包含了“流”這個概念中的一些數據,比如:幀率(r_frame_rate)、基本時間計量 單位(time_base)、(需要編解碼的)首幀位置(start_time)、持續時間(duration)、幀數(nb_frames)以及 一些ip信息。當然後面的這些信息中有些不是必須要初始化的,但是AVCodecContex是一定要初始化的,而 且就是作爲初始化AVStream最重要的一個部分。

2. 初始化函數:

  • (1) av_register_all()
    usage: initialize ibavcoded, and register all codecs and formats
    每個使用 FFMpeg SDK 的工程都必須調用的函數。進行 codec 和 format 的註冊,然後才能使用。聲明在 allformats.c 中,都是宏有興趣看看。
  • (2) avcodec_open()
  • (3) avcodec_close()
  • (4) av_open_input_file()
  • (5) av_find_input_format()
  • (6) av_find_stream_info()
  • (7) av_close_input_file()

3. 音視頻編解碼函數:

  • (1) avcodec_find_decoder()
  • (2) avcodec_alloc_frame()
  • (3) avpicture_get_size()
  • (4) avpicture_fill()
  • (5) img_convert()
  • (6) avcodec_alloc_context()
  • (7) avcodec_decode_video()
  • (8) av_free_packet()
  • (9) av_free()

4. 文件操作:

  • (1) avnew_steam()
  • (2) av_read_frame()
  • (3) av_write_frame()
  • (4) dump_format()

5. 其他函數:

  • (1) avpicture_deinterlace()
  • (2) ImgReSampleContext()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章