目录
0 ffmpeg下载
1 ffprobe
1.1 简介
1.2 先睹为快
1.3 ffprobe命令详解
2 ffplay
2.1 简介
2.2 先睹为快
2.3 ffplay命令详解
3 ffmpeg
3.1 简介
3.2 先睹为快
3.3 ffmpeg命令详解
FFMPEG官网(http://ffmpeg.org/)提供了编译好的可用版本的下载地址,其中windows,mac可用版本下载地址如http://ffmpeg.zeranoe.com/builds/。 该网站中的FFMPEG分为3个版本:Static,Shared,Dev。
Static版本:只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll(mac上为dylib)等已经被编译到exe里面去了。
Shared版本:里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。
Dev版本:是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。
打开系统命令行界面,mac或linux的终端,切换到ffmpeg所在的目录,就可以使用这3个应用程序了,后续将介绍这3个应用程序,或者是ffmpeg编译后提供的直接可使用的工具。
ffprobe是FFMPEG源码编译后生成的三个可执行程序之一,是一个很强大的多媒体分析工具,可以从媒体文件或者媒体流中获取你想要的媒体信息,比如音频的参数,视频参数,媒体容器参数信息等。比如它可以帮助分析某个媒体容器中音频是什么编码格式,视频是什么编码格式,可以获取总时长,复合码率;可以分析媒体文件中每个包的长度,包的类型,帧信息等。
以我最常用的获取媒体文件信息的命令来展示ffprobe的使用方式,并将结果展示在下面,并注释输出内容
localhost:~ ice_ly000$ ffprobe -show_format https://replay.xescdn.com/livecourse/12c6899acc8f8c98a71e3874dcdbbb7e227991.flv.mp4
//展示了ffprobe版本信息及版权信息,编译平台(Apple),编译工具(Apple LLVM),编译时的配置,编译
//生成pprobe所依赖的ffmpeg的库libavutil...libpostproc
ffprobe version N-93147-g9326117bf6 Copyright (c) 2007-2019 the FFmpeg developers
built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-appkit --enable-avfoundation --enable-coreimage --enable-audiotoolbox
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.102 / 58. 47.102
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
//这儿告知了文件的封装格式,但为什么不是mp4,而是这么多格式还有待研究--
//后面问了刘岐(大师兄),是因为这些格式是类似的,而ffmpeg猜不出这个文件具体分类,所以输出full
//name,将所有可能的封装格式进行输出,以后看ffmpeg源码再来确认这点
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
'https://replay.xescdn.com/livecourse/12c6899acc8f8c98a71e3874dcdbbb7e227991.flv.mp4':
//以下是媒体文件的元数据
Metadata:
major_brand : mp42 //这三个值含义见后文分析
minor_version : 0
compatible_brands: mp42mp41
creation_time : 2019-01-29T04:39:01.000000Z //文件创建时间
Duration: 00:42:55.88, start: 0.000000, bitrate: 1194 kb/s //文件播放时长,起始时间,平均码率
//以下是流#0:0的信息
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 1001 kb/s, 12 fps, 12 tbr, 24k tbn, 24 tbc (default) //分别是:此流是视频流,视频编码格式h.264, 像素色彩空间yuv420p,分辨率1280x720,视频码率1001kb/s,帧率12fps,后续3个值含义见后文分析
Metadata:
creation_time : 2019-01-29T04:39:01.000000Z //创建时间
handler_name : ?Mainconcept Video Media Handler //
encoder : AVC Coding //编码器
//以下是流#0:1的信息
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 189 kb/s (default) //分别是:此流为音频流,音频编码格式AAC, 级别LC, 采样率44100HZ,声道布局为立体双声道stereo,采样格式fltp(float, planar->声音采样值用浮点数表示,并且双声道数据是分开存储而非交替存储packet),码率189kb/s
Metadata:
creation_time : 2019-01-29T04:39:01.000000Z //创建时间
handler_name : #Mainconcept MP4 Sound Media Handler
[FORMAT]
filename=https://replay.xescdn.com/livecourse /12c6899acc8f8c98a71e3874dcdbbb7e227991.flv.mp4 //文件名
nb_streams=2 //文件中含有2个流
nb_programs=0 //文件中含有节目数量0
format_name=mov,mp4,m4a,3gp,3g2,mj2 //文件的可能封装格式
format_long_name=QuickTime / MOV //文件封装格式长名称
start_time=0.000000 //开始时间
duration=2575.882444 //时长
size=384490707 //文件大小
bit_rate=1194125 //平均码率
probe_score=100 //见下文分析
TAG:major_brand=mp42 //以下几个参数与前文一样,见下文分析
TAG:minor_version=0
TAG:compatible_brands=mp42mp41
TAG:creation_time=2019-01-29T04:39:01.000000Z
[/FORMAT]
major_brand && minor_version && compatible_brands
关于上述三个术语的解释,在wiki上摘抄了一段英文放在这儿供大家自己分析(自己的理解可能不对,就不误导大家了),wiki地址为File Type Box。所有从iso base media file format中衍生出来的文件都在www.mp4ra.org上注册,已注册列表为http://mp4ra.org/#/brands。
In order to identify the specifications to which a file based on ISO base media file format complies, brands are used as identifiers in the file format. They are set in a box named File Type Box ('ftyp'), which must be placed in the beginning of the file. It is somewhat analogous to the so-called fourcc code, used for a similar purpose for media embedded in AVI container format.[50] A brand might indicate the type of encoding used, how the data of each encoding is stored, constraints and extensions that are applied to the file, the compatibility, or the intended usage of the file. Brands are a printable four-character codes. A File Type Box contains two kinds of brands. One is "major_brand" which identifies the specification of the best use for the file. It is followed by "minor_version," an informative 4 bytes integer for the minor version of the major brand. The second kind of brand is "compatible_brands," which identifies multiple specifications to which the file complies. All files shall contain a File Type Box, but for compatibility reasons with an earlier version of the specification, files may be conformant to ISO base media file format and not contain a File Type Box. In that case they should be read as if they contained an ftyp with major and compatible brand "mp41" (MP4 v1 – ISO 14496-1, Chapter 13).[1] Many in-use brands (ftyps) are not registered and can be found on some webpages.[26]
A multimedia file structured upon ISO base media file format may be compatible with more than one concrete specification, and it is therefore not always possible to speak of a single "type" or "brand" for the file. In this regard, the utility of the Multipurpose Internet Mail Extension type and file name extension is somewhat reduced. In spite of that, when a derived specification is written, a new file extension will be used, a new MIME type and a new Macintosh file type.[1]
tbr && tbc && tbn
tbn:the time base in AVStream that has come from the container 代表文件层(st)的时间精度,即1S=1200k,和duration相关。 tbc:the time base in AVCodecContext for the codec used for a particular stream 代表视频层(st->codec)的时间精度,即1S=50,和strem->duration和时间戳相关。tbr: is guessed from the video stream and is the value users want to see when they look for the video frame rate 代表帧率
probe_score
ffmpeg探测封装格式的时候,会初始化一个score值,是一个判决AVInputFormat的分数的门限值,如果最后得到的AVInputFormat的分数低于该门限值,就认为没有找到合适的AVInputFormat。FFmpeg内部判断封装格式的原理实际上是对每种AVInputFormat给出一个分数,满分是100分,越有可能正确的AVInputFormat给出的分数就越高。最后选择分数最高的AVInputFormat作为推测结果。此例中probe_score为100.
ffprobe的详细介绍另开一篇文章:[总结]FFMPEG命令行工具之ffprobe详解。特点是:1 原创; 2 从-h命令开始一步步循序渐进;3 命令的作用以及输出内容进行了详细的释义;4 会附带讲一些相关的基础知识。
ffplay是FFMPEG源码编译后生成的三个可执行程序之一。套用ffplay Documentation中用来介绍ffplay的一句话:“FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library. It is mostly used as a testbed for the various FFmpeg APIs.” 大意是:ffplay是一个简单可移植的多媒体播放器,依赖ffmpeg库以及SDL库,其中SDL库是用来渲染音视频。ffplay大多数时候用来测试各种各样的ffmpeg api。
作为一个播放器,其最重要的功能就是解码并渲染音视频。那么先以最简单的播放本地视频文件的方式开始。执行ffplay -i 1.mp4 或者直接是ffplay 1.mp4,将弹出一个窗体播放本地的1.mp4文件,并在命令行中输出如下内容:
ffplay version N-93219-gc679119a73 Copyright (c) 2003-2019 the FFmpeg developers #第一部分
built with gcc 8.2.1 (GCC) 20190212
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.102 / 58. 47.102
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Input #0, matroska,webm, from '.\1.mp4':q= 0KB sq= 0B f=0/0 #第二部分
Metadata:
encoder : libebml v1.3.4 + libmatroska v1.4.5 //封装工具
creation_time : 2018-10-10T16:50:31.000000Z //文件创建时间
Duration: 02:00:04.25, start: 0.000000, bitrate: 2679 kb/s //时长,开始播放时间,平均码率
Stream #0:0: Subtitle: subrip (default) //subrip为字幕提取软件
Metadata:
BPS : 19 //字幕的码率
BPS-eng : 19 //-eng是什么????????
DURATION : 00:00:39.230000000 //时长
DURATION-eng : 00:00:39.230000000
NUMBER_OF_FRAMES: 1 //帧数,对字幕是否是无用参数,否则1帧是什么鬼
NUMBER_OF_FRAMES-eng: 1
NUMBER_OF_BYTES : 96 //字节数
NUMBER_OF_BYTES-eng: 96
_STATISTICS_WRITING_APP: mkvmerge v9.7.1 ('Pandemonium') 32bit //统计信息
_STATISTICS_WRITING_APP-eng: mkvmerge v9.7.1 ('Pandemonium') 32bit
_STATISTICS_WRITING_DATE_UTC: 2018-10-10 16:50:31
_STATISTICS_WRITING_DATE_UTC-eng: 2018-10-10 16:50:31
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp (default)
Metadata:
BPS : 126562
BPS-eng : 126562
DURATION : 02:00:04.224000000
DURATION-eng : 02:00:04.224000000
NUMBER_OF_FRAMES: 337698
NUMBER_OF_FRAMES-eng: 337698
NUMBER_OF_BYTES : 113973355
NUMBER_OF_BYTES-eng: 113973355
_STATISTICS_WRITING_APP: mkvmerge v9.7.1 ('Pandemonium') 32bit
_STATISTICS_WRITING_APP-eng: mkvmerge v9.7.1 ('Pandemonium') 32bit
_STATISTICS_WRITING_DATE_UTC: 2018-10-10 16:50:31
_STATISTICS_WRITING_DATE_UTC-eng: 2018-10-10 16:50:31
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream #0:2: Video: h264 (Constrained Baseline), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Metadata:
BPS : 2550622
BPS-eng : 2550622
DURATION : 02:00:04.246000000
DURATION-eng : 02:00:04.246000000
NUMBER_OF_FRAMES: 172729
NUMBER_OF_FRAMES-eng: 172729
NUMBER_OF_BYTES : 2296914143
NUMBER_OF_BYTES-eng: 2296914143
_STATISTICS_WRITING_APP: mkvmerge v9.7.1 ('Pandemonium') 32bit
_STATISTICS_WRITING_APP-eng: mkvmerge v9.7.1 ('Pandemonium') 32bit
_STATISTICS_WRITING_DATE_UTC: 2018-10-10 16:50:31
_STATISTICS_WRITING_DATE_UTC-eng: 2018-10-10 16:50:31
_STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
82.94 A-V: -0.057 fd= 196 aq= 986KB vq=14373KB sq= 0B f=0/0 #第三部分
命令行输出内容分为 3大部分
第一部分: 依次介绍了ffplay的版本信息,版权信息,编译ffplay的编译器以及版本(gcc 8.2.1),编译的配置信息configuration,编译后产生的ffmpeg各功能模块的版本信息。
第二部分: 这部分依次介绍了封装信息,流信息。与2.1中ffprobe命令输出那个文件不同之处在于1.mp4这个文件中含有内嵌字幕,为第0个流,占据着第0个索引。具体输出参数信息已经在命令输出内容上进行了注释,没有注释的内容可以参见2.1中ffprobe命令输出内容释义。
PS1: 有必要单独拿出来讲一下的是流的metadata里面TAG都有额外一份带-eng的,目前只能猜测是英语语言环境,这个需要打一个?????,并且这些个带-eng的TAG都是做啥用的?????
PS2: 文件封装格式metadata元数据内容中没有major_brand minor_version compatible_brands这几个参数来描述文件遵循什么样的格式规范,那么ffplay是如何知道这个文件格式是matroska或者是webm呢?可以看到封装的metadata中TAG encoder : libebml v1.3.4 + libmatroska v1.4.5,那么ffplay应该是根据封装工具来识别文件格式的吧~
PS3: 视频流信息中有“1920x1080 [SAR 1:1 DAR 16:9]” 这样一个输出是2.1中没有出现的。其中SAR为sample aspect ratio的缩写,采样纵横比; DAR为display aspect ratio的缩写,显示丛横比;显示丛横比好理解,因为视频分辨率为1920x1080,因此显示比例为16:9。但是为什么采样纵横比为1:1呢?来看我查阅资料后的解答:
首先,在wiki上SAR释义为Storage aspect ratio,这个明确为纵横采样点数之比;另外有PAR释义为Pixel aspect ratio,即单个像素的纵横比;还有DAR释义为Display aspect ratio;那么很明显DAR = SAR * PAR. Wiki地址:DAR SAR PAR
其次,在ffmpeg中,SAR展开为sample aspect ratio,那么这个是否跟wiki上SAR(Storage aspect ratio) 是一个概念呢?这个是困扰我很久的问题,至今还未完全确定。如果SAR按照wiki上的Storage aspect ratio来理解,那么该视频纵横采样点数是1:1,然而该视频的分辨率为1920x1080,按照正常的逻辑来理解就是横向采样1920个像素点,纵向采样1080个像素点,二者是违背的。若按照SAR为wiki上的PAR来理解的话,反而很契合逻辑,即采样点数为1920x1080,每个像素点纵横比为1:1,因此DAR为1920:1080=16:9。
最后,如何正确去理解这个SAR才是正真对的呢?可能需要去探索ffmpeg源码才能最终一窥究竟了。
第三部分:82.94 A-V: -0.057 fd= 196 aq= 986KB vq=14373KB sq= 0B f=0/0。 其中82.94为当前播放时间,单位s,随着播放进行时刻更新;A-V:-0.057 表示即有音频又有视频,并且播放到当前二者时间戳差值为-0.057s,随着播放进行时刻更新;fd=196表示frame droped丢帧数量为196;aq=986KB表示当前音频帧大小为986kb; vq=14373KB表示当前视频帧大小14373KB;sq=0B 当前字幕帧大小0B;f:timestamp error correction rate(但不确定是否正确)
ffplay的详细介绍另开一篇文章:[总结]FFMPEG命令行工具之ffplay详解。特点是:1 原创; 2 从-h命令开始一步步循序渐进;3 命令的作用以及输出内容进行了详细的释义;4 会附带讲一些相关的基础知识。
ffmpeg是FFMPEG源码编译后生成的三个可执行程序之一。它是一个快速的音频和视频转换器,并且可以从直播源抓取资源。并且可以通过高质量的多样化的滤镜来实现不同采样率,不同分辨率音视频之间的转换。简而言之:ffmpeg几乎是个万能的格式转换工具:转封装,转码,滤镜。
我们先看看ffmpeg转封装的功能,所谓转封装就是将音视频流从某种多媒体文件容器中抽取出来,不改变音视频的编码方式的前提下,将抽取出来的音视频流按照另外一种文件容器格式存储进去。以MP4文件转FLV文件格式为例:
ffmpeg -i 1.mp4 -codec copy -f flv 1mp4.flv -hide_banner
命令行输出可以分三部分来看:
第一部分:输入文件格式信息,内含音视频流信息。
第二部分:输出文件格式信息,对应的音视频流信息。
第三部分:转换过程。
1. 告知了流映射方式,stream #0:0 ->#0:0(copy) 表示第0个输入文件的第0个流 映射 到第0个输出文件的第0个流,方式为copy,即不转码;stream #0:1 ->#0:1(copy) 表示第0个输入文件的第1个流 映射 到第0个输出文件的第1个流,方式为copy,即不转码
2. 后续展示转换过程中产生的数据,已转换的帧数,帧率,比特数,时长,码率转换速度等等信息。
ffmpeg的详细介绍另开一篇文章:[总结]FFMPEG命令行工具之ffmpeg详解。