通过ffprobe-show_framesinput.dv命令可以查看视频文件中的赖信息,输出的顺信息将使用FRAME标签括起来
[FRAME] media_type=video stream index=0 key_frame=l pkt pts=80 pkt_pts_time=0.080000 pkt dts=80 pkt dts_time=0.080000 begt effort timegtamp=80 best effort timestamp_time=0.080000 pkt_duration=N/A pkt duration time=N/A pkt_pog=344 pkt_size=8341 width=1280 height=714 pix fmt=yuv420p 6ample_aspect_ratio=1:1 pict_type=T coded picture number=0 display picture number=0 interlaced frame=0 top_field first=o repeat pict=0 [/FRAME]
通过-show_frames参数可以查看每一帧的信息,下面就来介绍一下其中重要的信息,具体见表
属性 |
说明 |
值 |
media type |
的类型(视频、音频,字幕等) |
video |
stream index |
帧所在的索引区域 |
0 |
key_frame |
是否为关键顿 |
1 |
pktpts |
Frame包的pts |
0 |
pkt pis time |
Frame包的ps的时间显示 |
0.08 |
pkt dts |
Frame包的dts |
80 |
pkt dis time |
Frame包的dts的时间显示 |
0.08 |
pkt duration |
Frame包的时长 |
NIA |
pkt duration time |
Frame包的时长时间显示 |
NIA |
pkt pos |
Frame包所在文件的偏移位置 |
344 |
width |
显示的宽度 |
1280 |
height |
显示的高度 |
714 |
pix fimt |
倾的图像色彩格式 |
yuv420p |
piet type |
侦类型 |
I |
通过-show streams参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM标签括起来:
1eve1=31如以上输出内容所示,从中可以看到流的信息,具体属性及说明见表
属性 |
说明 |
值 |
index |
流所在的索引区域 |
0 |
codecnamc |
编码名 |
h264 |
codee long name |
编码全名 |
MPEG-4 part 10 |
profile |
编码的profile |
High |
属性 |
说明 |
值 |
level |
编码的level |
31 |
has b frames |
包含B赖信息 |
2 |
codec type |
编码类型 |
video |
codec timebase |
编码的时间截计算基础单位 |
1750 |
pix fmt |
图像显示的色彩格式 |
yuv420p |
codedwidth |
图像的宽度 |
1280 |
coded height |
图像的高度 |
714 |
codec tag string |
编码的标签数据 |
[0][0][0][0] |
Tframe rateavg frame rate |
实际硕率平均帧率 |
25/125/ |
time base |
时间基数(用来进行timestamp计算) |
1/1000 |
bit rate |
码率 |
200000 |
xbit ratemax |
最大码率 |
N/A |
nb_frames |
帧数 |
N/A |
2.3 ffplay常用命令
在编译旧版本FFmpeg源代码时,如果系统中包含了SDL-1.2版本,就会默认将ffplay编译生成出来,如果不包含SDL-1.2或者版本不是SDL-l.2时,将无法生成ffplay文件,所以,如果想使用flay进行流媒体播放测试,则需要安装SDL-1.2.而在新版本的FFmpeg源代码中,需要SDL-2.0之后的版本才能有效生成ffplay.。
在FFmpeg中通常使用ffplay作为播放器,其实ffplay同样也可以作为很多音视频数据的图形化分析工具,通过ffplay可以看到视频图像的运动估计方向、音频数据的波形等.
下表是ffplay的基础参数
参数 | 说明 |
x | 强制设置视频显示窗口的宽度 |
y | 强制设置视频显示窗口的高度 |
s | 设置视频显示的宽高 |
fs | 强制全屏显示 |
an | 屏蔽音频 |
vn | 屏蔽视频 |
sn | 屏蔽字幕 |
ss | 根据设置的秒进行定位拖动 |
t | 设置播放视频/音频的长度 |
bytes | 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动 |
nodisp | 关闭图形化显示窗口 |
f | 强制使用设置的格式进行解析 |
window title | 设置显示窗口的标题 |
af | 设置音频的滤镜 |
codec | 强制使用设置的codec进行解码 |
autorotate | 自动旋转视频 |
下面这个表是ffplay高级参数
参数 |
说明 |
ast |
设置将要播放的音额流 |
vst |
设置将要播放的视频流 |
sst |
设置将要播放的字幕流 |
stats |
输出多媒体播放状态 |
fast | 非标准化规范的多媒体兼容优化 |
sync |
音视频同步设置可根据音频时间、视频时间或者外部扩展时间进行参考 |
autoexit |
多媒体播放完毕之后自动退出fplay,fplay默认播放完毕之后不退出播放器 |
cxitonkeydown |
当有按键按下事件产生时退出ffplay |
exitonmousedown |
当有鼠标按键事件产生时退出fplay |
loop |
设置多媒体文件循环播放的次数 |
framedrop |
当CPU资源占用过高时,自动丢顿 |
infbuf |
设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景 |
vf |
视频滤镜设置 |
acodec |
强制使用设置的音频解码器 |
vcodec |
强制使用设置的视频解码器 |
scodec |
强制使用设置的字幕解码器 |
第3章 FFmpeg转封装
3.1.1MP4格式标准介绍
MP4格式标准为IS0-14496Part12、IS0-14496Part14,标准内容并不是特别多,下面就来着重介绍一些重要的信息。
如果要了解MP4的格式信息,首先要清楚几个概念,具体如下。
- MP4文件由许多个Box与FullBox组成
- 每个Box由Header和Data两部分组成
- FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和24位的f1ags标志
- Header包含了整个Box的长度的大小(size)和类型(type),当size等于O时,代表这个Box是文件的最后一个Box。当siz等于1时,说明Box长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。当Type为uuid时,说明这个Box中的数据是用户自定义扩展类型
- Data为Box的实际数据,可以是纯数据,也可以是更多的子Box
- 当一个Box中Data是一系列的子Box时,这个Box又可以称为Container(容器)
Box MP4文件中Box的组成可以用表3-1所示的列表进行排列,表3-1中标记“V”的Box为必要Box,否则为可选Box。
第4章FFmpeg转码
4.1.2H.264编码举例
3.H.264的proffle与level设置
这里的profile(档次)与level(等级)的设置与H.264标准文档ISO-14496-Part10中描述的profile、level的信息基本相同,×264编码器支持Baseline、Extented、Main、High、High10、High422、High444共7种profile参数设置,根据profile的不同,编码出来的视频的很多参数也有所不同,具体的情况可以参考表。
ExtentedMainBaseline |
High | High10 | High4:2:2 | High4:4:4(Predictive) | |||
1与P分片 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
B分片 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
SI和SP分片 | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
多参考幢 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
环路去块滤波 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
CAVLC愉编码 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
CABAC编码 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
FMO | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
ASO | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
RS | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
数据分区 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 |
场编码PAFF/MBAFF | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
42:0色度格式 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
4:0:0色度格式 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
42:2色度格式 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 支持 |
44:4色度格式 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
8位采样深度 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
9和10位采样深度 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
11至14位采样深度 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
8×8与4×4转换适配 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
量化计算矩阵 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
分离Cb和Cr量化参数控制 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
分离色彩平面编码 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
分离无损编码 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
4.2FFmpeg输出AAC
在音视频流中,无论直播与点播,AAC都是目前最常用的一种音频编码格式,例如RTMP直播、HLS直播、RTSP直播、FLV直播、FLV点播、MP4点播等文件中都是常见的AAC音视频。
与MP3相比,AAC是一种编码效率更高、编码音质更好的音频编码格式,常见的使用AAC编码后的文件存储格式为m4a,如在iPhone或者iPad中即为m4a.FFmpeg可以支持AAC的三种编码器具体如下。
- aac:FFmpeg本身的AAC编码实现
- libfaac:第三方的AAC编码器
- ·libfdk_aac:第三方的AAC编码器
后两种编码器为非GPL协议,所以使用起来需要注意,在预编译时需要注意采用nonfree的支持。
4.2.1AAC音频质量对比
AAC-LC的音频编码可以采用libfaac、libfdk aac、FFmpeg内置AAC三种,其质量顺序排列如下。
- libfdk aac音频编码质量最优
- FFmpeg内置AAC编码次于libfdk aac但优于libfaac
- libfaac在FFmpeg内置AAC编码为实验品时是除了libfdk_aac之外的唯一选择
第5章 FFmpeg流媒体
AAC-LC的音频编码可以采用libfaac、libfdk_aac、FFmpeg内置AAC三种,其质量顺序排列如下
libfdkaac音频编码质量最优
FFmpeg内置AAC编码次于libfdkaac但优于libfaac
libfaac在FFmpeg内置AAC编码为实验品时是除了Iibfdkaac之外的唯一选择。
随着互联网、移动互联网的发展,人们获取信息的方式开始从纸质媒体转向互联网文字媒体,又从文字媒体转向音视频流媒体。音视频流媒体又称为“流媒体”,而用于处理流媒体的压缩、录制、编辑操作,开源并强大的工具屈指可数,FFmpeg就是常见的流媒体处理工具。
解析trak子容器
trak容器中定义了媒体文件中的一个track的信息,一个媒体文件中可以包含多个trak,每个trak都是独立的,具有自己的时间和空间占用的信息,每个trak容器都有与它关联的media容器描述信息。trak容器的主要使用目的具体如下。
- 包含媒体数据的引用和描述(media track)
- 包含modifier track信息
- 流媒体协议的打包信息(hint track),hint track可以引用或者复制对应的媒体采样数据
hint track和modifier track必须保证完整性,同时要与至少一个media track一起存在。
一个trak容器中要求必须要有一个Track Header Atom(tkhd)、一个Media Atom(mdia),其他的Atom都是可选的,例如如下的atom选项。
- Track剪辑容器:Track Clipping Atom(clip)
- Track画板容器:Track Matte Atom(matt)
- Edit容器:Edit Atom(cdts)
- Track参考容器:Track Reference Atom(tref)
- Track配置加载容器:Track Load Settings Atom(load)
- Track输出映射容器:Track Input Map Atom(imap)
- 用户数据容器:User Data Atom(udta)