25.调试和测试

为了检测错误并测试各种输入,参数,性能等,我们可以使用多个FFmpeg过滤器,选项和来源。 当控制台输出很长时,-report选项会将测试结果保存到名为ffmpeg-yyyymmdd-hhmmss.log的文件中,其中斜体部分表示当前日期和时间。

debug, debug_ts and fdebug选项

FFmpeg中的基本调试工具是一个-debug选项,其中在下表中描述了17个可能值:

描述 打印关于所选音频,字幕或视频流的特定调试信息
语法 -debug[:stream_specifier]
可用值的描述
pict 图片信息
rc 速率控制
bitstream 比特流
mb_type 宏块(MB)类型
qp 每块量化参数(QP)
mv 运动矢量
dct_coeff DCT系数
skip 进度跳跃
startcode 起始码
pts 演示文稿时间戳
er 错误识别
mmco 内存管理控制操作(H.264)
bugs bugs(错误)
vis_qp 可视化量化参数(QP),较低的QP是更绿色的
vis_mb_type 可视化块类型
buffers 图片缓冲区分配
thread_ops 线程操作

例如,我们将mptestsrc源的短输出保存为具有mmco值的MP4(H.264)文件:

  1. ffmpeg -debug mmco -f lavfi -i mptestsrc -t 0.5 output.mp4

向控制台输出添加了12行描述各个帧; 包含的术语说明:

  • QP - 量化参数
  • NAL - 网络抽象层单元
  • 切片:B - 双向预测,I - 帧内编码,P - 预测

25.调试和测试 - 图1

另一个调试选项是-debug_ts,它可以在处理期间打印时间戳信息,例如我们可以修改前面的示例并仅使用0.1秒(3帧):

  1. ffmpeg -debug_ts -f lavfi -i mptestsrc -t 0.1 output.mp4

向控制台输出添加下一行:

25.调试和测试 - 图2

选项-fdebug只有1个可能的值ts,通常与-debug_ts选项一起用于各种测试,例如调试DTS(解码时间戳)和PTS(演示时间戳)关系。 使用上例中的修改后的命令,控制台输出显示命令后列出的添加行:

  1. ffmpeg -fdebug ts -f lavfi -i mptestsrc -t 0.1 output.mp4

25.调试和测试 - 图3

用于错误检测的标志

检测ffmpeg处理中的错误可以通过表中描述的-err_detect选项指定:

描述 检测一个错误,该标志指定了哪种类型
语法 -err_detect[:stream_specifier] flag
可用标志的描述
aggressive 考虑一个理智的编码器不应该做的错误
bitstream 检测比特流指定偏差
buffer 检测不合适的比特流长度
careful 考虑违反规范并且没有被视为错误的东西
compliant 将所有规范不合规视为错误
crccheck 验证嵌入式CRC
explode 终止对较小错误检测的解码

例如,要检测不正确的比特流长度,我们可以使用以下命令:

  1. ffmpeg -report -err_detect buffer -i input.avi output.mp4

日志记录级别设置

日志记录级别确定处理过程中控制台输出中显示的内容,可用的修改值包括:安静,恐慌,致命,错误,警告,信息,详细,调试。 要设置日志记录级别,我们可以使用选项-v或-loglevel选项,例如对于详细级别,我们可以使用以下命令:

  1. ffmpeg -loglevel verbose -i input.avi output.mp4

时间基配置测试

过滤器asettb和settb用于测试时基配置,asettb用于音频输入并用于视频输入的建立。 两个过滤器都具有相同的参数,并在公共表中进行了描述:

25.调试和测试 - 图4

描述 两个滤镜都设置时基,它将用于输出帧时间戳。 此设置用于测试时基配置和类似功能。 两个过滤器的语法和参数都相同
语法 settb=expr expr的结果是一个有理数,可以包含下面描述的变量
表达式中可用的变量
AVTB 设置默认时基值(AVTB =默认时基)
intb 输入时基
sr 采样率,仅适用于asettb

