25.调试和测试
我们可以使用特定的过滤器,选项和源,来检测错误或测试多个输入,参数,性能等。当控制台中的输出内容过多时,我们可以使用 -report 选项将输出保存到文件中,名称为 ffmpeg-yyyymmdd-hhmmss.log ,其中 yyyymmdd-hhmmss 表示当前的日期和时间。
debug,debug_ts 和 fdebug 选项
FFmpeg 中的基本调试工具是 -debug 选项,它有 17 个可采用的值,描述如下:
例如,我们将 mptestsrc 保存为 output.mp4 ,此时使用 debug 选项并赋值 mmco:
ffmpeg -debug mmco -f lavfi -i mptestsrc -t 0.5 output.mp4
在输出中,有 12 行是用来描述独立帧的,其中的术语解释:
- QP:量化参数
- NAL:网络抽象层单元
- Slice:B帧:双向预测画面 I帧:内编码帧 P帧:预测
另一个调试的选项是 -debug_ts ,它会在处理期间打印时间戳信息,例如,我们修改之前的命令为 0.1 秒长:
ffmpeg -debug_ts -f lavfi -i mptestsrc -t 0.1 output.mp4
控制台中中的输出如下所示:
选项 -fdebug 仅有一个可使用的值 ts,它经常和 -debug_ts 选项一起使用用于测试,如调试 DTS(decoding timestamp:编码时间戳)和 PTS(presentation timestamp:显示时间戳)。我们修改之前的命令,并将新加入的行列出如下:
ffmpeg -fdebug ts -f lavfi -i mptestsrc -t 0.1 output.mp4
错误检测的标识符
ffmpeg 中可以使用 -err_detect 选项来执行错误的检测,其描述如下:
例如,检测一个不正确的比特流长度,命令如下:
ffmpeg -report -err_detect buffer -i input.avi output.mp4
日志等级设置
日志的等级决定了有哪些内容能够显示为控制台输出,它可取的值有如下几个:quiet , panic , fatal , error , warning , info , verbose , debug 。我们可以使用 -v 或者 -loglevel 选项来设置日志等级,例如将日志等级设置为 verbose,命令如下:
ffmpeg -loglevel verbose -i input.avi output.mp4
时间基配置测试
过滤器 asettb 和 settb 用于测试时间基配置,asettb 用于音频输入,settb 用于视频输出。这两个过滤器的参数相同,其描述如下:
下面的例子分别设置时间基,第一个设置为 AVTB ,第二个设置为 0.3,第三个将输入的时间基乘以 1.5 倍,命令如下:
ffmpeg input.mpg -vf settb=AVTB output.mpg
ffmpeg input.mpg -vf settb=0.3 output.mpg
ffmpeg input.mpg -vf settb=1.5*intb output.mpg
测试编码特征
我们可以使用来自 MPlayer 的 mptestsrc 过滤器来生成多个测试模式,其描述如下:
下面是它特定值的显示案例:
测试图案
为了检测 bug ,FFmpeg 提供了 3 个特殊的视频源用于视频测试。除了 color 之外,它们的参数相同,color 源在《图片处理》一张中有描述。
RGB 测试图案
如果想要对 RGB 或者 BGR 进行测试,我们可以使用 rgbtestsrc 视频源。
ffplay -f lavfi -i rgbtestsrc
有滚动渐变和时间戳的颜色图案
如果想要使用类似 TV 图案的混合颜色图案,我们可以使用 testsrc 视频源:
ffplay -f lavfi -i testsrc
SMPTE 条图案
我们可以使用 SMPTE (Society of Motion Picture and Television Engineers)颜色条图案,命令如下:
ffplay -f lavfi -i smptebars
简单数据包转储或带负载(十六进制)
为了进行更精确的调试,可以使用 -hex 选项转储负载,通常配合使用 -report 选项将结果保存到当前目录中的文件中。使用此选项时,处理速度会非常慢而报告文件会更大。这个命令的例子是:
ffmpeg -dump -hex -report -i input.mpg output.flv
使用的CPU时间和消耗的内存
可以使用 -benchmark 或 -benchmark_all 选项来显示使用的 CPU 时间和消耗的内存,这两个选项的输出类似:
- -benchmark 选项在编码完成后显示结果
- -benchmark_all 在编码期间以多步显示结果
不支持最大内存消耗数据的电脑系统不显示相应的值而显示 0 。这两个选项都是 global option,都应该放在命令开始的地方,例如:
ffmpeg -benchmark -i input.avi output.webm
上述最后一行输出以 bench 开头,utime 表示我们处理命令使用的 CPU 时间。benchmark_all 选项在数据处理过程中显示结果,示例如下:
ffmpeg -benchmark_all -i input.avi output.mpg