在编译FFmpeg源代码时,如果系统中包含了SDL-1.2版本时,会默认将ffplay编译生成出来,如果不包含SDL-1.2或者版本不是SDL-1.2时,无法生成ffplay文件,所以,生成如果想使用ffplay进行流媒体播放测试,是需要安装SDL-1.2的。 通常使用ffplay作为播放器,其实ffplay不但可以做播放器,同样可以作为很多图像化音视频数据的分析根据,通过ffplay可以看到视频图像的运动估计方向,音频数据的波形等,在本节将会有更多的参数进行介绍并举例。
6.1 ffplay 常用参数 ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎,format引擎,以及filter引擎的工具,并且也可以做可视化的媒体参数分析,可以通过ffplay --help 进行查看:
如上图,大多数是前面已经介绍过的参数,还有些是未介绍过的
参数 | 说明 |
---|---|
X | 强制设置视频显示窗口的宽度 |
y | 强制设置视频显示窗口的高度 |
S | 设置视频显示的宽高 |
fs | 强制全屏显示 |
an | 屏蔽音频 |
vn | 屏蔽视频 |
Sn | 屏蔽字幕 |
ss | 根据设置的秒进行定位拖动 |
t | 设置播放视频/音频长度 |
Bytes | 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动 |
Nodisp | 关闭图形化显示窗口 |
f | 强制使用设置的格式进行解析 |
window_title | 设置显示窗口的标题 |
af | 设置音频的滤镜 |
Codec | 强制使用设置的codec进行解码 |
autorotate | 自动旋转视频 |
常见参数可以手动进行尝试: 如果希望从视频的第30秒开始播放,播放10秒钟的文件,则可以使用如下命令 #ffplay -ss 30 -t 10 input.mp4 如果希望视频播放时播放器的窗口显示标题为自定义标题,则使用如下命令 ffplay -window_title "Hello World, This is a sample" output.mp4 显示窗口如下图:
例如使用ffplay打开网络直播流,可以使用命令 # ffplay -window_title "播放测试" rtmp://up.v.test.com/live/stream
如图播放的视频为实时网络直播视频流。 根据上图可以看到播放器播放的窗口标题已经显示为自定义设置的内容。 基本参数介绍完毕,下面进一步介绍ffplay的高级一些的参数。
6.2 ffplay高级参数 通过使用ffplay –help参数看到帮助信息比较多,其中包含了高级参数介绍,下面详细介绍一下
参数 | 说明 |
---|---|
ast | 设置将要播放的音频流 |
vst | 设置将要播放的视频流 |
sst | 设置将要播放的字幕流 |
Stats | 输出多媒体播放状态 |
Fast | 非标准化规范的多媒体兼容优化 |
sync | 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考 |
autoexit | 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器 |
exitonkeydown | 当有按键按下事件产生时退出ffplay |
exitonmousedown | 当有鼠标按键事件产生时退出ffplay |
loop | 设置多媒体文件循环播放次数 |
framedrop | 当CPU资源占用过高时,自动丢帧 |
infbuf | 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景 |
vf | 视频滤镜设置 |
acodec | 强制使用设置的音频解码器 |
vcodec | 强制使用设置的视频解码器 |
scodec | 强制使用设置的字幕解码器 |
下面根据这些参数与前面介绍过的一些参数进行组合: 例如从20秒播放一个视频,播放时长为10秒钟,播放完成后自动退出ffplay,播放器的窗口标题为”Hello World”,为了确认播放时长正确,可以通过系统命令time查看命令运行时长 #time ffplay -window_title "Hello World" -ss 20 -t 10 -autoexit output.mp4 该命令执行完毕之后输出如下: real 0m10.783s user 0m8.401s sys 0m0.915s 例如强制使用H264解码器解码mpeg4的视频,将会报错: # ffplay -vcodec h264 output.mp4
使用h264的解码器解码mpeg4时会得到no frame的错误,视频也解析不出来。 前面举过的例子中,看到比较多的是单节目的流,下面举一个多节目的流,常见于**行业的视频:
当视频流中出现多个Program时,播放Program与常规的播放方式则有所不同,需要指定对应的流,可以通过vst、ast、sst参数指定,例如希望播放Program 13中的音视频流,则通过如下命令行指定: #ffplay -vst 4 -ast 5 ~/Movies/movie/ChinaTV-11.ts 播放效果如图:
通过Program 13中的信息可以看到该流名称为service_name对应的值是CCTV 9,而指定音视频流播放之后播放出来的图像也能够与之对应。 如果使用ffplay播放视频时希望加载字幕文件,则可以通过加载ASS或者SRT字幕文件来解决,下面举一个加载SRT字幕的例子,首先编辑SRT字幕文件,内容如下:
然后通过filter将字幕文件加载如播放数据中,使用命令 # ffplay -window_title "Test Movie" -vf "subtitles=input.srt" output.mp4 通过这条命令可以看到播放的效果如下
6.3 ffplay的数据可视化分析应用 使用ffplay除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如当播放音频文件时,不确定文件的声音是否正常,噪声数据等分析,可以直接使用ffplay播放音频文件,播放的时候将会把解码后的音频数据以音频波形显示出来: #ffplay -showmode 1 output.mp3
从图中可以看到,音频的播放时的波形可以通过振幅显示出来,可以用来看到音频的播放情况。 例如当播放视频时体验解码器是如何解码每个宏块的,可以使用命令 # ffplay -debug vis_mb_type -window_title "show vis_mb_type" -ss 20 -t 10 -autoexit output.mp4 显示窗口内容
在输出的视频信息中,可以看到不同颜色的方块,下面来说明一下这些颜色代表着什么信息:
颜色 | 宏块类型条件 | 说明 |
---|---|---|
IS_PCM (MB_TYPE_INTRA_PCM) | 无损(原始采样不包含预测信息) | |
(IS_INTRA && IS_ACPRED) || IS_INTRA16x16 | 16x16帧内预测 | |
IS_INTRA4x4 | 4x4帧内预测 | |
IS_DIRECT | 无运动向量处理(B帧分片) | |
IS_GMC && IS_SKIP | 16x16跳宏块(P或B帧分片) | |
IS_GMC | 全局运动补偿(与H264无关) | |
!USES_LIST(1) | 参考过去的信息(P或B帧分片) | |
!USES_LIST(0) | 参考未来的信息(B帧分片) | |
USES_LIST(0) && USES_LIST(1) | 参考过去和未来信息(B帧分片) |
例如通过ffplay查看B帧预测与P帧预测信息,希望将信息在窗口中显示出来,使用命令 # ffplay -vismv pf output.mp4 显示效果如图
通过图中的箭头可以看到p帧运动估计的信息 而vismv参数则是用来显示图像解码时的运动向量信息的,参数可以设置三种类型的运动向量信息显示
参数 | 说明 |
---|---|
pf | P帧向前运动估计显示 |
bf | B帧向前运动估计显示 |
bb | B帧向后运动估计显示 |
这个vismv参数将会在未来被替换掉,未来更多的是使用codecview这个filter来进行设置,如上面图像,也可以通过下面这条命令完成 # ffplay -flags2 export_mvs -ss 40 ~/Movies/objectC/facebook.mp4 -vf codecview=mv=pf bf bb