FFmpeg学习(一)开篇
文章目錄
- FFmpeg學(xué)習(xí)(一)開篇
- 為什么要學(xué)習(xí)FFmpeg
- 1. FFmpeg簡介
- 2. FFmpeg能做什么
- 3. FFmpeg架構(gòu)模塊組成
- 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學(xué)習(xí)(一)開篇
為什么要學(xué)習(xí)FFmpeg
本人希望打算深入研究音視頻領(lǐng)域,音視頻領(lǐng)域的內(nèi)容很多,我自己打算從幾方面循序漸進(jìn):FFmpeg常用功能實(shí)踐, FFmpeg源碼研究, OpenGL, OpenGLES, Metal, AR, WebRTC, 直播架構(gòu)等方向去研究。
音視頻目前主要有哪些應(yīng)用場景呢?
- 直播類:音視頻會議,教育直播,娛樂/游戲直播等 (例如花椒,映客,騰訊課堂,騰訊會議, 斗魚)
- 短視頻:抖音,快手,小咖秀等, 這類應(yīng)用主要是對聲音和視頻做特殊處理,如聲音變聲,變調(diào),男聲變女聲,女聲變童聲;如視頻處理有:美顏,濾鏡處理。
- 網(wǎng)絡(luò)視頻: 優(yōu)酷,騰訊視頻,愛奇藝等。
- 音視頻通話:微信,QQ, Skype等。
- 視頻監(jiān)控: 網(wǎng)絡(luò)攝像機(jī)IPC等
- 人工智能:人臉識別,智能音箱等,這類應(yīng)用更關(guān)注于算法。
從上面這么多應(yīng)用場景,我們可以看出音視頻技術(shù)是多么重要,特別是5G時(shí)代,網(wǎng)絡(luò)傳輸問題大大提升,更多的音視頻需求會爆發(fā)出來。
我們可以看一下一個(gè)簡單播放器的架構(gòu),如下圖:
音頻解碼,視頻解碼一般都用FFmpeg解碼,在IOS8 之后提供了VideoToolBox框架支持硬解碼。
而視頻渲染一般使用OpenGL直接用GPU渲染,視頻渲染第三方框架有GPUImage, SDL, VLC
音頻視頻播放涉及到音視頻同步是一個(gè) 復(fù)雜的技術(shù)。
學(xué)習(xí)一個(gè)技術(shù),需要一個(gè)高效的方法,只有不斷的實(shí)踐才能理解深刻。學(xué)習(xí)FFmpeg我們也需要好的文檔來學(xué)習(xí),下面列舉一些必備的學(xué)習(xí)文檔地址:
- FFmpeg官方文檔:http://ffmpeg.org/documentation.html
- FFmpeg官方wiki: https://trac.ffmpeg.org
上述都是英文的文檔,如果英文學(xué)習(xí)困難,可以參考下面的中文資料:
- 雷霄驊博士總結(jié)的資料: http://blog.csdn.net/leixiaohua1020
- 羅索實(shí)驗(yàn)室:http://www.rosoo.net
- ChinaFFmpeg: http://bbs/chinaffmpeg.com
此外推薦兩本非常好的書籍:
- FFmpeg從入門到精通
- 音視頻開發(fā)進(jìn)階指南:基于Android與iOS平臺的實(shí)踐
1. FFmpeg簡介
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。
FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開發(fā)人員都來自MPlayer項(xiàng)目,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。項(xiàng)目的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"
- 一個(gè)偉大的軟件產(chǎn)生必定有它的一段傳奇歷史,FFmpeg的創(chuàng)建者是法國天才程序員Fabrice Bellard (法布里斯*貝拉)在 2000年是開發(fā)出初版;
法布里斯*貝拉:
-
2004年,邁克爾(Michael Niedermayer)接管FFmpeg, 邁克爾將濾鏡子系統(tǒng)libavfilter 加入FFmepg項(xiàng)目中,使得FFmpeg的多媒體處理更加多樣,更加方便。在FFmpeg發(fā)布了0.5版本后,很長一段時(shí)間沒有進(jìn)行新版本的發(fā)布,直到后來FFmpeg采用Git作為版本控制服務(wù)器以后才開始繼續(xù)更新發(fā)布版本。
-
2011年3月, 由于FFmpeg項(xiàng)目中有一些提交者對FFmpeg的項(xiàng)目管理方式和發(fā)展方向不一致,FFmpeg團(tuán)隊(duì)分成了兩派,其中一派認(rèn)為FFmpeg應(yīng)該更加專注于音視頻開發(fā),研究更新先進(jìn)的音視頻技術(shù),這些人重新創(chuàng)建了一個(gè)新的項(xiàng)目叫Libav。 另外一派認(rèn)為他們要兼顧老的FFmpeg技術(shù),然后逐步發(fā)展。
-
2015年8月邁克爾主動辭去FFmpeg項(xiàng)目負(fù)責(zé)人的職務(wù)。邁克爾從Libav中移植了大量的代碼和功能到FFmpegZhong , 從此Libav又和FFmpeg合并一起發(fā)展。
2. FFmpeg能做什么
- 多媒體視頻處理工具FFmpeg有非常強(qiáng)大的功能包括視頻采集功能、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印等
- 視頻采集功能:
ffmpeg視頻采集功能非常強(qiáng)大,不僅可以采集視頻采集卡或USB攝像頭的圖像,還可以進(jìn)行屏幕錄制,同時(shí)還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務(wù)器,支持直播應(yīng)用。
- 視頻格式轉(zhuǎn)換功能:
- 視頻截圖功能:
3. FFmpeg架構(gòu)模塊組成
我們先看一下一張F(tuán)Fmpeg的架構(gòu)圖:
下載好的源碼,我們也可以看到大概的源碼結(jié)構(gòu):
3. 1 libavutil
- libavutil : 包含一些公共的工具函數(shù);
AVUtil是FFmepg的核心工具庫,該模塊是最基礎(chǔ)的模塊之一,下面的許多其他模塊都會依賴該庫做一些基本的音視頻處理操作。
3. 2 libavformat
- libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能;
- AVFormat 是文件格式和協(xié)議庫,封裝了Protocol層和Demuxer,Muxer層,使得協(xié)議和格式對于開發(fā)者來說是透明的。AVFormat中實(shí)現(xiàn)了目前多媒體領(lǐng)域中的絕大多數(shù)媒體封裝格式,包括封裝和解封裝,如MP4, FLV, KV, TS 等文件封裝格式, RTMP, RTSP, MMS, HLS 等網(wǎng)絡(luò)協(xié)議封裝格式。
FFmpeg是否支持某種媒體封裝格式,取決于編譯時(shí)是否包含了該格式的封裝庫。根據(jù)實(shí)際需求,可進(jìn)行媒體封裝格式的擴(kuò)展,增加自己定制的封裝格式,即在AVFormat中增加自己的封裝處理模塊。
3. 3 libavcodec
- libavcodec:用于各種類型聲音/圖像編解碼;
AVCodec是編解碼庫,該模塊封裝了Codec層,但是有一些Codec是具備自己的License的,FFmpeg是不會默認(rèn)添加像libx264,FDK-AAC,lame等庫的,但是FFmpeg就像一個(gè)平臺一樣,可以將其他的第三方的Codec以插件的方式添加進(jìn)來,然后為開發(fā)者提供統(tǒng)一的接口。
AVCodec中實(shí)現(xiàn)了目前多媒體絕大多數(shù)的編解碼格式,既支持編碼,也支持解碼。
AVCodec除了支持MPEG4,AAC, MJPEG等自帶的媒體編解碼格式之外,還支持第三方的編解碼器,如H.264(AVC)編碼,需要使用x264編碼器; H.265(HEVC)編碼,需要使用x265編碼器; MP3(mp3lame)編碼,需要使用libmp3lame編碼器。如果希望增加自己的編碼格式,或者硬件編解碼,則需要在AVCodec中增加相應(yīng)的編解碼模塊。
3. 4 libavfilter
- AVFilter : 是音視頻濾鏡庫,該模塊提供了包括音頻特性和視頻特效的處理,在使用FFmpeg的API進(jìn)行編解碼的過程中,直接使用該模塊為音視頻數(shù)據(jù)做特效處理時(shí)非常方便同時(shí)也非常高效的一種方式。
3. 5 libavdevice
- AVDevice : 輸入輸出設(shè)備,比如,需要編譯出播放聲音或者視頻的工具ffplay,就需要確保該模塊是打開的,同時(shí)也需要libSDL的預(yù)先編譯,因?yàn)樵撛O(shè)備模塊播放聲音與播放視頻使用的都是libSDL庫。
3. 6 libswscale
- libswscale : 用于視頻場景比例縮放、色彩映射轉(zhuǎn)換;
SWScale 模塊是將圖像進(jìn)行格式轉(zhuǎn)換的模塊,例如,可以將YUV的數(shù)據(jù)轉(zhuǎn)換為RGB的數(shù)據(jù)。
3. 7 libpostproc
- libpostproc : 用于后期效果處理;
- PostProc模塊用來進(jìn)行后期處理,當(dāng)我們使用AVFilter的時(shí)候需要打開該模塊的開關(guān),因?yàn)镕ilter中會使用到該模塊的一些基礎(chǔ)函數(shù)。如果是比較老的FFmpeg版本,那么有可能還會編譯處理avresample模塊,該模塊其實(shí)也是用于對音頻原始數(shù)據(jù)進(jìn)行重采樣,但是現(xiàn)在已經(jīng)被廢棄了,不再推薦使用該庫,而是使用swrresample庫進(jìn)行替代。
3. 8 libswrressample
- SwrRessample 模塊可用于音頻重采樣,可以對數(shù)字音頻進(jìn)行聲道數(shù),數(shù)據(jù)格式,采樣率等多種基本信息的轉(zhuǎn)換。
3. 9 ffmpeg
- ffmpeg : 該項(xiàng)目提供的一個(gè)工具,可用于格式轉(zhuǎn)換、解碼或電視卡即時(shí)編碼等;
3. 10 ffsever
- ffsever : 一個(gè) HTTP 多媒體即時(shí)廣播串流服務(wù)器;
3. 11 ffplay
- ffplay : 是一個(gè)簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
4. FFmpeg安裝
- 從git 下載源碼:
-
下載源碼后,我們可以查看一下目錄結(jié)構(gòu):
-
輸入./configure --help 命令查看配置信息
-
內(nèi)容太多需要分頁,輸入./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是指將壓縮后的編碼封裝到一個(gè)容器格式中,我們輸入./configure --list-muxers 來查看FFmpeg支持哪些容器格式:
從上面打印信息來看,FFmpeg支持生成裸流文件,如H.264,AAC, PCM, 也支持一些常見的格式,如MP3, MP4, FLV, M3U8, WEBM等
- 接下我們可以嘗試輸入:./configure --list-demuxers 查看FFmpeg的解封裝。
FFmpeg的解封裝(Demuxing)是指將讀入的容器格式拆解開,將里面的壓縮的音頻流,視頻流,字幕流,數(shù)據(jù)流等提取出來。
從上面解封裝又稱為解復(fù)用格式的支持信息中可以看到,FFmpeg支持的demuxter非常多,包含圖片image, MP3, FLV, MP4, MOV, AVI等
- 接下我們可以嘗試輸入:./configure --list-protocols 查看FFmpeg的流媒體協(xié)議。(FFmpeg不僅僅支持本地的多媒體處理,而且還支持網(wǎng)絡(luò)流媒體的處理):
從支持的協(xié)議列表中可以看到,FFmpeg支持的流媒體協(xié)議比較多,包括MMS, HTTP, HTTPS, HLS, RTMP, RTP,甚至支持TCP,UDP,其也支持使用file協(xié)議的本地文件操作和使用concat協(xié)議支持的多個(gè)文件串流操作。
-
接下我們可以嘗試輸入:./configure --list-hwaccels 查看FFmpeg支持的硬件加速器
-
接下我們可以嘗試輸入:./configure --list-parsers 查看FFmpeg支持的解析器
- 接下我們可以嘗試輸入:./configure --list-bsfs 查看FFmpeg支持的字節(jié)流過濾器
-
接下我們可以嘗試輸入:./configure --list-indevs 查看有效的輸入設(shè)備
-
接下我們可以嘗試輸入:./configure --list-outdevs 查看有效的輸出設(shè)備
參考書籍: -
FFmpeg從入門到精通
-
音視頻開發(fā)進(jìn)階指南:基于Android與iOS平臺的實(shí)踐
總結(jié)
以上是生活随笔為你收集整理的FFmpeg学习(一)开篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Guns5.1版本多数据源配置问题
- 下一篇: python毕业设计 机器视觉驾驶人脸疲