1. 程式人生 > IOS開發 >FFmpeg學習(1)開篇

FFmpeg學習(1)開篇

FFmpeg學習(1)開篇

FFmpeg學習(2)原始碼編譯,環境配置

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是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPLGPL許可證。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多code都是從頭開發的。

FFmpegLinux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行,包括WindowsMac OS X等。這個專案最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer專案,而且當前FFmpeg也是放在MPlayer專案組的伺服器上。專案的名稱來自MPEG視訊編碼標準,前面的"FF"代表"Fast Forward"

  • 一個偉大的軟體產生必定有它的一段傳奇歷史,FFmpeg的建立者是法國天才程式設計師Fabrice Bellard (法布里斯*貝拉)在 2000年是開發出初版;

法布里斯*貝拉:

  1. 高中就讀期間開發了著名的可執行壓縮程式LZEXE
  2. 2000年建立了FFmpeg專案
  3. 2011年,他用JavaScript寫了一個Linux虛擬機器器(JSLinux)
  4. 他還是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的流媒體伺服器,支援直播應用。
  1. 在Linux平臺上,ffmpegV4L2的視訊裝置提供了很好的支援,如:./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檔案上傳到流媒體伺服器就可以實現直播了。
  2. 在windows下關於ffmpeg視訊採集的資料非常少,但是ffmpeg還是支援windows下視訊採集的。ffmpeg支援windows下video for windows(VFW)裝置的視訊採集,不過VFW裝置已經過時,正在被WDM的視訊裝置所取代,但是ffmpeg還沒有支援WDM的計劃,不過好像有將WDM轉為VFW的工具,因此ffmpeg還是可以在windows下進行視訊採集的。
  • 視訊格式轉換功能:
  1. ffmpeg視訊轉換功能。視訊格式轉換,比如可以將多種視訊格式轉換為flv格式,可不是視訊訊號轉換 。
  2. ffmpeg可以輕易地實現多種視訊格式之間的相互轉換(wma,rm,avi,mod等),例如可以將攝錄下的視訊avi等轉成視訊網站所採用的flv格式。
  • 視訊截圖功能:
  1. 對於選定的視訊,擷取指定時間的縮圖。視訊抓圖,獲取靜態圖和動態圖,不提倡抓gif檔案;因為抓出的gif檔案大而播放不流暢。
  2. 給視訊加水印功能
  3. 使用ffmpeg 視訊新增水印(logo)。

3. FFmpeg架構模組組成

我們先看一下一張FFmpeg的架構圖:

FFmpeg的架構圖

下載好的原始碼,我們也可以看到大概的原始碼結構:

原始碼結構

3. 1 libavutil

  • libavutil : 包含一些公共的工具函式; AVUtil是FFmepg的核心工具庫,該模組是最基礎的模組之一,下面的許多其他模組都會依賴該庫做一些基本的音視訊處理操作。

3. 2 libavformat

  • libavformat:用於各種音視訊封裝格式的生成和解析,包括獲取解碼所需資訊以生成解碼上下文結構和讀取音視訊幀等功能;
  • AVFormat 是檔案格式和協議庫,封裝了Protocol層和Demuxer,Muxer層,使得協議和格式對於開發者來說是透明的。AVFormat中實現了目前多媒體領域中的絕大多數媒體封裝格式,包括封裝和解封裝,如MP4FLVKVTS 等檔案封裝格式, RTMPRTSPMMSHLS 等網路協議封裝格式。

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
複製程式碼

從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支援哪些容器格式:

檢視FFmpeg支援哪些容器格式
從上面列印資訊來看,FFmpeg支援生成裸流檔案,如H.264,PCM,也支援一些常見的格式,如MP3,MP4,FLV,M3U8,WEBM

  • 接下我們可以嘗試輸入:./configure --list-demuxers 檢視FFmpeg的解封裝。 FFmpeg的解封裝(Demuxing)是指將讀入的容器格式拆解開,將裡面的壓縮的音訊流,視訊流,字幕流,資料流等提取出來。

檢視FFmpeg的解封裝

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的流媒體協議

從支援的協議列表中可以看到,FFmpeg支援的流媒體協議比較多,包括MMS,HTTP,HTTPS,HLS,RTMP,RTP,甚至支援TCPUDP,其也支援使用file協議的本地檔案操作和使用concat協議支援的多個檔案串流操作。

  • 接下我們可以嘗試輸入:./configure --list-hwaccels 檢視FFmpeg支援的硬體加速器

    檢視FFmpeg支援的硬體加速器

  • 接下我們可以嘗試輸入:./configure --list-parsers 檢視FFmpeg支援的解析器

檢視FFmpeg支援的解析器

  • 接下我們可以嘗試輸入:./configure --list-bsfs 檢視FFmpeg支援的位元組流過濾器

檢視FFmpeg支援的位元組流過濾器

  • 接下我們可以嘗試輸入:./configure --list-indevs 檢視有效的輸入裝置

    檢視有效的輸入裝置

  • 接下我們可以嘗試輸入:./configure --list-outdevs 檢視有效的輸出裝置

    在這裡插入圖片描述
    參考書籍:

  • FFmpeg從入門到精通

  • 音視訊開發進階指南:基於Android與iOS平臺的實踐