《FFmpeg Basics》中文版-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)文件:
ffmpeg -debug mmco -f lavfi -i mptestsrc -t 0.5 output.mp4
向控制台输出添加了12行描述各个帧; 包含的术语说明:
- QP - 量化参数
- NAL - 网络抽象层单元
切片:B - 双向预测,I - 帧内编码,P - 预测
另一个调试选项是-debug_ts,它可以在处理期间打印时间戳信息,例如我们可以修改前面的示例并仅使用0.1秒(3帧):
ffmpeg -debug_ts -f lavfi -i mptestsrc -t 0.1 output.mp4
向控制台输出添加下一行:
选项-fdebug只有1个可能的值ts,通常与-debug_ts选项一起用于各种测试,例如调试DTS(解码时间戳)和PTS(演示时间戳)关系。 使用上例中的修改后的命令,控制台输出显示命令后列出的添加行:
ffmpeg -fdebug ts -f lavfi -i mptestsrc -t 0.1 output.mp4
用于错误检测的标志
检测ffmpeg处理中的错误可以通过表中描述的-err_detect选项指定:
描述 | 检测一个错误,该标志指定了哪种类型 |
---|---|
语法 | -err_detect[:stream_specifier] flag |
可用标志的描述 | |
aggressive | 考虑一个理智的编码器不应该做的错误 |
bitstream | 检测比特流指定偏差 |
buffer | 检测不合适的比特流长度 |
careful | 考虑违反规范并且没有被视为错误的东西 |
compliant | 将所有规范不合规视为错误 |
crccheck | 验证嵌入式CRC |
explode | 终止对较小错误检测的解码 |
例如,要检测不正确的比特流长度,我们可以使用以下命令:
ffmpeg -report -err_detect buffer -i input.avi output.mp4
日志记录级别设置
日志记录级别确定处理过程中控制台输出中显示的内容,可用的修改值包括:安静,恐慌,致命,错误,警告,信息,详细,调试。 要设置日志记录级别,我们可以使用选项-v或-loglevel选项,例如对于详细级别,我们可以使用以下命令:
ffmpeg -loglevel verbose -i input.avi output.mp4
时间基配置测试
过滤器asettb和settb用于测试时基配置,asettb用于音频输入并用于视频输入的建立。 两个过滤器都具有相同的参数,并在公共表中进行了描述:
描述 | 两个滤镜都设置时基,它将用于输出帧时间戳。 此设置用于测试时基配置和类似功能。 两个过滤器的语法和参数都相同 |
---|---|
语法 | settb=expr expr的结果是一个有理数,可以包含下面描述的变量 |
表达式中可用的变量 | |
AVTB | 设置默认时基值(AVTB =默认时基) |
intb | 输入时基 |
sr | 采样率,仅适用于asettb |
下面的例子设置时基,第一个设置为AVTB,第二个设置为0.3,第三个设置为输入时基的1.5倍。
ffmpeg input.mpg -vf settb=AVTB output.mpgffmpeg input.mpg -vf settb=0.3 output.mpgffmpeg input.mpg -vf settb=1.5*intb output.mpg
测试编码功能
要为离散余弦亮度,色度,亮度和色度的频率和幅度等生成各种测试图案,我们可以使用MPlayer项目中的mptestsrc滤镜,该滤镜在表中描述:
描述 | 生成与色度,亮度和其他视频属性相关的各种测试。 如果没有参数使用,则会执行所有测试,直到用户停止该过程 |
---|---|
语法 | 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 - 默认值是"all" |
duration, d | 以秒为单位或HH:MM:SS格式的测试持续时间 |
r | 帧率,默认值是25 |
下表说明了特定测试值的样本。
模式 | 句法 | 图片 |
---|---|---|
DC亮度 | mptest=t=dc_luma | |
DC色度 | mptest=t=dc_chroma | |
亮度频率 | mptest=t=freq_luma | |
色度频率 | mptest=t=freq_chroma | |
亮度幅度 | mptest=t=amp_luma | |
色度幅度 | mptest=t=amp_chroma | |
编码块模式(CBP) | mptest=t=cbp | |
运动矢量(MV) | mptest=t=mv | |
test ring 1 | mptest=t=ring1 | |
test ring 2 | mptest=t=ring2 |
测试模式
检测各种错误并为视频测试提供源FFmpeg包含下面列出的3个特殊视频源。 除颜色参数外,它们与“图像处理”章节“创建图像”一节中介绍的颜色来源共享相同的参数。
RGB测试模式
要测试可用的RGB和BGR色彩空间是名为rgbtestsrc的视频源
ffplay -f lavfi -i rgbtestsrc
滚动渐变和时间戳的颜色模式
要生成类似于TV模式的视频模式,可以使用testsrc视频源与命令:
ffplay -f lavfi -i testsrc
SMPTE条形图案模式
可以使用以下命令创建来自电影和电视工程师协会(SMPTE)的彩条图案:
ffplay -f lavfi -i testsrc
简单的数据包转储或有效负载(十六进制)
为了更精确的调试,也可以使用-hex选项转储有效负载,通常使用-report选项将结果保存到当前目录中的文件。 使用此选项,处理速度非常慢,报告文件更大。 该命令的示例是:
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
在控制台输出的末尾添加一条从工作台开始的行:utime表示在处理过程中CPU(计算机的中央处理单元)使用的时间。 benchmark_all选项显示处理过程中的结果,完成后的屏幕显示在下图中。
ffmpeg -benchmark_all -i input.avi output.mpg