FFmpeg学习(一)开篇

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是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPLGPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括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,AAC, 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, FLV, MP4, 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平台的实践

你可能感兴趣的:(FFmpeg学习(一)开篇)