下面的例子设置时基,第一个设置为AVTB,第二个设置为0.3,第三个设置为输入时基的1.5倍。

  1. ffmpeg input.mpg -vf settb=AVTB output.mpg
  2. ffmpeg input.mpg -vf settb=0.3 output.mpg
  3. ffmpeg input.mpg -vf settb=1.5*intb output.mpg

测试编码功能

要为离散余弦亮度,色度,亮度和色度的频率和幅度等生成各种测试图案,我们可以使用MPlayer项目中的mptestsrc滤镜,该滤镜在表中描述:

25.调试和测试 - 图5

描述 生成与色度,亮度和其他视频属性相关的各种测试。 如果没有参数使用,则会执行所有测试,直到用户停止该过程
语法 mptestsrc[=t=test_type[:d=duration[:r=rate]]]
参数的描述
test, t - 所选测试的名称,可用测试为dc_luma,dc_chroma,freq_luma,freq_chroma,amp_luma,amp_chroma,cbp,mv,ring1,ring2 - 默认值是&##34;all&##34;
duration, d 以秒为单位或HH:MM:SS格式的测试持续时间
r 帧率,默认值是25

下表说明了特定测试值的样本。

模式 句法 图片
DC亮度 mptest=t=dc_luma 25.调试和测试 - 图6
DC色度 mptest=t=dc_chroma 25.调试和测试 - 图7
亮度频率 mptest=t=freq_luma 25.调试和测试 - 图8
色度频率 mptest=t=freq_chroma 25.调试和测试 - 图9
亮度幅度 mptest=t=amp_luma 25.调试和测试 - 图10
色度幅度 mptest=t=amp_chroma 25.调试和测试 - 图11
编码块模式(CBP) mptest=t=cbp 25.调试和测试 - 图12
运动矢量(MV) mptest=t=mv 25.调试和测试 - 图13
test ring 1 mptest=t=ring1 25.调试和测试 - 图14
test ring 2 mptest=t=ring2 25.调试和测试 - 图15

测试模式

检测各种错误并为视频测试提供源FFmpeg包含下面列出的3个特殊视频源。 除颜色参数外,它们与“图像处理”章节“创建图像”一节中介绍的颜色来源共享相同的参数。

RGB测试模式

要测试可用的RGB和BGR色彩空间是名为rgbtestsrc的视频源

  1. ffplay -f lavfi -i rgbtestsrc

25.调试和测试 - 图16

滚动渐变和时间戳的颜色模式

要生成类似于TV模式的视频模式,可以使用testsrc视频源与命令:

  1. ffplay -f lavfi -i testsrc

25.调试和测试 - 图17

SMPTE条形图案模式

可以使用以下命令创建来自电影和电视工程师协会(SMPTE)的彩条图案:

  1. ffplay -f lavfi -i testsrc

25.调试和测试 - 图18

简单的数据包转储或有效负载(十六进制)

为了更精确的调试,也可以使用-hex选项转储有效负载,通常使用-report选项将结果保存到当前目录中的文件。 使用此选项,处理速度非常慢,报告文件更大。 该命令的示例是:

  1. ffmpeg -dump -hex -report -i input.mpg output.flv

CPU使用时间和内存消耗

要在处理过程中显示使用的CPU时间和内存消耗,我们可以使用产生类似输出的-benchmark或-benchmark_all选项:

  • -benchmark选项显示编码后的结果

  • -benchmark_all以各种步骤显示编码过程中的结果

    不支持最大内存消耗数据的计算机系统将显示0而不是数值。 这两个选项都是全局选项,并在命令的开头输入,例如:

ffmpeg -benchmark -i input.avi output.webm

25.调试和测试 - 图19

在控制台输出的末尾添加一条从工作台开始的行:utime表示在处理过程中CPU(计算机的中央处理单元)使用的时间。 benchmark_all选项显示处理过程中的结果,完成后的屏幕显示在下图中。

  1. ffmpeg -benchmark_all -i input.avi output.mpg

25.调试和测试 - 图20