在编译旧版本 FFmpeg 源代码时,如果系统中包含了 SDL-1.2 版本 ,就会默认将 ffplay 编译生成出来,如果不包含 SDL-1.2 或者版本不是 SDL-1.2 时,将无法生成 ffplay 文件,所以,如果想使用 ffplay 进行流媒体播放测试,则需要安装 SDL-1.2。而在新版本的 FFmpeg 源代码中,需要 SDL-2.0 之后的版本才能有效生成 ffplay。
在FFmpeg 中通常使用 ffplay 作为播放器 ,其实 ffplay 同样也可以作为很多音视频数据的图形化分析工具,通过 ffplay 可以看到视频图像的运动估计方向、音频数据的波形等,本节将会介绍更多的参数并举例说明。
ffplay 不仅仅是播放器,同时也是测试 ffmpeg 的 codec 引擎、 format 引擎,以及 filter 引擎的工具,并且还可以进行可视化的媒体参数分析,其可以通过 ffplay --help 进行查看:
如上述帮助信息的输出所示,大多数都是前面已经介绍过的参数,这里就不再一一赘述,一些未介绍的参数说明见表 2-8。
常见参数可以手动进行尝试,下面列举几个示例。
ffplay -ss 30 -t 10 input.mp4
通过使用 ffplay --help 参数可以看到比较多的帮助信息,其中包含了高级参数介绍,下面就来详细介绍一下,具体见表 2-9。
下面将这些参数与前面介绍过的一些参数进行组合,列举几个示例。
例如从 20 秒播放一个视频,播放时长为 10 秒钟,播放完成后自动退出 ffplay ,播器的窗口标题为“Hello World”,为了确认播放时长正确,可以通过系统命令 time 查看命令运行时长:
time ffplay -window_title “Hello World” -ss 20 -t 10 -autoexit output.mp4
该命令执行完毕输出如下:
从输出的内容分析来看,实际消耗时间为 10.783 秒,用户空间消耗 8.401 秒,情况本相符。
例如强制使用 H.264 解码器解码 MPEG4 的视频,将会报错:
ffplay -vcodec h264 output.mp4
命令行执行之后的输出信息如下:
从输出的信息可以 到,使用 H.264 的解码器解码 MPEG4 会得到 no frame 的错误,视频也解析不出来。
前面举过的例子中,我们看到的比较多的是单节目的流,下面列举一个多节目的流,常见于广电行业的视频
当视频流中出现多个 Program 时,播放 Program 与常规的播放方式有所不同,需要指定对应的流,可以通过 vst、ast、sst 参数来指定,例如希望播放 Program 13 中的音视频流,视频流编号为 4,音频流编号为 5,则可以通过如下命令行进行指定:
ffplay -vst 4 -ast 5 -/Movies/movie/ChinaTV-11.ts
播放效果如图 2-6 所示。
通过 Program 13 中的信息可以看到该流的名称为 service_name ,对应的值是 BBB 9,而指定音视频流播放之后播放出来的图像也能够与之对应。
如果使用 ffplay 播放视频时希望加载字幕文件,则可以通过加载 ASS 或者 SRT 字幕文件来解决,下面列举一个加载 SRT 字幕的例子,首先编辑 SRT 字幕文件,内容如下:
然后通过 filter 将字幕文件加载到播放数据中,使用命令如下:
ffplay -window_title “Test Movie” -vf “subtitles=input.srt” output.mp4
通过这条命令可以看到播放的效果如图 2-7 所示。
从图 2-7 中可以看出,视频中已经将 SRT 格式的文字字幕加入到视频中并展现了出来。
使用 ffplay 除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如播放音频文件时,如果不确定文件的声音是否正常,则可以直接使用 ffplay 播放音频文件,播放的时候其将会把解码后的音频数据以音频波形的形式显示出来,命令行执行后的效果如图 2-8 所示,命令如下:
ffplay -showmode 1 output.mp3
从图 2-8 中可以看到,音频播放时的波形可以通过振幅显示出来,可以用来查看音频的播放情况。
例如,当播放视频时想要体验解码器是如何解码每个宏块的,可以使用如下命令:
ffplay -debug vis_mb_type -window_title “show vis_mb_type” -ss 20 -t 10 -autoexit output.mp4
显示窗口内容如图 2-9 (见彩插)所示。
我的ffmpeg版本是4.2.7,没有vis_mb_type选项,只有mb_type选项:
ffplay -debug mb_type -window_title "show mb_type" -ss 0 -t 10 -autoexit groundhog_h264.mp4
在输出的视频信息中,可以看到不同颜色的方块,下面就来说明一下这些颜色分别代表什么信息,具体见表 2-10 (见彩插)。
例如通过 ffplay 查看 B 帧预测与 P 帧预测信息,希望将信息在窗口中显示出来,可使用如下命令:
ffplay -vismv pf output.mp4
显示效果如图 2-10 所示。
根据图 2-10 中的箭头可以看到 P 帧运动估计的信息,而 vismv 参数则是用来显示图像解码时的运动向量信息的,可以设置三种类型的运动向量信息显示,具体见表 2-11。
这个 vismv 参数将会在未来被替换掉,未来更多的是使codecview 这个滤镜来进行设置,如图 2-10 所示,也可以通过下面这条命令来完成:
ffplay -flags2 +export_mvs -ss 40 output.mp4 -vf codecview=mv=pf+bf+bb
命令解释: 这是一个使用FFplay的命令行。FFplay是一个非常简单且轻便的媒体播放器,由FFmpeg项目提供。
让我们来解析一下这个命令:
ffplay
:这是执行程序的名称,它会开始运行FFplay。
-flags2 +export_mvs
:这是传递给FFplay的选项,使得在解码过程中导出运动矢量(motion vectors)。这对于分析视频编码和调试编解码器很有用。
-ss 40
:这个选项表示从视频的第40秒开始播放。
output.mp4
:这是要播放的文件名,即"output.mp4"。
-vf codecview=mv=pf+bf+bb
:这是一个过滤器图表(filtergraph)设置。在这里,codecview
过滤器用于可视化运动矢量。
mv=pf+bf+bb
是该过滤器的参数,其中:
pf
表示显示前向预测的运动矢量,bf
表示显示双向预测的运动矢量,bb
表示显示反向预测的运动矢量。总的来说,这条命令是使用 FFplay 从 output.mp4 文件的第 40
秒开始播放,并且显示出了视频的运动矢量,包括前向、反向和双向预测的运动矢量。这可以用于分析视频的编码方式。
ffplay -flags2 +export_mvs -ss 40 groundhog_h264.mp4 -vf codecview=mv=pf+bf+bb
本章对 FFmpeg 中的 ffmpeg ffprobe ffplay 进行了详细的介绍,可简要总结如下:
通过对以上三个应用程序的介绍,相信大家已经了解了多媒体信息中基本信息的获取方式 ,并且学习到了一定的使用规则。至此,FFmpeg 工具使用的基础部分已经介绍完毕。