FFmpeg學習(1)開篇
FFmpeg學習(一)開篇
為什麼要學習FFmpeg
本人希望打算深入研究音視訊領域,音視訊領域的內容很多,我自己打算從幾方面循序漸進:FFmpeg常用功能實踐, FFmpeg原始碼研究, OpenGL
,OpenGLES
,Metal
,AR
,WebRTC
,直播架構等方向去研究。
音視訊目前主要有哪些應用場景呢?
- 直播類:音視訊會議,教育直播,娛樂/遊戲直播等 (例如花椒,映客,騰訊課堂,騰訊會議, 鬥魚)
- 短視訊:抖音,快手,小咖秀等, 這類應用主要是對聲音和視訊做特殊處理,如聲音變聲,變調,男聲變女聲,女聲變童聲;如視訊處理有:美顏,濾鏡處理。
- 網路視訊: 優酷,騰訊視訊,愛奇藝等。
- 音視訊通話:微信,QQ, Skype等。
- 視訊監控: 網路攝像機IPC等
- 人工智慧:人臉識別,智慧音箱等,這類應用更關注於演演算法。
從上面這麼多應用場景,我們可以看出音視訊技術是多麼重要,特別是5G時代,網路傳輸問題大大提升,更多的音視訊需求會爆發出來。
我們可以看一下一個簡單播放器的架構,如下圖:
音訊解碼,視訊解碼一般都用FFmpeg解碼,在IOS8 之後提供了VideoToolBox框架支援硬解碼。
而視訊渲染一般使用OpenGL直接用GPU渲染,視訊渲染第三方框架有GPUImage,SDL,VLC
音訊視訊播放涉及到音視訊同步是一個 複雜的技術。
學習一個技術,需要一個高效的方法,只有不斷的實踐才能理解深刻。學習FFmpeg我們也需要好的檔案來學習,下面列舉一些必備的學習檔案地址:
上述都是英文的檔案,如果英文學習困難,可以參考下面的中文資料:
此外推薦兩本非常好的書籍:
- 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年是開發出初版;
法布里斯*貝拉:
- 高中就讀期間開發了著名的可執行壓縮程式LZEXE
- 2000年建立了FFmpeg專案
- 2011年,他用JavaScript寫了一個Linux虛擬機器器(JSLinux)
- 他還是QEMU,TinyCC 的作者
-
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
的流媒體伺服器,支援直播應用。
- 在Linux平臺上,
ffmpeg
對V4L2
的視訊裝置提供了很好的支援,如:./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp
以上命令表示:採集10秒鐘視訊,對video4linux2視訊裝置進行採集,採集QCIF(176*144)的視訊,每秒8幀,視訊裝置為/dev/video0,視訊編碼為H263,輸出格式為RTP,後面定義了IP地址及埠,將該碼流所對應的SDP檔案重定向到/tmp/ffmpeg.sdp中,將此SDP檔案上傳到流媒體伺服器就可以實現直播了。- 在windows下關於ffmpeg視訊採集的資料非常少,但是ffmpeg還是支援windows下視訊採集的。ffmpeg支援windows下video for windows(VFW)裝置的視訊採集,不過
VFW
裝置已經過時,正在被WDM
的視訊裝置所取代,但是ffmpeg還沒有支援WDM的計劃,不過好像有將WDM轉為VFW的工具,因此ffmpeg還是可以在windows下進行視訊採集的。
- 視訊格式轉換功能:
- ffmpeg視訊轉換功能。視訊格式轉換,比如可以將多種視訊格式轉換為flv格式,可不是視訊訊號轉換 。
- ffmpeg可以輕易地實現多種視訊格式之間的相互轉換(
wma
,rm
,avi
,mod
等),例如可以將攝錄下的視訊avi
等轉成視訊網站所採用的flv
格式。
- 視訊截圖功能:
- 對於選定的視訊,擷取指定時間的縮圖。視訊抓圖,獲取靜態圖和動態圖,不提倡抓
gif
檔案;因為抓出的gif
檔案大而播放不流暢。- 給視訊加水印功能
- 使用ffmpeg 視訊新增水印(
logo
)。
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 下載原始碼:
git clone https://gitfmpeg.org/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
檢視所有濾鏡器
abench colorhold il selectivecolor
abitscope colorkey inflate sendcmd
acompressor colorkey_opencl interlace separatefields
acontrast colorlevels interleave setdar
acopy colormatrix join setfield
acrossfade colorspace kerndeint setparams
acrossover compand ladspa setpts
acrusher compensationdelay lagfun setrange
acue concat lenscorrection setsar
addroi convolution lensfun settb
adeclick convolution_opencl libvmaf sharpness_vaapi
adeclip convolve life showcqt
adelay copy limiter showfreqs
aderivative coreimage loop showinfo
adrawgraph coreimagesrc loudnorm showpalette
aecho cover_rect lowpass showspatial
aemphasis crop lowshelf showspectrum
aeval cropdetect lumakey showspectrumpic
aevalsrc crossfeed lut showvolume
afade crystalizer lut1d showwaves
afftdn cue lut2 showwavespic
afftfilt curves lut3d shuffleframes
afifo datascope lutrgb shuffleplanes
afir dcshift lutyuv sidechaincompress
afirsrc dctdnoiz lv2 sidechaingate
aformat deband mandelbrot sidedata
agate deblock maskedclamp sierpinski
agraphmonitor decimate maskedmax signalstats
ahistogram deconvolve maskedmerge signature
aiir dedot maskedmin silencedetect
aintegral deesser maskedthreshold silenceremove
ainterleave deflate maskfun sinc
alimiter deflicker mcdeint sine
allpass deinterlace_qsv mcompand smartblur
allrgb deinterlace_vaapi median smptebars
allyuv dejudder mergeplanes smptehdbars
aloop delogo mestimate sobel
alphaextract denoise_vaapi metadata sobel_opencl
alphamerge derain midequalizer sofalizer
amerge deshake minterpolate spectrumsynth
ametadata deshake_opencl mix split
amix despill movie spp
amovie detelecine mpdecimate sr
amplify dilation mptestsrc ssim
amultiply dilation_opencl negate stereo3d
anequalizer displace nlmeans stereotools
anlmdn dnn_processing nlmeans_opencl stereowiden
anlms doubleweave nnedi streamselect
anoisesrc drawbox noformat subtitles
anull drawgraph noise super2xsai
anullsink drawgrid normalize superequalizer
anullsrc drawtext null surround
apad drmeter nullsink swaprect
aperms dynaudnorm nullsrc swapuv
aphasemeter earwax ocr tblend
aphaser ebur128 ocv telecine
apulsator edgedetect openclsrc testsrc
arealtime elbg oscilloscope testsrc2
aresample entropy overlay thistogram
areverse eq overlay_cuda threshold
arnndn equalizer overlay_opencl thumbnail
aselect erosion overlay_qsv thumbnail_cuda
asendcmd erosion_opencl overlay_vulkan tile
asetnsamples extractplanes owdenoise tinterlace
asetpts extrastereo pad tlut2
asetrate fade pad_opencl tmedian
asettb fftdnoiz pal100bars tmix
ashowinfo fftfilt pal75bars tonemap
asidedata field palettegen tonemap_opencl
asoftclip fieldhint paletteuse tonemap_vaapi
asplit fieldmatch pan tpad
asr fieldorder perms transpose
ass fifo perspective transpose_npp
astats fillborders phase transpose_opencl
astreamselect find_rect photosensitivity transpose_vaapi
asubboost firequalizer pixdesctest treble
atadenoise flanger pixscope tremolo
atempo flite pp trim
atrim floodfill pp7 unpremultiply
avectorscope format premultiply unsharp
avgblur fps prewitt unsharp_opencl
avgblur_opencl framepack prewitt_opencl uspp
avgblur_vulkan framerate procamp_vaapi v360
axcorrelate framestep program_opencl vaguedenoiser
azmq freezedetect pseudocolor vectorscope
bandpass freezeframes psnr vflip
bandreject frei0r pullup vfrdet
bass frei0r_src qp vibrance
bbox fspp random vibrato
bench gblur readeia608 vidstabdetect
bilateral geq readvitc vidstabtransform
biquad gradfun realtime vignette
bitplanenoise graphmonitor remap vmafmotion
blackdetect greyedge removegrain volume
blackframe haas removelogo volumedetect
blend haldclut repeatfields vpp_qsv
bm3d haldclutsrc replaygain vstack
boxblur hdcd resample w3fdif
boxblur_opencl headphone reverse waveform
bs2b hflip rgbashift weave
bwdif highpass rgbtestsrc xbr
cas highshelf roberts xfade
cellauto hilbert roberts_opencl xfade_opencl
channelmap histeq rotate xmedian
channelsplit histogram rubberband xstack
chorus hqdn3d sab yadif
chromaber_vulkan hqx scale yadif_cuda
chromahold hstack scale2ref yaepblur
chromakey hue scale_cuda yuvtestsrc
chromashift hwdownload scale_npp zmq
ciescope hwmap scale_qsv zoompan
codecview hwupload scale_vaapi zscale
color hwupload_cuda scale_vulkan
colorbalance hysteresis scroll
colorchannelmixer idet select
複製程式碼
- 接下我們可以嘗試輸入:
./configure --list-muxers
檢視FFmpeg的封裝,封裝Muxing是指將壓縮後的編碼封裝到一個容器格式中,我們輸入./configure --list-muxers
來檢視FFmpeg支援哪些容器格式:
H.264,PCM
,也支援一些常見的格式,如MP3,MP4,FLV,M3U8,WEBM
等
- 接下我們可以嘗試輸入:
./configure --list-demuxers
檢視FFmpeg的解封裝。 FFmpeg的解封裝(Demuxing)是指將讀入的容器格式拆解開,將裡面的壓縮的音訊流,視訊流,字幕流,資料流等提取出來。
aa filmstrip loas rsd
aac fits lrc rso
ac3 flac lvf rtp
acm flic lxf rtsp
act flv m4v s337m
adf fourxm matroska sami
adp frm mgsts sap
ads fsb microdvd sbc
adx fwse mjpeg sbg
aea g722 mjpeg_2000 scc
afc g723_1 mlp sdp
aiff g726 mlv sdr2
aix g726le mm sds
alp g729 mmf sdx
amr gdv mov segafilm
amrnb genh mp3 ser
amrwb gif mpc shorten
anm gsm mpc8 siff
apc gxf mpegps sln
ape h261 mpegts smacker
apm h263 mpegtsraw smjpeg
apng h264 mpegvideo smush
aptx hca mpjpeg sol
aptx_hd hcom mpl2 sox
aqtitle hevc mpsub spdif
argo_asf hls msf srt
asf hnm msnwc_tcp stl
asf_o ico mtaf str
ass idcin mtv subviewer
ast idf musx subviewer1
au iff mv sup
av1 ifv mvi svag
avi ilbc mxf swf
avisynth image2 mxg tak
avr image2_alias_pix nc tedcaptions
avs image2_brender_pix nistsphere thp
avs2 image2pipe nsp threedostr
bethsoftvid image_bmp_pipe nsv tiertexseq
bfi image_dds_pipe nut tmv
bfstm image_dpx_pipe nuv truehd
bink image_exr_pipe ogg tta
bintext image_gif_pipe oma tty
bit image_j2k_pipe paf txd
bmv image_jpeg_pipe pcm_alaw ty
boa image_jpegls_pipe pcm_f32be v210
brstm image_pam_pipe pcm_f32le v210x
c93 image_pbm_pipe pcm_f64be vag
caf image_pcx_pipe pcm_f64le vapoursynth
cavsvideo image_pgm_pipe pcm_mulaw vc1
cdg image_pgmyuv_pipe pcm_s16be vc1t
cdxl image_pictor_pipe pcm_s16le vividas
cine image_png_pipe pcm_s24be vivo
codec2 image_ppm_pipe pcm_s24le vmd
codec2raw image_psd_pipe pcm_s32be vobsub
concat image_qdraw_pipe pcm_s32le voc
dash image_sgi_pipe pcm_s8 vpk
data image_sunrast_pipe pcm_u16be vplayer
daud image_svg_pipe pcm_u16le vqf
dcstr image_tiff_pipe pcm_u24be w64
derf image_webp_pipe pcm_u24le wav
dfa image_xpm_pipe pcm_u32be wc3
dhav image_xwd_pipe pcm_u32le webm_dash_manifest
dirac ingenient pcm_u8 webvtt
dnxhd ipmovie pcm_vidc wsaud
dsf ircam pjs wsd
dsicin iss pmp wsvqa
dss iv8 pp_bnk wtv
dts ivf pva wv
dtshd ivr pvf wve
dv jacosub qcp xa
dvbsub jv r3d xbin
dvbtxt kux rawvideo xmv
dxa kvag realtext xvag
ea libgme redspark xwma
ea_cdata libmodplug rl2 yop
eac3 libopenmpt rm yuv4mpegpipe
epaf live_flv roq
ffmetadata lmlm4 rpl
複製程式碼
從上面解封裝又稱為解複用格式的支援資訊中可以看到,FFmpeg支援的demuxter非常多,包含圖片image,MP3,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平臺的實踐