FFmpeg学习(一)开篇
文章目錄
- FFmpeg學習(一)開篇
- 為什么要學習FFmpeg
- 1. FFmpeg簡介
- 2. FFmpeg能做什么
- 3. FFmpeg架構模塊組成
- 3. 1 libavutil
- 3. 2 libavformat
- 3. 3 libavcodec
- 3. 4 libavfilter
- 3. 5 libavdevice
- 3. 6 libswscale
- 3. 7 libpostproc
- 3. 8 libswrressample
- 3. 9 ffmpeg
- 3. 10 ffsever
- 3. 11 ffplay
- 4. FFmpeg安裝
FFmpeg學習(一)開篇
為什么要學習FFmpeg
本人希望打算深入研究音視頻領域,音視頻領域的內容很多,我自己打算從幾方面循序漸進:FFmpeg常用功能實踐, FFmpeg源碼研究, OpenGL, OpenGLES, Metal, AR, WebRTC, 直播架構等方向去研究。
音視頻目前主要有哪些應用場景呢?
- 直播類:音視頻會議,教育直播,娛樂/游戲直播等 (例如花椒,映客,騰訊課堂,騰訊會議, 斗魚)
- 短視頻:抖音,快手,小咖秀等, 這類應用主要是對聲音和視頻做特殊處理,如聲音變聲,變調,男聲變女聲,女聲變童聲;如視頻處理有:美顏,濾鏡處理。
- 網絡視頻: 優酷,騰訊視頻,愛奇藝等。
- 音視頻通話:微信,QQ, Skype等。
- 視頻監控: 網絡攝像機IPC等
- 人工智能:人臉識別,智能音箱等,這類應用更關注于算法。
從上面這么多應用場景,我們可以看出音視頻技術是多么重要,特別是5G時代,網絡傳輸問題大大提升,更多的音視頻需求會爆發出來。
我們可以看一下一個簡單播放器的架構,如下圖:
音頻解碼,視頻解碼一般都用FFmpeg解碼,在IOS8 之后提供了VideoToolBox框架支持硬解碼。
而視頻渲染一般使用OpenGL直接用GPU渲染,視頻渲染第三方框架有GPUImage, SDL, VLC
音頻視頻播放涉及到音視頻同步是一個 復雜的技術。
學習一個技術,需要一個高效的方法,只有不斷的實踐才能理解深刻。學習FFmpeg我們也需要好的文檔來學習,下面列舉一些必備的學習文檔地址:
- FFmpeg官方文檔:http://ffmpeg.org/documentation.html
- FFmpeg官方wiki: https://trac.ffmpeg.org
上述都是英文的文檔,如果英文學習困難,可以參考下面的中文資料:
- 雷霄驊博士總結的資料: http://blog.csdn.net/leixiaohua1020
- 羅索實驗室:http://www.rosoo.net
- ChinaFFmpeg: http://bbs/chinaffmpeg.com
此外推薦兩本非常好的書籍:
- FFmpeg從入門到精通
- 音視頻開發進階指南:基于Android與iOS平臺的實踐
1. FFmpeg簡介
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"
- 一個偉大的軟件產生必定有它的一段傳奇歷史,FFmpeg的創建者是法國天才程序員Fabrice Bellard (法布里斯*貝拉)在 2000年是開發出初版;
法布里斯*貝拉:
-
2004年,邁克爾(Michael Niedermayer)接管FFmpeg, 邁克爾將濾鏡子系統libavfilter 加入FFmepg項目中,使得FFmpeg的多媒體處理更加多樣,更加方便。在FFmpeg發布了0.5版本后,很長一段時間沒有進行新版本的發布,直到后來FFmpeg采用Git作為版本控制服務器以后才開始繼續更新發布版本。
-
2011年3月, 由于FFmpeg項目中有一些提交者對FFmpeg的項目管理方式和發展方向不一致,FFmpeg團隊分成了兩派,其中一派認為FFmpeg應該更加專注于音視頻開發,研究更新先進的音視頻技術,這些人重新創建了一個新的項目叫Libav。 另外一派認為他們要兼顧老的FFmpeg技術,然后逐步發展。
-
2015年8月邁克爾主動辭去FFmpeg項目負責人的職務。邁克爾從Libav中移植了大量的代碼和功能到FFmpegZhong , 從此Libav又和FFmpeg合并一起發展。
2. FFmpeg能做什么
- 多媒體視頻處理工具FFmpeg有非常強大的功能包括視頻采集功能、視頻格式轉換、視頻抓圖、給視頻加水印等
- 視頻采集功能:
ffmpeg視頻采集功能非常強大,不僅可以采集視頻采集卡或USB攝像頭的圖像,還可以進行屏幕錄制,同時還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務器,支持直播應用。
- 視頻格式轉換功能:
- 視頻截圖功能:
3. FFmpeg架構模塊組成
我們先看一下一張FFmpeg的架構圖:
下載好的源碼,我們也可以看到大概的源碼結構:
3. 1 libavutil
- libavutil : 包含一些公共的工具函數;
AVUtil是FFmepg的核心工具庫,該模塊是最基礎的模塊之一,下面的許多其他模塊都會依賴該庫做一些基本的音視頻處理操作。
3. 2 libavformat
- libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能;
- AVFormat 是文件格式和協議庫,封裝了Protocol層和Demuxer,Muxer層,使得協議和格式對于開發者來說是透明的。AVFormat中實現了目前多媒體領域中的絕大多數媒體封裝格式,包括封裝和解封裝,如MP4, FLV, KV, TS 等文件封裝格式, RTMP, RTSP, MMS, HLS 等網絡協議封裝格式。
FFmpeg是否支持某種媒體封裝格式,取決于編譯時是否包含了該格式的封裝庫。根據實際需求,可進行媒體封裝格式的擴展,增加自己定制的封裝格式,即在AVFormat中增加自己的封裝處理模塊。
3. 3 libavcodec
- libavcodec:用于各種類型聲音/圖像編解碼;
AVCodec是編解碼庫,該模塊封裝了Codec層,但是有一些Codec是具備自己的License的,FFmpeg是不會默認添加像libx264,FDK-AAC,lame等庫的,但是FFmpeg就像一個平臺一樣,可以將其他的第三方的Codec以插件的方式添加進來,然后為開發者提供統一的接口。
AVCodec中實現了目前多媒體絕大多數的編解碼格式,既支持編碼,也支持解碼。
AVCodec除了支持MPEG4,AAC, MJPEG等自帶的媒體編解碼格式之外,還支持第三方的編解碼器,如H.264(AVC)編碼,需要使用x264編碼器; H.265(HEVC)編碼,需要使用x265編碼器; MP3(mp3lame)編碼,需要使用libmp3lame編碼器。如果希望增加自己的編碼格式,或者硬件編解碼,則需要在AVCodec中增加相應的編解碼模塊。
3. 4 libavfilter
- AVFilter : 是音視頻濾鏡庫,該模塊提供了包括音頻特性和視頻特效的處理,在使用FFmpeg的API進行編解碼的過程中,直接使用該模塊為音視頻數據做特效處理時非常方便同時也非常高效的一種方式。
3. 5 libavdevice
- AVDevice : 輸入輸出設備,比如,需要編譯出播放聲音或者視頻的工具ffplay,就需要確保該模塊是打開的,同時也需要libSDL的預先編譯,因為該設備模塊播放聲音與播放視頻使用的都是libSDL庫。
3. 6 libswscale
- libswscale : 用于視頻場景比例縮放、色彩映射轉換;
SWScale 模塊是將圖像進行格式轉換的模塊,例如,可以將YUV的數據轉換為RGB的數據。
3. 7 libpostproc
- libpostproc : 用于后期效果處理;
- PostProc模塊用來進行后期處理,當我們使用AVFilter的時候需要打開該模塊的開關,因為Filter中會使用到該模塊的一些基礎函數。如果是比較老的FFmpeg版本,那么有可能還會編譯處理avresample模塊,該模塊其實也是用于對音頻原始數據進行重采樣,但是現在已經被廢棄了,不再推薦使用該庫,而是使用swrresample庫進行替代。
3. 8 libswrressample
- SwrRessample 模塊可用于音頻重采樣,可以對數字音頻進行聲道數,數據格式,采樣率等多種基本信息的轉換。
3. 9 ffmpeg
- ffmpeg : 該項目提供的一個工具,可用于格式轉換、解碼或電視卡即時編碼等;
3. 10 ffsever
- ffsever : 一個 HTTP 多媒體即時廣播串流服務器;
3. 11 ffplay
- ffplay : 是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
4. FFmpeg安裝
- 從git 下載源碼:
-
下載源碼后,我們可以查看一下目錄結構:
-
輸入./configure --help 命令查看配置信息
-
內容太多需要分頁,輸入./configure --help | more
從上面的幫助,我們可以嘗試輸入:./configure --list-decoders 查看所有解碼器
aac dst mp1 s302m aac_at dvaudio mp1_at sami aac_fixed dvbsub mp1float sanm aac_latm dvdsub mp2 sbc aasc dvvideo mp2_at scpr ac3 dxa mp2float screenpresso ac3_at dxtory mp3 sdx2_dpcm ac3_fixed dxv mp3_at sgi acelp_kelvin eac3 mp3adu sgirle adpcm_4xm eac3_at mp3adufloat sheervideo adpcm_adx eacmv mp3float shorten adpcm_afc eamad mp3on4 sipr adpcm_agm eatgq mp3on4float siren adpcm_aica eatgv mpc7 smackaud adpcm_argo eatqi mpc8 smacker adpcm_ct eightbps mpeg1_cuvid smc adpcm_dtk eightsvx_exp mpeg1_v4l2m2m smvjpeg adpcm_ea eightsvx_fib mpeg1video snow adpcm_ea_maxis_xa escape124 mpeg2_crystalhd sol_dpcm adpcm_ea_r1 escape130 mpeg2_cuvid sonic adpcm_ea_r2 evrc mpeg2_mediacodec sp5x adpcm_ea_r3 exr mpeg2_mmal speedhq adpcm_ea_xas ffv1 mpeg2_qsv srgc adpcm_g722 ffvhuff mpeg2_v4l2m2m srt adpcm_g726 ffwavesynth mpeg2video ssa adpcm_g726le fic mpeg4 stl adpcm_ima_alp fits mpeg4_crystalhd subrip adpcm_ima_amv flac mpeg4_cuvid subviewer adpcm_ima_apc flashsv mpeg4_mediacodec subviewer1 adpcm_ima_apm flashsv2 mpeg4_mmal sunrast adpcm_ima_cunning flic mpeg4_v4l2m2m svq1 adpcm_ima_dat4 flv mpegvideo svq3 adpcm_ima_dk3 fmvc mpl2 tak adpcm_ima_dk4 fourxm msa1 targa adpcm_ima_ea_eacs fraps mscc targa_y216 adpcm_ima_ea_sead frwu msmpeg4_crystalhd tdsc adpcm_ima_iss g2m msmpeg4v1 text adpcm_ima_mtf g723_1 msmpeg4v2 theora adpcm_ima_oki g729 msmpeg4v3 thp adpcm_ima_qt gdv msrle tiertexseqvideo adpcm_ima_qt_at gif mss1 tiff adpcm_ima_rad gremlin_dpcm mss2 tmv adpcm_ima_smjpeg gsm msvideo1 truehd adpcm_ima_ssi gsm_ms mszh truemotion1 adpcm_ima_wav gsm_ms_at mts2 truemotion2 adpcm_ima_ws h261 mv30 truemotion2rt adpcm_ms h263 mvc1 truespeech adpcm_mtaf h263_v4l2m2m mvc2 tscc adpcm_psx h263i mvdv tscc2 adpcm_sbpro_2 h263p mvha tta adpcm_sbpro_3 h264 mwsc twinvq adpcm_sbpro_4 h264_crystalhd mxpeg txd adpcm_swf h264_cuvid nellymoser ulti adpcm_thp h264_mediacodec nuv utvideo adpcm_thp_le h264_mmal on2avc v210 adpcm_vima h264_qsv opus v210x adpcm_xa h264_rkmpp paf_audio v308 adpcm_yamaha h264_v4l2m2m paf_video v408 adpcm_zork hap pam v410 agm hca pbm vb aic hcom pcm_alaw vble alac hevc pcm_alaw_at vc1 alac_at hevc_cuvid pcm_bluray vc1_crystalhd alias_pix hevc_mediacodec pcm_dvd vc1_cuvid als hevc_qsv pcm_f16le vc1_mmal amr_nb_at hevc_rkmpp pcm_f24le vc1_qsv amrnb hevc_v4l2m2m pcm_f32be vc1_v4l2m2m amrwb hnm4_video pcm_f32le vc1image amv hq_hqa pcm_f64be vcr1 anm hqx pcm_f64le vmdaudio ansi huffyuv pcm_lxf vmdvideo ape hymt pcm_mulaw vmnc apng iac pcm_mulaw_at vorbis aptx idcin pcm_s16be vp3 aptx_hd idf pcm_s16be_planar vp4 arbc iff_ilbm pcm_s16le vp5 ass ilbc pcm_s16le_planar vp6 asv1 ilbc_at pcm_s24be vp6a asv2 imc pcm_s24daud vp6f atrac1 imm4 pcm_s24le vp7 atrac3 imm5 pcm_s24le_planar vp8 atrac3al indeo2 pcm_s32be vp8_cuvid atrac3p indeo3 pcm_s32le vp8_mediacodec atrac3pal indeo4 pcm_s32le_planar vp8_qsv atrac9 indeo5 pcm_s64be vp8_rkmpp aura interplay_acm pcm_s64le vp8_v4l2m2m aura2 interplay_dpcm pcm_s8 vp9 avrn interplay_video pcm_s8_planar vp9_cuvid avrp jacosub pcm_u16be vp9_mediacodec avs jpeg2000 pcm_u16le vp9_qsv avui jpegls pcm_u24be vp9_rkmpp ayuv jv pcm_u24le vp9_v4l2m2m bethsoftvid kgv1 pcm_u32be vplayer bfi kmvc pcm_u32le vqa bink lagarith pcm_u8 wavpack binkaudio_dct libaom_av1 pcm_vidc wcmv binkaudio_rdft libaribb24 pcx webp bintext libcelt pgm webvtt bitpacked libcodec2 pgmyuv wmalossless bmp libdav1d pgssub wmapro bmv_audio libdavs2 pictor wmav1 bmv_video libfdk_aac pixlet wmav2 brender_pix libgsm pjs wmavoice c93 libgsm_ms png wmv1 cavs libilbc ppm wmv2 ccaption libopencore_amrnb prores wmv3 cdgraphics libopencore_amrwb prosumer wmv3_crystalhd cdtoons libopenh264 psd wmv3image cdxl libopenjpeg ptx wnv1 cfhd libopus qcelp wrapped_avframe cinepak librsvg qdm2 ws_snd1 clearvideo libspeex qdm2_at xan_dpcm cljr libvorbis qdmc xan_wc3 cllc libvpx_vp8 qdmc_at xan_wc4 comfortnoise libvpx_vp9 qdraw xbin cook libzvbi_teletext qpeg xbm cpia loco qtrle xface cscd lscr r10k xl cyuv m101 r210 xma1 dca mace3 ra_144 xma2 dds mace6 ra_288 xpm derf_dpcm magicyuv ralf xsub dfa mdec rasc xwd dirac metasound rawvideo y41p dnxhd microdvd realtext ylc dolby_e mimic rl2 yop dpx mjpeg roq yuv4 dsd_lsbf mjpeg_cuvid roq_dpcm zero12v dsd_lsbf_planar mjpeg_qsv rpza zerocodec dsd_msbf mjpegb rscc zlib dsd_msbf_planar mlp rv10 zmbv dsicinaudio mmvideo rv20 dsicinvideo motionpixels rv30 dss_sp movtext rv40-
接下我們可以嘗試輸入:./configure --list-encoders 查看所有編碼器
-
接下我們可以嘗試輸入:./configure --list-filters 查看所有濾鏡器
- 接下我們可以嘗試輸入:./configure --list-muxers 查看FFmpeg的封裝,封裝Muxing是指將壓縮后的編碼封裝到一個容器格式中,我們輸入./configure --list-muxers 來查看FFmpeg支持哪些容器格式:
從上面打印信息來看,FFmpeg支持生成裸流文件,如H.264,AAC, PCM, 也支持一些常見的格式,如MP3, MP4, FLV, M3U8, WEBM等
- 接下我們可以嘗試輸入:./configure --list-demuxers 查看FFmpeg的解封裝。
FFmpeg的解封裝(Demuxing)是指將讀入的容器格式拆解開,將里面的壓縮的音頻流,視頻流,字幕流,數據流等提取出來。
從上面解封裝又稱為解復用格式的支持信息中可以看到,FFmpeg支持的demuxter非常多,包含圖片image, MP3, FLV, MP4, MOV, AVI等
- 接下我們可以嘗試輸入:./configure --list-protocols 查看FFmpeg的流媒體協議。(FFmpeg不僅僅支持本地的多媒體處理,而且還支持網絡流媒體的處理):
從支持的協議列表中可以看到,FFmpeg支持的流媒體協議比較多,包括MMS, HTTP, HTTPS, HLS, RTMP, RTP,甚至支持TCP,UDP,其也支持使用file協議的本地文件操作和使用concat協議支持的多個文件串流操作。
-
接下我們可以嘗試輸入:./configure --list-hwaccels 查看FFmpeg支持的硬件加速器
-
接下我們可以嘗試輸入:./configure --list-parsers 查看FFmpeg支持的解析器
- 接下我們可以嘗試輸入:./configure --list-bsfs 查看FFmpeg支持的字節流過濾器
-
接下我們可以嘗試輸入:./configure --list-indevs 查看有效的輸入設備
-
接下我們可以嘗試輸入:./configure --list-outdevs 查看有效的輸出設備
參考書籍: -
FFmpeg從入門到精通
-
音視頻開發進階指南:基于Android與iOS平臺的實踐
總結
以上是生活随笔為你收集整理的FFmpeg学习(一)开篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Guns5.1版本多数据源配置问题
- 下一篇: python毕业设计 机器视觉驾驶人脸疲