ffmpeg學習筆記

openkk 13年前發布 | 5K 次閱讀
ffmpeg的一流設計, 讓我震撼, 渾然天成的代碼, 讓我為之著迷.

ffmpeg主要劃分為幾個模塊, libavcodec, libavformat, libavutil, libswscale, libavfilter, libavdevice在這幾個模塊中, libavcodec是個重量級的library, 它包含了一系列的編碼解碼器的實現和框架, 你可以方便的在這個框架下添加自己的編解碼器, 然后使用統一的接口進行調用.

這些模塊中, 大多數即是一個單獨的模塊, 也是一個可以和其它模塊互相協調, 比如使用libavformat中的demuxer模塊然后再使用libavcodec進行解碼, libavformat包含了一系列的muxer和demuxer以及io相關的操作. 

libavformat
其中libavformat有一個非常重要的結構: AVFormatContext
它幾乎是ffmpeg中的一顆樹, 其成員AVStream可以包含0種或多種流, 在AVStream中又可以包含已經打開的編解碼器codec, 另外還有AVIOContext成員, 這個成員的作用就是io了, 你可以重寫AVIOContext結構的成員函數read_packet或write_packet等, 來實現從不同介質讀取音視頻媒體數據(比如從網絡、內存或磁盤等),關于ffmpeg的io方面,你還可以在libavformat中自己實現一個 PROTOCOL組件來實現同樣的功能, 方法也很簡單, 只要實現URLProtocol結構然后取個名字在allformats.c中使用REGISTER_PROTOCOL添加一行注冊自己的協議就行了, 其它DEMUXER和MUXDEMUX方法也是相似的, 總結下就是:
libavformat中提供了
AVOutputFormat
AVInputFormat
URLProtocol
三個定義好的結構體, 根據自己需要去實現上面的結構體, 然后在allformats.c的av_register_all函數中添加注冊就行了. 

libavcodec
其中libavcodec也有一個非常重要的結構: AVCodecContext
它包含了當前媒體信息的幾乎所有參數(什么寬高啊, 運行估計啊, 碼率控制啊...), 以及編解碼指針(AVCodec), 甚至還可以設置硬件加速相關(如DXVA, linux下的 VAAPI啊). 其中最重要的就屬AVCodec了, 它是直接指向編解碼器實現, 如果你想自己實現一個編解碼添加到libavcodec中, 那么也是非常方便的. 在libavcodec中, 它提供了以下幾種功能組件的定義:
AVHWAccel
AVCodec
AVCodecParser
AVBitStreamFilter
方法同libavformat, 比如實現一個使用CoreAVC來解碼H264的decodec, 可以定義一個名稱, 實現AVCodec中對應的各函數指針, 然后在allcodecs.c中添加注冊.
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!