赞
踩
1 FFmpeg从入门到精通-FFmpeg简介
2 FFmpeg从入门到精通-FFmpeg工具使用基础
3 FFmpeg从入门到精通-FFmpeg转封装
4 FFmpeg从入门到精通-FFmpeg转码
5 FFmpeg从入门到精通-FFmpeg流媒体
6 FFmpeg从入门到精通-FFmpeg滤镜使用
7 FFmpeg从入门到精通-FFmpeg中Linux设备操作
8 FFmpeg从入门到精通-FFmpeg接口libavformat的使用
9 FFmpeg从入门到精通-FFmpeg接口libavcodec的使用
10 FFmpeg从入门到精通-FFmpeg接口libavfilter的使用
FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
想要深入了解一个软件、一个系统,首先要了解其发展史,下面就来介绍一下FFmpeg的整体发展过程。
作为一套开源的音视频编解码套件,FFmpeg可以通过互联网自由获取。FFmpeg的源码Git库提供了多站同步的获取方式,具体如下。
·git://source.ffmpeg.org/ffmpeg.git
·http://git.videolan.org/?p=ffmpeg.git
·https://github.com/FFmpeg/FFmpeg
FFmpeg发展至今,已经被许多开源项目所采用,如ijkplayer、ffmpeg2theora、VLC、MPlayer、HandBrake、Blender、Google Chrome等。DirectShow/VFW的ffdshow(外部工程)和QuickTime的Perian(外部工程)也采用了FFmpeg。由于FFmpeg是在LGPL/GPL协议下发布的(如果使用了GPL协议发布的模块则必须采用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL/GPL协议。
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构如图1-1所示。
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。我们参考下面这个滤镜处理的例子,如图1-2所示。
图1-2所示样例中的滤镜处理将输入的视频切割成了两部分流,一部分流抛给crop滤镜与vflip滤镜处理模块进行操作,另一部分保持原样,当crop滤镜与vflip滤镜处理操作完成之后,将流合并到原有的overlay图层中,并显示在最上面一层,输出新的视频。对应的命令行如下:
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
ffmpeg -i 1.jpg -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" 2.jpg
下面看一下具体的执行情况,以验证该命令的可行性:
ffmpeg version 2022-11-23-git-c8e9cc8d20-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12.1.0 (Rev2, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 57. 43.100 / 57. 43.100 libavcodec 59. 54.100 / 59. 54.100 libavformat 59. 34.102 / 59. 34.102 libavdevice 59. 8.101 / 59. 8.101 libavfilter 8. 50.101 / 8. 50.101 libswscale 6. 8.112 / 6. 8.112 libswresample 4. 9.100 / 4. 9.100 libpostproc 56. 7.100 / 56. 7.100 Input #0, image2, from '1.jpg': Duration: 00:00:00.04, start: 0.000000, bitrate: 4804 kb/s Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 360x320 [SAR 1:1 DAR 9:8], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native)) Press [q] to stop, [?] for help [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b1fd6ac0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b1ff2340] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b200d440] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b239cac0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23af840] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23cdf00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23e97c0] deprecated pixel format used, make sure you did set range correctly Last message repeated 1 times [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23c5f00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b20018c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b200e8c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b1fd6d00] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23900c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b239d080] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b1fd6140] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23900c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b239d080] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23e97c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23f67c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b2009900] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b1fc7540] [swscaler @ 000001b4b23ba080] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b1fc7540] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b1fd6140] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b23e97c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b23f67c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b1fe3b40] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b23900c0] deprecated pixel format used, make sure you did set range correctly [swscaler @ 000001b4b2009900] [swscaler @ 000001b4b23a1080] deprecated pixel format used, make sure you did set range correctly Output #0, image2, to '2.jpg': Metadata: encoder : Lavf59.34.102 Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown, progressive), 360x320 [SAR 1:1 DAR 9:8], q=2-31, 200 kb/s, 25 fps, 25 tbn Metadata: encoder : Lavc59.54.100 mjpeg Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A [image2 @ 000001b4b1f65a40] The specified filename '2.jpg' does not contain an image sequence pattern or a pattern is invalid. [image2 @ 000001b4b1f65a40] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image. frame= 1 fps=0.0 q=4.7 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x video:11kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
以上内容输出完成,该命令将自动退出,生成的视频结果是保留视频的上半部分,同时上半部分会镜像到视频的下半部分,二者合成之后作为输出视频,如图1-3所示。
下面详细说明一下规则,具体如下。
·相同的Filter线性链之间用逗号分隔
·不同的Filter线性链之间用分号分隔
在以上示例中,crop与vflip使用的是同一个滤镜处理的线性链,split滤镜和overlay滤镜使用的是另外一个线性链,一个线性链与另一个线性链汇合时是通过方括号“[]”括起来的标签进行标示的。在这个例子中,两个流处理后是通过[main]与[flip]进行关联汇合的。
split滤镜将分割后的视频流的第二部分打上标签[tmp],通过crop滤镜对该部分流进行处理,然后进行纵坐标调换操作,打上标签[flip],然后将[main]标签与[flip]标签进行合并,[flip]标签的视频流从视频的左边最中间的位置开始显示,这样就出现了镜像效果,如上图所示。
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像格式转换。
swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频通道布局转换与布局调整。
ffmpeg是FFmpeg源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。本节将通过实际的示例分析,对ffmpeg编解码工具的使用方法进行详细的介绍。
首先列举一个简单的例子:
ffmpeg -i input.mp4 output.avi
这条命令行执行过程输出如下:
ffmpeg version 2022-11-23-git-c8e9cc8d20-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12.1.0 (Rev2, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 57. 43.100 / 57. 43.100 libavcodec 59. 54.100 / 59. 54.100 libavformat 59. 34.102 / 59. 34.102 libavdevice 59. 8.101 / 59. 8.101 libavfilter 8. 50.101 / 8. 50.101 libswscale 6. 8.112 / 6. 8.112 libswresample 4. 9.100 / 4. 9.100 libpostproc 56. 7.100 / 56. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf54.6.100 Duration: 00:04:13.00, start: 0.000000, bitrate: 511 kb/s Stream #0:0[0x1](und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 505 kb/s, 5 fps, 5 tbr, 5 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 3 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:0 -> #0:0 (mpeg4 (native) -> mpeg4 (native)) Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help Output #0, avi, to 'output.avi': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 ISFT : Lavf59.34.102 Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 5 fps, 5 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] encoder : Lavc59.54.100 mpeg4 Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A Stream #0:1(und): Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, fltp (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] encoder : Lavc59.54.100 libmp3lame frame= 1265 fps=426 q=31.0 Lsize= 10729kB time=00:04:12.80 bitrate= 347.7kbits/s speed=85.1x video:6512kB audio:3950kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.554561%
这是一条简单的ffmpeg命令,可以看到,ffmpeg通过-i参数将input.mp4作为输入源输入,然后进行转码与转封装操作,输出到output.avi中,这条命令主要做了如下工作。
1)获得输入源input.mp4。
2)转码。
3)输出文件output.avi。
看似简单的两步主要的工作,其实远远不止是从后缀名为MP4的文件输出成后缀名为AVI的文件,因为在ffmpeg中,MP4与AVI是两种文件封装格式,并不是后缀名就可以决定的,例如上面的命令行同样可以写成这样:
ffmpeg -i input.mp4 -f avi output.dat
这条命令行执行过程输出如下:
ffmpeg version 2022-11-23-git-c8e9cc8d20-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12.1.0 (Rev2, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 57. 43.100 / 57. 43.100 libavcodec 59. 54.100 / 59. 54.100 libavformat 59. 34.102 / 59. 34.102 libavdevice 59. 8.101 / 59. 8.101 libavfilter 8. 50.101 / 8. 50.101 libswscale 6. 8.112 / 6. 8.112 libswresample 4. 9.100 / 4. 9.100 libpostproc 56. 7.100 / 56. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf54.6.100 Duration: 00:04:13.00, start: 0.000000, bitrate: 511 kb/s Stream #0:0[0x1](und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 505 kb/s, 5 fps, 5 tbr, 5 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 3 kb/s (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] Stream mapping: Stream #0:0 -> #0:0 (mpeg4 (native) -> mpeg4 (native)) Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help Output #0, avi, to 'output.dat': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 ISFT : Lavf59.34.102 Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 5 fps, 5 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] encoder : Lavc59.54.100 mpeg4 Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A Stream #0:1(und): Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, fltp (default) Metadata: handler_name : SoundHandler vendor_id : [0][0][0][0] encoder : Lavc59.54.100 libmp3lame frame= 1265 fps=431 q=31.0 Lsize= 10729kB time=00:04:12.80 bitrate= 347.7kbits/s speed=86.2x video:6512kB audio:3950kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.554561%
这条ffmpeg命令相对于前面的那条命令做了一些改变,加了一个“-f”进行约束,“-f”参数的工作非常重要,它制定了输出文件的容器格式,所以可以看到输出的文件为output.dat,文件后缀名为.dat,但是其主要工作依然与之前的指令相同。
分析以上两个输出信息中的Output#0部分,可以看到输出的都是AVI,只是输出的文件名不同,其他内容均相同。
ffmpeg的主要工作流程相对比较简单,具体如下。
1)解封装(Demuxing)。
2)解码(Decoding)。
3)编码(Encoding)。
4)封装(Muxing)。
其中需要经过6个步骤,具体如下。
1)读取输入源。
2)进行音视频的解封装。
3)解码每一帧音视频数据。
4)编码每一帧音视频数据。
5)进行音视频的重新封装。
6)输出到目标。
ffmpeg整体处理的工作流程与步骤如图1-4所示。
从图1-4所示的工作流程可以看出,ffmpeg首先读取输入源;然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;接下来通过Decoder进行解码,将音视频通过Decoder解包成为YVU或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口来实现;接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流。
FFmpeg不但可以提供转码、转封装等功能,同时还提供了播放器相关功能,使用FFmpeg的avformat与avcodec,可以播放各种媒体文件或者流。如果想要使用ffplay,那么系统首先需要有SDL来进行ffplay的基础支撑。
ffplay是FFmpeg源代码编译后生成的另一个可执行程序,与ffmpeg在FFmpeg项目中充当的角色基本相同,可以作为测试工具进行使用,ffplay提供了音视频显示和播放相关的图像信息、音频的波形信息等。
注意:
有时通过源代码编译生成ffplay不一定能够成功,因为ffplay在旧版本时依赖于SDL-1.2,而ffplay在新版本时依赖于SDL-2.0,需要安装对应的SDL才能生成ffplay。
ffprobe也是FFmpeg源码编译后生成的一个可执行程序。ffprobe是一个非常强大的多媒体分析工具,可以从媒体文件或者媒体流中获得你想要了解的媒体信息,比如音频的参数、视频的参数、媒体容器的参数信息等。
例如它可以帮助分析某个媒体容器中的音频是什么编码格式、视频是什么编码格式,同时还可以得到媒体文件中媒体的总时长、复合码率等信息。
使用ffprobe可以分析媒体文件中每个包的长度、包的类型、帧的信息等。后面章节将会对ffprobe进行详细的介绍,下面列举一个简单的例子,以对ffprobe有一个基本的概念:
ffprobe –show_streams input.mp4
命令行执行之后将会输出如下内容:
[STREAM] index=0 codec_name=mpeg4 codec_long_name=MPEG-4 part 2 profile=Simple Profile codec_type=video codec_tag_string=mp4v codec_tag=0x7634706d width=1280 height=720 coded_width=1280 coded_height=720 closed_captions=0 film_grain=0 has_b_frames=0 sample_aspect_ratio=1:1 display_aspect_ratio=16:9 pix_fmt=yuv420p level=3 color_range=unknown color_space=unknown color_transfer=unknown color_primaries=unknown chroma_location=left field_order=unknown refs=1 quarter_sample=false divx_packed=false id=0x1 r_frame_rate=5/1 avg_frame_rate=5/1 time_base=1/5 start_pts=0 start_time=0.000000 duration_ts=1265 duration=253.000000 bit_rate=505923 max_bit_rate=N/A bits_per_raw_sample=N/A nb_frames=1265 nb_read_frames=N/A nb_read_packets=N/A extradata_size=43 DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 DISPOSITION:comment=0 DISPOSITION:lyrics=0 DISPOSITION:karaoke=0 DISPOSITION:forced=0 DISPOSITION:hearing_impaired=0 DISPOSITION:visual_impaired=0 DISPOSITION:clean_effects=0 DISPOSITION:attached_pic=0 DISPOSITION:timed_thumbnails=0 DISPOSITION:captions=0 DISPOSITION:descriptions=0 DISPOSITION:metadata=0 DISPOSITION:dependent=0 DISPOSITION:still_image=0 TAG:language=und TAG:handler_name=VideoHandler TAG:vendor_id=[0][0][0][0] [/STREAM] [STREAM] index=1 codec_name=aac codec_long_name=AAC (Advanced Audio Coding) profile=LC codec_type=audio codec_tag_string=mp4a codec_tag=0x6134706d sample_fmt=fltp sample_rate=44100 channels=2 channel_layout=stereo bits_per_sample=0 initial_padding=0 id=0x2 r_frame_rate=0/0 avg_frame_rate=0/0 time_base=1/44100 start_pts=0 start_time=0.000000 duration_ts=11146240 duration=252.749206 bit_rate=3101 max_bit_rate=N/A bits_per_raw_sample=N/A nb_frames=10886 nb_read_frames=N/A nb_read_packets=N/A extradata_size=2 DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 DISPOSITION:comment=0 DISPOSITION:lyrics=0 DISPOSITION:karaoke=0 DISPOSITION:forced=0 DISPOSITION:hearing_impaired=0 DISPOSITION:visual_impaired=0 DISPOSITION:clean_effects=0 DISPOSITION:attached_pic=0 DISPOSITION:timed_thumbnails=0 DISPOSITION:captions=0 DISPOSITION:descriptions=0 DISPOSITION:metadata=0 DISPOSITION:dependent=0 DISPOSITION:still_image=0 TAG:language=und TAG:handler_name=SoundHandler TAG:vendor_id=[0][0][0][0] [/STREAM]
根据输出内容可以看到,使用ffprobe能够查看MP4文件容器中的流的信息,其包含了一个视频流,由于该文件中只有视频流,流相关的信息是通过[STREAM][/STREAM]的方式展现出来的,在[STREAM]与[/STREAM]之间的信息即为该MP4文件的视频流信息。当视频文件容器中包含音频流与视频流或者更多路流时,会通过[STREAM]与[/STREAM]进行多个流的分隔,分隔后采用index来进行流的索引信息的区分。
FFmpeg在官方网站中提供了已经编译好的可执行文件。因为FFmpeg是开源的,所以也可以根据自己的需要进行手动编译。FFmpeg官方建议用户自行编译使用FFmpeg的最新版本,因为对于一些操作系统,比如Linux系统(无论是Ubuntu还是RedHat),如果使用系统提供的软件库安装ffmpeg时会发现其版本相对比较老旧,比如使用apt-get install ffmpeg或者yum install ffmpeg安装ffmpeg,那么默认支持的版本都很老,有些新的功能并不支持,如一些新的封装格式或者通信协议。
FFmpeg在Windows平台中的编译需要使用MinGW-w64,如果不希望使用MinGW而使用Visual Studio的话,则需要消耗很多时间来支持Visual Studio平台,感兴趣的读者可以在网上查找一下支持的方法。截至本书结稿之时,官方提供的Windows的开发包是使用MinGW-w64工具链编写的。
MinGW-w64单独使用起来会比较麻烦,但是其可以与MSYS环境配合使用,其主要完成的工作为UNIX on Windows的功能。显而易见,这是一个仿生UNIX环境的Windows工具集,它的详细介绍和使用方法可以参照http://www.mingw.org/wiki/MSYS。
MinGW-w64+MSYS环境准备好之后,我们就可以正式进入编译的环节了。
1)进入FFmpeg源码目录,执行“./configure”,如果一切正常,我们会看到如下信息:
2)configure成功后执行make,在MinGW环境下编译ffmpeg是一个比较漫长的过程。
3)执行make install,到此为止,FFmpeg在Windows上的编译已全部完成,此时我们可以尝试使用FFmpeg命令行来验证编译结果。执行“./ffmpeg.exe–h”:
注意:
以上编译配置方式编译出来的ffmpeg仅仅只是最简易的ffmpeg,并没有H.264、H.265、加字幕等编码支持,如果需要支持更多的模块和参数,还需要进行更加详细的定制,后面会有详细的介绍。也可自行搜索。
附录1.Windows下MSVC编译FFmpeg
前面介绍过,很多Linux的发行版本源中已经包含了FFmpeg,如Ubuntu/Fedora的镜像源中包含了FFmpeg的安装包,但是版本相对来说比较老旧,有些甚至还不支持H.264、H.265编码,或者不支持RTMP等,为了支持这些协议格式和编码格式,需要自己手动编译FFmpeg,默认编译FFmpeg的时候,需要用到yasm汇编器对FFmpeg中的汇编部分进行编译。也可自行搜索
附录2 FFmpeg从入门到精通-Linux下编译FFmpeg
FFmpeg本身支持一些音视频编码格式、文件封装格式与流媒体传输协议,但是支持的数量依然有限,FFmpeg所做的只是提供一套基础的框架,所有的编码格式、文件封装格式与流媒体协议均可以作为FFmpeg的一个模块挂载在FFmpeg框架中。这些模块以第三方的外部库的方式提供支持,可以通过FFmpeg源码的configure命令查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议,对于FFmpeg不支持的格式,可以通过configure --help查看所需要的第三方外部库,然后通过增加对应的编译参数选项进行支持。帮助信息内容输出如下:
External library support: Using any of the following switches will allow FFmpeg to link to the corresponding external library. All the components depending on that library will become enabled, if all their other dependencies are met and they are not explicitly disabled. E.g. --enable-libopus will enable linking to libopus and allow the libopus encoder to be built, unless it is specifically disabled with --disable-encoder=libopus. Note that only the system libraries are auto-detected. All the other external libraries must be explicitly enabled. Also note that the following help text describes the purpose of the libraries themselves, not all their features will necessarily be usable by FFmpeg. --disable-alsa disable ALSA support [autodetect] --disable-appkit disable Apple AppKit framework [autodetect] --disable-avfoundation disable Apple AVFoundation framework [autodetect] --enable-avisynth enable reading of AviSynth script files [no] --disable-bzlib disable bzlib [autodetect] --disable-coreimage disable Apple CoreImage framework [autodetect] --enable-chromaprint enable audio fingerprinting with chromaprint [no] --enable-frei0r enable frei0r video filtering [no] --enable-gcrypt enable gcrypt, needed for rtmp(t)e support if openssl, librtmp or gmp is not used [no] --enable-gmp enable gmp, needed for rtmp(t)e support if openssl or librtmp is not used [no] --enable-gnutls enable gnutls, needed for https support if openssl, libtls or mbedtls is not used [no] --disable-iconv disable iconv [autodetect] --enable-jni enable JNI support [no] --enable-ladspa enable LADSPA audio filtering [no] --enable-lcms2 enable ICC profile support via LittleCMS 2 [no] --enable-libaom enable AV1 video encoding/decoding via libaom [no] --enable-libaribb24 enable ARIB text and caption decoding via libaribb24 [no] --enable-libass enable libass subtitles rendering, needed for subtitles and ass filter [no] --enable-libbluray enable BluRay reading using libbluray [no] --enable-libbs2b enable bs2b DSP library [no] --enable-libcaca enable textual display using libcaca [no] --enable-libcelt enable CELT decoding via libcelt [no] --enable-libcdio enable audio CD grabbing with libcdio [no] --enable-libcodec2 enable codec2 en/decoding using libcodec2 [no] --enable-libdav1d enable AV1 decoding via libdav1d [no] --enable-libdavs2 enable AVS2 decoding via libdavs2 [no] --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 and libraw1394 [no] --enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no] --enable-libflite enable flite (voice synthesis) support via libflite [no] --enable-libfontconfig enable libfontconfig, useful for drawtext filter [no] --enable-libfreetype enable libfreetype, needed for drawtext filter [no] --enable-libfribidi enable libfribidi, improves drawtext filter [no] --enable-libglslang enable GLSL->SPIRV compilation via libglslang [no] --enable-libgme enable Game Music Emu via libgme [no] --enable-libgsm enable GSM de/encoding via libgsm [no] --enable-libiec61883 enable iec61883 via libiec61883 [no] --enable-libilbc enable iLBC de/encoding via libilbc [no] --enable-libjack enable JACK audio sound server [no] --enable-libjxl enable JPEG XL de/encoding via libjxl [no] --enable-libklvanc enable Kernel Labs VANC processing [no] --enable-libkvazaar enable HEVC encoding via libkvazaar [no] --enable-liblensfun enable lensfun lens correction [no] --enable-libmodplug enable ModPlug via libmodplug [no] --enable-libmp3lame enable MP3 encoding via libmp3lame [no] --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no] --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no] --enable-libopencv enable video filtering via libopencv [no] --enable-libopenh264 enable H.264 encoding via OpenH264 [no] --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] --enable-libopenmpt enable decoding tracked files via libopenmpt [no] --enable-libopenvino enable OpenVINO as a DNN module backend for DNN based filters like dnn_processing [no] --enable-libopus enable Opus de/encoding via libopus [no] --enable-libplacebo enable libplacebo library [no] --enable-libpulse enable Pulseaudio input via libpulse [no] --enable-librabbitmq enable RabbitMQ library [no] --enable-librav1e enable AV1 encoding via rav1e [no] --enable-librist enable RIST via librist [no] --enable-librsvg enable SVG rasterization via librsvg [no] --enable-librubberband enable rubberband needed for rubberband filter [no] --enable-librtmp enable RTMP[E] support via librtmp [no] --enable-libshaderc enable GLSL->SPIRV compilation via libshaderc [no] --enable-libshine enable fixed-point MP3 encoding via libshine [no] --enable-libsmbclient enable Samba protocol via libsmbclient [no] --enable-libsnappy enable Snappy compression, needed for hap encoding [no] --enable-libsoxr enable Include libsoxr resampling [no] --enable-libspeex enable Speex de/encoding via libspeex [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libssh enable SFTP protocol via libssh [no] --enable-libsvtav1 enable AV1 encoding via SVT [no] --enable-libtensorflow enable TensorFlow as a DNN module backend for DNN based filters like sr [no] --enable-libtesseract enable Tesseract, needed for ocr filter [no] --enable-libtheora enable Theora encoding via libtheora [no] --enable-libtls enable LibreSSL (via libtls), needed for https support if openssl, gnutls or mbedtls is not used [no] --enable-libtwolame enable MP2 encoding via libtwolame [no] --enable-libuavs3d enable AVS3 decoding via libuavs3d [no] --enable-libv4l2 enable libv4l2/v4l-utils [no] --enable-libvidstab enable video stabilization using vid.stab [no] --enable-libvmaf enable vmaf filter via libvmaf [no] --enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no] --enable-libvorbis enable Vorbis en/decoding via libvorbis, native implementation exists [no] --enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no] --enable-libwebp enable WebP encoding via libwebp [no] --enable-libx264 enable H.264 encoding via x264 [no] --enable-libx265 enable HEVC encoding via x265 [no] --enable-libxavs enable AVS encoding via xavs [no] --enable-libxavs2 enable AVS2 encoding via xavs2 [no] --enable-libxcb enable X11 grabbing using XCB [autodetect] --enable-libxcb-shm enable X11 grabbing shm communication [autodetect] --enable-libxcb-xfixes enable X11 grabbing mouse rendering [autodetect] --enable-libxcb-shape enable X11 grabbing shape rendering [autodetect] --enable-libxvid enable Xvid encoding via xvidcore, native MPEG-4/Xvid encoder exists [no] --enable-libxml2 enable XML parsing using the C library libxml2, needed for dash and imf demuxing support [no] --enable-libzimg enable z.lib, needed for zscale filter [no] --enable-libzmq enable message passing via libzmq [no] --enable-libzvbi enable teletext support via libzvbi [no] --enable-lv2 enable LV2 audio filtering [no] --disable-lzma disable lzma [autodetect] --enable-decklink enable Blackmagic DeckLink I/O support [no] --enable-mbedtls enable mbedTLS, needed for https support if openssl, gnutls or libtls is not used [no] --enable-mediacodec enable Android MediaCodec support [no] --enable-mediafoundation enable encoding via MediaFoundation [auto] --disable-metal disable Apple Metal framework [autodetect] --enable-libmysofa enable libmysofa, needed for sofalizer filter [no] --enable-openal enable OpenAL 1.1 capture support [no] --enable-opencl enable OpenCL processing [no] --enable-opengl enable OpenGL rendering [no] --enable-openssl enable openssl, needed for https support if gnutls, libtls or mbedtls is not used [no] --enable-pocketsphinx enable PocketSphinx, needed for asr filter [no] --disable-sndio disable sndio support [autodetect] --disable-schannel disable SChannel SSP, needed for TLS support on Windows if openssl and gnutls are not used [autodetect] --disable-sdl2 disable sdl2 [autodetect] --disable-securetransport disable Secure Transport, needed for TLS support on OSX if openssl and gnutls are not used [autodetect] --enable-vapoursynth enable VapourSynth demuxer [no] --disable-vulkan disable Vulkan code [autodetect] --disable-xlib disable xlib [autodetect] --disable-zlib disable zlib [autodetect] The following libraries provide various hardware acceleration features: --disable-amf disable AMF video encoding code [autodetect] --disable-audiotoolbox disable Apple AudioToolbox code [autodetect] --enable-cuda-nvcc enable Nvidia CUDA compiler [no] --disable-cuda-llvm disable CUDA compilation using clang [autodetect] --disable-cuvid disable Nvidia CUVID support [autodetect] --disable-d3d11va disable Microsoft Direct3D 11 video acceleration code [autodetect] --disable-dxva2 disable Microsoft DirectX 9 video acceleration code [autodetect] --disable-ffnvcodec disable dynamically linked Nvidia code [autodetect] --enable-libdrm enable DRM code (Linux) [no] --enable-libmfx enable Intel MediaSDK (AKA Quick Sync Video) code via libmfx [no] --enable-libvpl enable Intel oneVPL code via libvpl if libmfx is not used [no] --enable-libnpp enable Nvidia Performance Primitives-based code [no] --enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no] --disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect] --disable-nvenc disable Nvidia video encoding code [autodetect] --enable-omx enable OpenMAX IL code [no] --enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no] --enable-rkmpp enable Rockchip Media Process Platform code [no] --disable-v4l2-m2m disable V4L2 mem2mem code [autodetect] --disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect] --disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect] --disable-videotoolbox disable VideoToolbox code [autodetect] Toolchain options: --arch=ARCH select architecture [] --cpu=CPU select the minimum required CPU (affects instruction selection, may crash on older CPUs) --cross-prefix=PREFIX use PREFIX for compilation tools [] --progs-suffix=SUFFIX program name suffix [] --enable-cross-compile assume a cross-compiler is used --sysroot=PATH root of cross-build tree --sysinclude=PATH location of cross-build system headers --target-os=OS compiler targets OS [] --target-exec=CMD command to run executables on target --target-path=DIR path to view of build directory on target --target-samples=DIR path to samples directory on target --tempprefix=PATH force fixed dir/prefix instead of mktemp for checks --toolchain=NAME set tool defaults according to NAME (gcc-asan, clang-asan, gcc-msan, clang-msan, gcc-tsan, clang-tsan, gcc-usan, clang-usan, valgrind-massif, valgrind-memcheck, msvc, icl, gcov, llvm-cov, hardened) --nm=NM use nm tool NM [nm -g] --ar=AR use archive tool AR [ar] --as=AS use assembler AS [] --ln_s=LN_S use symbolic link tool LN_S [ln -s -f] --strip=STRIP use strip tool STRIP [strip] --windres=WINDRES use windows resource compiler WINDRES [windres] --x86asmexe=EXE use nasm-compatible assembler EXE [nasm] --cc=CC use C compiler CC [gcc] --cxx=CXX use C compiler CXX [g++] --objcc=OCC use ObjC compiler OCC [gcc] --dep-cc=DEPCC use dependency generator DEPCC [gcc] --nvcc=NVCC use Nvidia CUDA compiler NVCC or clang [] --ld=LD use linker LD [] --metalcc=METALCC use metal compiler METALCC [xcrun -sdk macosx metal] --metallib=METALLIB use metal linker METALLIB [xcrun -sdk macosx metallib] --pkg-config=PKGCONFIG use pkg-config tool PKGCONFIG [pkg-config] --pkg-config-flags=FLAGS pass additional flags to pkgconf [] --ranlib=RANLIB use ranlib RANLIB [ranlib] --doxygen=DOXYGEN use DOXYGEN to generate API doc [doxygen] --host-cc=HOSTCC use host C compiler HOSTCC --host-cflags=HCFLAGS use HCFLAGS when compiling for host --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host --host-ld=HOSTLD use host linker HOSTLD --host-ldflags=HLDFLAGS use HLDFLAGS when linking for host --host-extralibs=HLIBS use libs HLIBS when linking for host --host-os=OS compiler host OS [] --extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [] --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [] --extra-objcflags=FLAGS add FLAGS to OBJCFLAGS [] --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [] --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [] --extra-ldsoflags=ELDFLAGS add ELDFLAGS to LDSOFLAGS [] --extra-libs=ELIBS add ELIBS [] --extra-version=STRING version string suffix [] --optflags=OPTFLAGS override optimization-related compiler flags --nvccflags=NVCCFLAGS override nvcc flags [] --build-suffix=SUFFIX library name suffix [] --enable-pic build position-independent code --enable-thumb compile for Thumb instruction set --enable-lto use link-time optimization --env="ENV=override" override the environment variables Advanced options (experts only): --malloc-prefix=PREFIX prefix malloc and related names with PREFIX --custom-allocator=NAME use a supported custom allocator --disable-symver disable symbol versioning --enable-hardcoded-tables use hardcoded tables instead of runtime generation --disable-safe-bitstream-reader disable buffer boundary checking in bitreaders (faster, but may crash) --sws-max-filter-size=N the max filter size swscale uses [256] Optimization options (experts only): --disable-asm disable all assembly optimizations --disable-altivec disable AltiVec optimizations --disable-vsx disable VSX optimizations --disable-power8 disable POWER8 optimizations --disable-amd3dnow disable 3DNow! optimizations --disable-amd3dnowext disable 3DNow! extended optimizations --disable-mmx disable MMX optimizations --disable-mmxext disable MMXEXT optimizations --disable-sse disable SSE optimizations --disable-sse2 disable SSE2 optimizations --disable-sse3 disable SSE3 optimizations --disable-ssse3 disable SSSE3 optimizations --disable-sse4 disable SSE4 optimizations --disable-sse42 disable SSE4.2 optimizations --disable-avx disable AVX optimizations --disable-xop disable XOP optimizations --disable-fma3 disable FMA3 optimizations --disable-fma4 disable FMA4 optimizations --disable-avx2 disable AVX2 optimizations --disable-avx512 disable AVX-512 optimizations --disable-avx512icl disable AVX-512ICL optimizations --disable-aesni disable AESNI optimizations --disable-armv5te disable armv5te optimizations --disable-armv6 disable armv6 optimizations --disable-armv6t2 disable armv6t2 optimizations --disable-vfp disable VFP optimizations --disable-neon disable NEON optimizations --disable-inline-asm disable use of inline assembly --disable-x86asm disable use of standalone x86 assembly --disable-mipsdsp disable MIPS DSP ASE R1 optimizations --disable-mipsdspr2 disable MIPS DSP ASE R2 optimizations --disable-msa disable MSA optimizations --disable-mipsfpu disable floating point MIPS optimizations --disable-mmi disable Loongson MMI optimizations --disable-lsx disable Loongson LSX optimizations --disable-lasx disable Loongson LASX optimizations --disable-rvv disable RISC-V Vector optimizations --disable-fast-unaligned consider unaligned accesses slow Developer options (useful when working on FFmpeg itself): --disable-debug disable debugging symbols --enable-debug=LEVEL set the debug level [] --disable-optimizations disable compiler optimizations --enable-extra-warnings enable more compiler warnings --disable-stripping disable stripping of executables and shared libraries --assert-level=level 0(default), 1 or 2, amount of assertion testing, 2 causes a slowdown at runtime. --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data --valgrind=VALGRIND run "make fate" tests through valgrind to detect memory leaks and errors, using the specified valgrind binary. Cannot be combined with --target-exec --enable-ftrapv Trap arithmetic overflows --samples=PATH location of test samples for FATE, if not set use $FATE_SAMPLES at make invocation time. --enable-neon-clobber-test check NEON registers for clobbering (should be used only for debugging purposes) --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only; should be used only for debugging purposes) --enable-random randomly enable/disable components --disable-random --enable-random=LIST randomly enable/disable specific components or --disable-random=LIST component groups. LIST is a comma-separated list of NAME[:PROB] entries where NAME is a component (group) and PROB the probability associated with NAME (default 0.5). --random-seed=VALUE seed value for --enable/disable-random --disable-valgrind-backtrace do not print a backtrace under Valgrind (only applies to --disable-optimizations builds) --enable-ossfuzz Enable building fuzzer tool --libfuzzer=PATH path to libfuzzer --ignore-tests=TESTS comma-separated list (without "fate-" prefix in the name) of tests whose result is ignored --enable-linux-perf enable Linux Performance Monitor API --enable-macos-kperf enable macOS kperf (private) API --disable-large-tests disable tests that use a large amount of memory --disable-ptx-compression don't compress CUDA PTX code even when possible
通过以上帮助信息的输出内容可以看到,FFmpeg所支持的外部库相对来说比较多,主要包含如下列表:
bzip2 1.0.6 <http://bzip.org/> Fontconfig 2.11.94 <http://freedesktop.org/wiki/Software/fontconfig> Frei0r 20130909-git-10d8360 <http://frei0r.dyne.org/> GnuTLS 3.3.15 <http://gnutls.org/> libiconv 1.14 <http://gnu.org/software/libiconv/> libass 0.12.2 <http://code.google.com/p/libass/> libbluray 0.8.1 <http://videolan.org/developers/libbluray.html> libbs2b 3.1.0 <http://bs2b.sourceforge.net/> libcaca 0.99.beta18 <http://caca.zoy.org/wiki/libcaca> dcadec 20150506-git-98fb3b6 <https://github.com/foo86/dcadec> FreeType 2.5.5 <http://freetype.sourceforge.net/> Game Music Emu 0.6.0 <http://code.google.com/p/game-music-emu/> GSM 1.0.13-4 <http://packages.debian.org/source/squeeze/libgsm> iLBC 20141214-git-ef04ebe <https://github.com/dekkers/libilbc/> Modplug-XMMS 0.8.8.5 <http://modplug-xmms.sourceforge.net/> LAME 3.99.5 <http://lame.sourceforge.net/> OpenCORE AMR 0.1.3 <http://sourceforge.net/projects/opencore-amr/> OpenJPEG 1.5.2 <http://www.openjpeg.org/> Opus 1.1 <http://opus-codec.org/> RTMPDump 20140707-git-a1900c3 <http://rtmpdump.mplayerhq.hu/> Schroedinger 1.0.11 <http://diracvideo.org/> libsoxr 0.1.1 <http://sourceforge.net/projects/soxr/> Speex 1.2rc2 <http://speex.org/> Theora 1.1.1 <http://theora.org/> TwoLAME 0.3.13 <http://twolame.org/> vid.stab 0.98 <http://public.hronopik.de/vid.stab/> VisualOn AAC 0.1.3 <https://github.com/mstorsjo/vo-aacenc> VisualOn AMR-WB 0.1.2 <https://github.com/mstorsjo/vo-amrwbenc> Vorbis 1.3.5 <http://vorbis.com/> vpx 1.4.0 <http://webmproject.org/> WavPack 4.75.0 <http://wavpack.com/> WebP 0.4.3 <https://developers.google.com/speed/webp/> x264 20150223-git-121396c <http://videolan.org/developers/x264.html> x265 1.7 <http://x265.org/> XAVS svn-r55 <http://xavs.sourceforge.net/> Xvid 1.3.3 <http://xvid.org/> XZ Utils 5.2.1 <http://tukaani.org/xz> zlib 1.2.8 <http://zlib.net/>
这些外部库可以通过configure进行定制,在编译好的FFmpeg可执行程序中也可以看到编译时定制的FFmpeg的外部库:
ffmpeg version n3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.1.0 (clang-802.0.42)
configuration: --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libspeex --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-version3 --cc='ccache gcc' --enable-nonfree --enable-videotoolbox --enable-audiotoolbox
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
例如需要自己配置FFmpeg支持哪些格式,比如仅支持H.264视频与AAC音频编码,可以调整配置项将其简化如下:
configure --enable-libx264 --enable-libfdk-aac --enable-gpl --enable-nonfree
命令行执行后的输出内容如下:
install prefix /usr/local source path . C compiler gcc C library glibc ARCH x86 (generic) big-endian no runtime cpu detection yes standalone assembly yes x86 assembler nasm MMX enabled yes MMXEXT enabled yes 3DNow! enabled yes 3DNow! extended enabled yes SSE enabled yes SSSE3 enabled yes AESNI enabled yes AVX enabled yes AVX2 enabled yes AVX-512 enabled yes AVX-512ICL enabled yes XOP enabled yes FMA3 enabled yes FMA4 enabled yes i686 features enabled yes CMOV is fast yes EBX available yes EBP available yes debug symbols yes strip symbols yes optimize for size no optimizations yes static yes shared no postprocessing support yes network support yes threading support pthreads safe bitstream reader yes texi2html enabled no perl enabled yes pod2man enabled yes makeinfo enabled no makeinfo supports HTML no xmllint enabled yes
如果需要支持H.265编码,则只需要增加–enable-libx265即可,其与支持H.264基本类似,从前面的help信息中可以看到,其他对应的编码与此类似。
注意:
从2016年年初开始,FFmpeg资深的AAC编码器质量逐步好转,至2016年年底,libfaac已经从FFmpeg源代码中剔除。
FFmpeg默认支持的音视频编码格式、文件封装格式和流媒体传输协议相对来说比较多,因此编译出来的FFmpeg体积比较大,在有些应用场景中,并不需要FFmpeg所支持的一些编码、封装或者协议,可以通过configure --help查看一些有用的裁剪操作:
可以通过这些选项关闭不需要用到的编码、封装与协议等模块,验证方法如下:
configure --disable-encoders --disable-decoders --disable-hwaccels --disable-muxers --disable-demuxers --disable-parsers --disable-bsfs --disable-protocols --disable-indevs --disable-devices --disable-filters
关闭所有的模块之后,可以看到FFmpeg的编译配置项输出信息几乎为空,输出信息具体如下:
Libraries: avcodec avfilter avutil swscale avdevice avformat swresample Programs: ffmpeg ffprobe Enabled decoders: Enabled encoders: Enabled hwaccels: Enabled parsers: Enabled demuxers: Enabled muxers: Enabled protocols: Enabled filters: aformat atrim hflip transpose vflip anull format null trim Enabled bsfs: Enabled indevs: Enabled outdevs: License: LGPL version 2.1 or later libavutil/avconfig.h is unchanged
而且在关闭所有的模块之后,可以根据定制支持自己所需要的模块,例如希望支持H.264视频编码、AAC音频编码、封装为MP4,可以通过如下方式进行支持:
External libraries: bzlib iconv libfdk_aac libx264 zlib External libraries providing hardware acceleration: Libraries: avcodec avfilter avutil swresample avdevice avformat postproc swscale Programs: ffmpeg ffprobe Enabled decoders: Enabled encoders: Enabled hwaccels: Enabled parsers: ac3 Enabled demuxers: Enabled muxers: mov mp4 Enabled protocols: Enabled filters: aformat atrim hflip transpose vflip anull format null trim Enabled bsfs: aac_adtstoasc vp9_superframe Enabled indevs: Enabled outdevs:
从以上的输出内容可以看到,FFmpeg已经支持了H.264编码、AAC编码与MP4封装格式。这样通过编译之后生成的FFmpeg即是配置裁剪过的FFmpeg,体积会比默认编译的FFmpeg小很多。
FFmpeg源代码中可以包含的编码非常多,常见的和不常见的都可以在编译配置列表中见到,可以通过使用编译配置命令./configure–list-encoders参数来查看:
a64multi eac3 libshine pcm_f64le sbc a64multi5 exr libspeex pcm_mulaw sgi aac ffv1 libsvtav1 pcm_mulaw_at smc aac_at ffvhuff libtheora pcm_s16be snow aac_mf fits libtwolame pcm_s16be_planar sonic ac3 flac libvo_amrwbenc pcm_s16le sonic_ls ac3_fixed flashsv libvorbis pcm_s16le_planar speedhq ac3_mf flashsv2 libvpx_vp8 pcm_s24be srt adpcm_adx flv libvpx_vp9 pcm_s24daud ssa adpcm_argo g723_1 libwebp pcm_s24le subrip adpcm_g722 gif libwebp_anim pcm_s24le_planar sunrast adpcm_g726 h261 libx262 pcm_s32be svq1 adpcm_g726le h263 libx264 pcm_s32le targa adpcm_ima_alp h263_v4l2m2m libx264rgb pcm_s32le_planar text adpcm_ima_amv h263p libx265 pcm_s64be tiff adpcm_ima_apm h264_amf libxavs pcm_s64le truehd adpcm_ima_qt h264_mf libxavs2 pcm_s8 tta adpcm_ima_ssi h264_nvenc libxvid pcm_s8_planar ttml adpcm_ima_wav h264_omx ljpeg pcm_u16be utvideo adpcm_ima_ws h264_qsv magicyuv pcm_u16le v210 adpcm_ms h264_v4l2m2m mjpeg pcm_u24be v308 adpcm_swf h264_vaapi mjpeg_qsv pcm_u24le v408 adpcm_yamaha h264_videotoolbox mjpeg_vaapi pcm_u32be v410 alac hap mlp pcm_u32le vbn alac_at hevc_amf movtext pcm_u8 vc2 alias_pix hevc_mf mp2 pcm_vidc vorbis amv hevc_nvenc mp2fixed pcx vp8_v4l2m2m apng hevc_qsv mp3_mf pfm vp8_vaapi aptx hevc_v4l2m2m mpeg1video pgm vp9_qsv aptx_hd hevc_vaapi mpeg2_qsv pgmyuv vp9_vaapi ass hevc_videotoolbox mpeg2_vaapi phm wavpack asv1 huffyuv mpeg2video png webvtt asv2 ilbc_at mpeg4 ppm wmav1 avrp jpeg2000 mpeg4_omx prores wmav2 avui jpegls mpeg4_v4l2m2m prores_aw wmv1 ayuv libaom_av1 msmpeg4v2 prores_ks wmv2 bitpacked libcodec2 msmpeg4v3 prores_videotoolbox wrapped_avframe bmp libfdk_aac msvideo1 qoi xbm cfhd libgsm nellymoser qtrle xface cinepak libgsm_ms opus r10k xsub cljr libilbc pam r210 xwd comfortnoise libjxl pbm ra_144 y41p dca libkvazaar pcm_alaw rawvideo yuv4 dfpwm libmp3lame pcm_alaw_at roq zlib dnxhd libopencore_amrnb pcm_bluray roq_dpcm zmbv dpx libopenh264 pcm_dvd rpza dvbsub libopenjpeg pcm_f32be rv10 dvdsub libopus pcm_f32le rv20 dvvideo librav1e pcm_f64be s302m
从上面的输出信息中可以看出,FFmpeg支持的编码器比较全面,比如AAC、AC3、H.264、H.265、MPEG4、MPEG2VIDEO、PCM、FLV1的编码器支持。
FFmpeg源代码本身包含了很多的解码支持,解码主要是在输入的时候进行解码,也可以理解为将压缩过的编码进行解压缩,关于解码的支持,可以通过./configure–list-decoders命令来进行查看:
aac cdgraphics imm5 nellymoser speedhq aac_at cdtoons indeo2 notchlc speex aac_fixed cdxl indeo3 nuv srgc aac_latm cfhd indeo4 on2avc srt aasc cinepak indeo5 opus ssa ac3 clearvideo interplay_acm paf_audio stl ac3_at cljr interplay_dpcm paf_video subrip ac3_fixed cllc interplay_video pam subviewer acelp_kelvin comfortnoise ipu pbm subviewer1 adpcm_4xm cook jacosub pcm_alaw sunrast adpcm_adx cpia jpeg2000 pcm_alaw_at svq1 adpcm_afc cri jpegls pcm_bluray svq3 adpcm_agm cscd jv pcm_dvd tak adpcm_aica cyuv kgv1 pcm_f16le targa adpcm_argo dca kmvc pcm_f24le targa_y216 adpcm_ct dds lagarith pcm_f32be tdsc adpcm_dtk derf_dpcm libaom_av1 pcm_f32le text adpcm_ea dfa libaribb24 pcm_f64be theora adpcm_ea_maxis_xa dfpwm libcelt pcm_f64le thp adpcm_ea_r1 dirac libcodec2 pcm_lxf tiertexseqvideo adpcm_ea_r2 dnxhd libdav1d pcm_mulaw tiff adpcm_ea_r3 dolby_e libdavs2 pcm_mulaw_at tmv adpcm_ea_xas dpx libfdk_aac pcm_s16be truehd adpcm_g722 dsd_lsbf libgsm pcm_s16be_planar truemotion1 adpcm_g726 dsd_lsbf_planar libgsm_ms pcm_s16le truemotion2 adpcm_g726le dsd_msbf libilbc pcm_s16le_planar truemotion2rt adpcm_ima_acorn dsd_msbf_planar libjxl pcm_s24be truespeech adpcm_ima_alp dsicinaudio libopencore_amrnb pcm_s24daud tscc adpcm_ima_amv dsicinvideo libopencore_amrwb pcm_s24le tscc2 adpcm_ima_apc dss_sp libopenh264 pcm_s24le_planar tta adpcm_ima_apm dst libopenjpeg pcm_s32be twinvq adpcm_ima_cunning dvaudio libopus pcm_s32le txd adpcm_ima_dat4 dvbsub librsvg pcm_s32le_planar ulti adpcm_ima_dk3 dvdsub libspeex pcm_s64be utvideo adpcm_ima_dk4 dvvideo libuavs3d pcm_s64le v210 adpcm_ima_ea_eacs dxa libvorbis pcm_s8 v210x adpcm_ima_ea_sead dxtory libvpx_vp8 pcm_s8_planar v308 adpcm_ima_iss dxv libvpx_vp9 pcm_sga v408 adpcm_ima_moflex eac3 libzvbi_teletext pcm_u16be v410 adpcm_ima_mtf eac3_at loco pcm_u16le vb adpcm_ima_oki eacmv lscr pcm_u24be vble adpcm_ima_qt eamad m101 pcm_u24le vbn adpcm_ima_qt_at eatgq mace3 pcm_u32be vc1 adpcm_ima_rad eatgv mace6 pcm_u32le vc1_crystalhd adpcm_ima_smjpeg eatqi magicyuv pcm_u8 vc1_cuvid adpcm_ima_ssi eightbps mdec pcm_vidc vc1_mmal adpcm_ima_wav eightsvx_exp metasound pcx vc1_qsv adpcm_ima_ws eightsvx_fib microdvd pfm vc1_v4l2m2m adpcm_ms escape124 mimic pgm vc1image adpcm_mtaf escape130 mjpeg pgmyuv vcr1 adpcm_psx evrc mjpeg_cuvid pgssub vmdaudio adpcm_sbpro_2 exr mjpeg_qsv pgx vmdvideo adpcm_sbpro_3 fastaudio mjpegb phm vmnc adpcm_sbpro_4 ffv1 mlp photocd vorbis adpcm_swf ffvhuff mmvideo pictor vp3 adpcm_thp ffwavesynth mobiclip pixlet vp4 adpcm_thp_le fic motionpixels pjs vp5 adpcm_vima fits movtext png vp6 adpcm_xa flac mp1 ppm vp6a adpcm_yamaha flashsv mp1_at prores vp6f adpcm_zork flashsv2 mp1float prosumer vp7 agm flic mp2 psd vp8 aic flv mp2_at ptx vp8_cuvid alac fmvc mp2float qcelp vp8_mediacodec alac_at fourxm mp3 qdm2 vp8_qsv alias_pix fraps mp3_at qdm2_at vp8_rkmpp als frwu mp3adu qdmc vp8_v4l2m2m amr_nb_at g2m mp3adufloat qdmc_at vp9 amrnb g723_1 mp3float qdraw vp9_cuvid amrwb g729 mp3on4 qoi vp9_mediacodec amv gdv mp3on4float qpeg vp9_qsv anm gem mpc7 qtrle vp9_rkmpp ansi gif mpc8 r10k vp9_v4l2m2m ape gremlin_dpcm mpeg1_cuvid r210 vplayer apng gsm mpeg1_v4l2m2m ra_144 vqa aptx gsm_ms mpeg1video ra_288 wavpack aptx_hd gsm_ms_at mpeg2_crystalhd ralf wcmv arbc h261 mpeg2_cuvid rasc webp argo h263 mpeg2_mediacodec rawvideo webvtt ass h263_v4l2m2m mpeg2_mmal realtext wmalossless asv1 h263i mpeg2_qsv rl2 wmapro asv2 h263p mpeg2_v4l2m2m roq wmav1 atrac1 h264 mpeg2video roq_dpcm wmav2 atrac3 h264_crystalhd mpeg4 rpza wmavoice atrac3al h264_cuvid mpeg4_crystalhd rscc wmv1 atrac3p h264_mediacodec mpeg4_cuvid rv10 wmv2 atrac3pal h264_mmal mpeg4_mediacodec rv20 wmv3 atrac9 h264_qsv mpeg4_mmal rv30 wmv3_crystalhd aura h264_rkmpp mpeg4_v4l2m2m rv40 wmv3image aura2 h264_v4l2m2m mpegvideo s302m wnv1 av1 hap mpl2 sami wrapped_avframe av1_cuvid hca msa1 sanm ws_snd1 av1_qsv hcom mscc sbc xan_dpcm avrn hevc msmpeg4_crystalhd scpr xan_wc3 avrp hevc_cuvid msmpeg4v1 screenpresso xan_wc4 avs hevc_mediacodec msmpeg4v2 sdx2_dpcm xbin avui hevc_qsv msmpeg4v3 sga xbm ayuv hevc_rkmpp msnsiren sgi xface bethsoftvid hevc_v4l2m2m msp2 sgirle xl bfi hnm4_video msrle sheervideo xma1 bink hq_hqa mss1 shorten xma2 binkaudio_dct hqx mss2 simbiosis_imx xpm binkaudio_rdft huffyuv msvideo1 sipr xsub bintext hymt mszh siren xwd bitpacked iac mts2 smackaud y41p bmp idcin mv30 smacker ylc bmv_audio idf mvc1 smc yop bmv_video iff_ilbm mvc2 smvjpeg yuv4 brender_pix ilbc mvdv snow zero12v c93 ilbc_at mvha sol_dpcm zerocodec cavs imc mwsc sonic zlib ccaption imm4 mxpeg sp5x zmbv
从上面的输出信息中可以看到FFmpeg所支持的解码器模块decoders支持了MPEG4、H.264、H.265(HEVC)、MP3等格式。
FFmpeg的封装(Muxing)是指将压缩后的编码封装到一个容器格式中,如果要查看FFmpeg源代码中都可以支持哪些容器格式,可以通过命令./configure --list-muxers来查看:
a64 dirac ircam oga sbc ac3 dnxhd ismv ogg scc adts dts ivf ogv segafilm adx dv jacosub oma segment aiff eac3 kvag opus smjpeg alp f4v latm pcm_alaw smoothstreaming amr ffmetadata lrc pcm_f32be sox amv fifo m4v pcm_f32le spdif apm fifo_test matroska pcm_f64be spx apng filmstrip matroska_audio pcm_f64le srt aptx fits md5 pcm_mulaw stream_segment aptx_hd flac microdvd pcm_s16be streamhash argo_asf flv mjpeg pcm_s16le sup argo_cvg framecrc mkvtimestamp_v2 pcm_s24be swf asf framehash mlp pcm_s24le tee asf_stream framemd5 mmf pcm_s32be tg2 ass g722 mov pcm_s32le tgp ast g723_1 mp2 pcm_s8 truehd au g726 mp3 pcm_u16be tta avi g726le mp4 pcm_u16le ttml avif gif mpeg1system pcm_u24be uncodedframecrc avm2 gsm mpeg1vcd pcm_u24le vc1 avs2 gxf mpeg1video pcm_u32be vc1t avs3 h261 mpeg2dvd pcm_u32le voc bit h263 mpeg2svcd pcm_u8 w64 caf h264 mpeg2video pcm_vidc wav cavsvideo hash mpeg2vob psp webm chromaprint hds mpegts rawvideo webm_chunk codec2 hevc mpjpeg rm webm_dash_manifest codec2raw hls mxf roq webp crc ico mxf_d10 rso webvtt dash ilbc mxf_opatom rtp wsaud data image2 null rtp_mpegts wtv daud image2pipe nut rtsp wv dfpwm ipod obu sap yuv4mpegpipe
从封装(又称复用)格式所支持的信息中可以看到,FFmpeg支持生成裸流文件,如H.264、AAC、PCM,也支持一些常见的格式,如MP3、MP4、FLV、M3U8、WEBM等。
FFmpeg的解封装(Demuxing)是指将读入的容器格式拆解开,将里面压缩的音频流、视频流、字幕流、数据流等提取出来,如果要查看FFmpeg的源代码中都可以支持哪些输入的容器格式,可以通过命令./configure --list-demuxers来查看:
aa dhav image_pgm_pipe msnwc_tcp segafilm aac dirac image_pgmyuv_pipe msp ser aax dnxhd image_pgx_pipe mtaf sga ac3 dsf image_phm_pipe mtv shorten ace dsicin image_photocd_pipe musx siff acm dss image_pictor_pipe mv simbiosis_imx act dts image_png_pipe mvi sln adf dtshd image_ppm_pipe mxf smacker adp dv image_psd_pipe mxg smjpeg ads dvbsub image_qdraw_pipe nc smush adx dvbtxt image_qoi_pipe nistsphere sol aea dxa image_sgi_pipe nsp sox afc ea image_sunrast_pipe nsv spdif aiff ea_cdata image_svg_pipe nut srt aix eac3 image_tiff_pipe nuv stl alp epaf image_vbn_pipe obu str amr ffmetadata image_webp_pipe ogg subviewer amrnb filmstrip image_xbm_pipe oma subviewer1 amrwb fits image_xpm_pipe paf sup anm flac image_xwd_pipe pcm_alaw svag apc flic imf pcm_f32be svs ape flv ingenient pcm_f32le swf apm fourxm ipmovie pcm_f64be tak apng frm ipu pcm_f64le tedcaptions aptx fsb ircam pcm_mulaw thp aptx_hd fwse iss pcm_s16be threedostr aqtitle g722 iv8 pcm_s16le tiertexseq argo_asf g723_1 ivf pcm_s24be tmv argo_brp g726 ivr pcm_s24le truehd argo_cvg g726le jacosub pcm_s32be tta asf g729 jv pcm_s32le tty asf_o gdv kux pcm_s8 txd ass genh kvag pcm_u16be ty ast gif libgme pcm_u16le v210 au gsm libmodplug pcm_u24be v210x av1 gxf libopenmpt pcm_u24le vag avi h261 live_flv pcm_u32be vapoursynth avisynth h263 lmlm4 pcm_u32le vc1 avr h264 loas pcm_u8 vc1t avs hca lrc pcm_vidc vividas avs2 hcom luodat pjs vivo avs3 hevc lvf pmp vmd bethsoftvid hls lxf pp_bnk vobsub bfi hnm m4v pva voc bfstm ico matroska pvf vpk bink idcin mca qcp vplayer binka idf mcc r3d vqf bintext iff mgsts rawvideo w64 bit ifv microdvd realtext wav bitpacked ilbc mjpeg redspark wc3 bmv image2 mjpeg_2000 rl2 webm_dash_manifest boa image2_alias_pix mlp rm webvtt brstm image2_brender_pix mlv roq wsaud c93 image2pipe mm rpl wsd caf image_bmp_pipe mmf rsd wsvqa cavsvideo image_cri_pipe mods rso wtv cdg image_dds_pipe moflex rtp wv cdxl image_dpx_pipe mov rtsp wve cine image_exr_pipe mp3 s337m xa codec2 image_gem_pipe mpc sami xbin codec2raw image_gif_pipe mpc8 sap xmv concat image_j2k_pipe mpegps sbc xvag dash image_jpeg_pipe mpegts sbg xwma data image_jpegls_pipe mpegtsraw scc yop daud image_jpegxl_pipe mpegvideo scd yuv4mpegpipe dcstr image_pam_pipe mpjpeg sdp derf image_pbm_pipe mpl2 sdr2 dfa image_pcx_pipe mpsub sds dfpwm image_pfm_pipe msf sdx
从解封装(Demuxer,又称解复用)格式支持信息中可以看到,FFmpeg源代码中已经支持的demuxer非常多,包含图片(image)、MP3、FLV、MP4、MOV、AVI等。
FFmpeg不仅仅支持本地的多媒体处理,而且还支持网络流媒体的处理,支持的网络流媒体协议相对来说也很全面,可以通过命令./configure --list-protocols查看:
async gopher librtmp mmst srtp
bluray gophers librtmpe pipe subfile
cache hls librtmps prompeg tcp
concat http librtmpt rtmp tee
concatf httpproxy librtmpte rtmpe tls
crypto https libsmbclient rtmps udp
data icecast libsrt rtmpt udplite
ffrtmpcrypt ipfs libssh rtmpte unix
ffrtmphttp ipns libzmq rtmpts
file libamqp md5 rtp
ftp librist mmsh sctp
从协议的相关信息列表中可以看到,FFmpeg支持的流媒体协议比较多,包括MMS、HTTP、HTTPS、HLS(M3U8)、RTMP、RTP,甚至支持TCP、UDP,其也支持使用file协议的本地文件操作和使用concat协议支持的多个文件串流操作,后面的章节中会有详细的介绍。
本章重点介绍了FFmpeg的获取、安装、容器封装与解封装的格式支持、音视频编码与解码的格式支持,以及流媒体传输协议的支持。综合来说,FFmpeg所支持的容器、编解码、协议相对来说比较全面,是一款功能强大的多媒体处理工具和开发套件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。