最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)
=====================================================
最簡單的基于FFmpeg的視頻編碼器文章列表:
最簡單的基于FFMPEG的視頻編碼器(YUV編碼為H.264)
最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))
最簡單的基于FFmpeg的編碼器-純凈版(不包含libavformat)
=====================================================
本文記錄一個更加“純凈”的基于FFmpeg的視頻編碼器。此前記錄過一個基于FFmpeg的視頻編碼器:
?《最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))》
這個視頻編碼器調用了FFmpeg中的libavformat和libavcodec兩個庫完成了視頻編碼工作。但是這不是一個“純凈”的編碼器。上述兩個庫中libavformat完成封裝格式處理,而libavcodec完成編碼工作。一個“純凈”的編碼器,理論上說只需要使用libavcodec就足夠了,并不需要使用libavformat。本文記錄的編碼器就是這樣的一個“純凈”的編碼器,它僅僅通過調用libavcodec將YUV數據編碼為H.264/HEVC等格式的壓縮視頻碼流。
流程圖
僅使用libavcodec(不使用libavformat)編碼視頻的流程如下圖所示。
流程圖中關鍵函數的作用如下所列:
avcodec_register_all():注冊所有的編解碼器。avcodec_find_encoder():查找編碼器。
avcodec_alloc_context3():為AVCodecContext分配內存。
avcodec_open2():打開編碼器。
avcodec_encode_video2():編碼一幀數據。
兩個存儲數據的結構體如下所列:
AVFrame:存儲一幀未編碼的像素數據。
AVPacket:存儲一幀壓縮編碼數據。
對比
簡單記錄一下這個只使用libavcodec的“純凈版”視頻編碼器和使用libavcodec+libavformat的視頻編碼器的不同。
PS:使用libavcodec+libavformat的編碼器參考文章?《最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))》
(1) 下列與libavformat相關的函數在“純凈版”視頻編碼器中都不存在。av_register_all():注冊所有的編解碼器,復用/解復用器等等組件。其中調用了avcodec_register_all()注冊所有編解碼器相關的組件。
avformat_alloc_context():創建AVFormatContext結構體。
avformat_alloc_output_context2():初始化一個輸出流。
avio_open():打開輸出文件。
avformat_new_stream():創建AVStream結構體。avformat_new_stream()中會調用avcodec_alloc_context3()創建AVCodecContext結構體。
avformat_write_header():寫文件頭。
av_write_frame():寫編碼后的文件幀。
av_write_trailer():寫文件尾。 (2) 新增了如下幾個函數
avcodec_register_all():只注冊編解碼器有關的組件。
avcodec_alloc_context3():創建AVCodecContext結構體。
可以看出,相比于“完整”的編碼器,這個純凈的編碼器函數調用更加簡單,功能相對少一些,相對來說更加的“輕量”。
源代碼
運行結果
通過設定定義在程序開始的宏,確定需要使用的編碼器。
當TEST_H264設置為1的時候,編碼H.264文件“ds.h264”。
當TEST_HEVC設置為1的時候,解碼HEVC文件“ds.hevc”。
輸入文件是“ds_480x272.yuv”。
程序運行的截圖如下所示。
輸入的YUV文件如下圖所示。
輸出的HEVC文件如下圖所示。
下載
Simplest ffmpeg encoder pure工程被作為子工程添加到了simplest ffmpeg video encoder工程中。新版的simplest ffmpeg video encoder的信息如下。
Simplest ffmpeg video encoder
項目主頁
SourceForge:https://sourceforge.net/projects/simplestffmpegvideoencoder/
Github:https://github.com/leixiaohua1020/simplest_ffmpeg_video_encoder
開源中國:http://git.oschina.net/leixiaohua1020/simplest_ffmpeg_video_encoder
本程序實現了YUV像素數據編碼為視頻碼流(H.265,H264,MPEG2,VP8等等)。
是最簡單的FFmpeg視頻編碼方面的教程。
它包含以下兩個子項目:
simplest_ffmpeg_video_encoder:最簡單的基于FFmpeg的視頻編碼器。使用libavcodec和libavformat編碼并且封裝視頻。simplest_ffmpeg_video_encoder_pure:最簡單的基于FFmpeg的視頻編碼器-純凈版。僅使用libavcodec編碼視頻,不使用libavformat。
version 1.1
CSDN下載地址:http://download.csdn.net/detail/leixiaohua1020/8322003
更新-1.2 (2015.2.13)=========================================
這次考慮到了跨平臺的要求,調整了源代碼。經過這次調整之后,源代碼可以在以下平臺編譯通過:
VC++:打開sln文件即可編譯,無需配置。
cl.exe:打開compile_cl.bat即可命令行下使用cl.exe進行編譯,注意可能需要按照VC的安裝路徑調整腳本里面的參數。編譯命令如下。
::VS2010 Environment call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" ::include @set INCLUDE=include;%INCLUDE% ::lib @set LIB=lib;%LIB% ::compile and link cl simplest_ffmpeg_video_encoder_pure.cpp /link avcodec.lib avutil.lib /OPT:NOREFMinGW:MinGW命令行下運行compile_mingw.sh即可使用MinGW的g++進行編譯。編譯命令如下。
g++ simplest_ffmpeg_video_encoder_pure.cpp -g -o simplest_ffmpeg_video_encoder_pure.exe \ -I /usr/local/include -L /usr/local/lib \ -lavcodec -lavutilGCC:Linux或者MacOS命令行下運行compile_gcc.sh即可使用GCC進行編譯。編譯命令如下。
gcc simplest_ffmpeg_video_encoder_pure.cpp -g -o simplest_ffmpeg_video_encoder_pure.out \ -I /usr/local/include -L /usr/local/lib -lavcodec -lavutilCSDN下載地址: http://download.csdn.net/detail/leixiaohua1020/8444967
SourceForge上已經更新。
總結
以上是生活随笔為你收集整理的最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 最简单的基于FFMPEG的视频编码器(Y
- 下一篇: 利用 AVDictionary 配置参数
