最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)
=====================================================
最簡單的基于FFmpeg的視頻編碼器文章列表:
最簡單的基于FFMPEG的視頻編碼器(YUV編碼為H.264)
最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))
最簡單的基于FFmpeg的編碼器-純凈版(不包含libavformat)
=====================================================
本文記錄一個更加“純凈”的基于FFmpeg的視頻編碼器。此前記錄過一個基于FFmpeg的視頻編碼器:
?《最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))》
這個視頻編碼器調(diào)用了FFmpeg中的libavformat和libavcodec兩個庫完成了視頻編碼工作。但是這不是一個“純凈”的編碼器。上述兩個庫中l(wèi)ibavformat完成封裝格式處理,而libavcodec完成編碼工作。一個“純凈”的編碼器,理論上說只需要使用libavcodec就足夠了,并不需要使用libavformat。本文記錄的編碼器就是這樣的一個“純凈”的編碼器,它僅僅通過調(diào)用libavcodec將YUV數(shù)據(jù)編碼為H.264/HEVC等格式的壓縮視頻碼流。
流程圖
僅使用libavcodec(不使用libavformat)編碼視頻的流程如下圖所示。
流程圖中關(guān)鍵函數(shù)的作用如下所列:
avcodec_register_all():注冊所有的編解碼器。avcodec_find_encoder():查找編碼器。
avcodec_alloc_context3():為AVCodecContext分配內(nèi)存。
avcodec_open2():打開編碼器。
avcodec_encode_video2():編碼一幀數(shù)據(jù)。
兩個存儲數(shù)據(jù)的結(jié)構(gòu)體如下所列:
AVFrame:存儲一幀未編碼的像素數(shù)據(jù)。
AVPacket:存儲一幀壓縮編碼數(shù)據(jù)。
對比
簡單記錄一下這個只使用libavcodec的“純凈版”視頻編碼器和使用libavcodec+libavformat的視頻編碼器的不同。
PS:使用libavcodec+libavformat的編碼器參考文章?《最簡單的基于FFmpeg的視頻編碼器-更新版(YUV編碼為HEVC(H.265))》
(1) 下列與libavformat相關(guān)的函數(shù)在“純凈版”視頻編碼器中都不存在。av_register_all():注冊所有的編解碼器,復用/解復用器等等組件。其中調(diào)用了avcodec_register_all()注冊所有編解碼器相關(guān)的組件。
avformat_alloc_context():創(chuàng)建AVFormatContext結(jié)構(gòu)體。
avformat_alloc_output_context2():初始化一個輸出流。
avio_open():打開輸出文件。
avformat_new_stream():創(chuàng)建AVStream結(jié)構(gòu)體。avformat_new_stream()中會調(diào)用avcodec_alloc_context3()創(chuàng)建AVCodecContext結(jié)構(gòu)體。
avformat_write_header():寫文件頭。
av_write_frame():寫編碼后的文件幀。
av_write_trailer():寫文件尾。 (2) 新增了如下幾個函數(shù)
avcodec_register_all():只注冊編解碼器有關(guān)的組件。
avcodec_alloc_context3():創(chuàng)建AVCodecContext結(jié)構(gòu)體。
可以看出,相比于“完整”的編碼器,這個純凈的編碼器函數(shù)調(diào)用更加簡單,功能相對少一些,相對來說更加的“輕量”。
源代碼
運行結(jié)果
通過設(shè)定定義在程序開始的宏,確定需要使用的編碼器。
當TEST_H264設(shè)置為1的時候,編碼H.264文件“ds.h264”。
當TEST_HEVC設(shè)置為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
本程序?qū)崿F(xiàn)了YUV像素數(shù)據(jù)編碼為視頻碼流(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)=========================================
這次考慮到了跨平臺的要求,調(diào)整了源代碼。經(jīng)過這次調(diào)整之后,源代碼可以在以下平臺編譯通過:
VC++:打開sln文件即可編譯,無需配置。
cl.exe:打開compile_cl.bat即可命令行下使用cl.exe進行編譯,注意可能需要按照VC的安裝路徑調(diào)整腳本里面的參數(shù)。編譯命令如下。
::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上已經(jīng)更新。
總結(jié)
以上是生活随笔為你收集整理的最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简单的基于FFMPEG的视频编码器(Y
- 下一篇: 利用 AVDictionary 配置参数