请教下各位大佬,目前有一个需求是测试图片和视频编解码相关 api 接口,需要对编码后的图片和码流文件以及解码后的 yuv 进行校验,是否显示正常。针对这个环节有没有什么自动化校验方法呢?
针对图片和视频编解码后的文件校验及 YUV 数据质量验证,以下是系统化的自动化校验方案,分为四个核心环节:
码流结构解析
FFprobe/MediaInfo
验证容器格式、编码参数(分辨率/帧率/GOP 等)bash
ffprobe -v error -show_format -show_streams output.mp4
if [ $? -ne 0 ]; then
echo "码流解析异常!"
exit 1
fi
深度语法检查
Elecard Stream Analyzer
批量检测 NAL 单元合规性h264_analyzer
工具解析 SPS/PPS 有效性极限解码压力测试
import subprocess
for bitrate in [100k, 1M, 10M]: # 多码率测试
cmd = f"ffmpeg -y -i input.mp4 -b:v {bitrate} encoded.mp4"
subprocess.run(cmd, check=True, shell=True)
# 多解码器交叉验证
decoders = ['h264_cuvid', 'libx264']
for d in decoders:
result = subprocess.run(
f"ffmpeg -v error -c:v {d} -i encoded.mp4 -f null -",
shell=True,
capture_output=True
)
if result.stderr:
alert_error(f"{d}解码失败: {result.stderr}")
def calc_psnr(orig, dec):
mse = np.mean((orig - dec) ** 2)
return 10 * np.log10(255**2 / mse)
orig_yuv = read_yuv("ref.yuv") # 原始未压缩 YUV
dec_yuv = read_yuv("decoded.yuv")
psnr = calc_psnr(orig_yuv.Y, dec_yuv.Y)
ssim_val = ssim(orig_yuv.Y, dec_yuv.Y,
data_range=255, win_size=3)
if psnr < 30 or ssim_val < 0.95:
generate_heatmap_diff(orig_yuv, dec_yuv) # 生成差异热力图
2. **机器视觉辅助检测**
- 使用OpenCV检测马赛克区域:
```python
edges = cv2.Canny(dec_frame, 50, 150)
if cv2.countNonZero(edges) < threshold:
log("WARNING: 疑似块效应产生")
```
### 四、可视化辅助校验(自动化强度:★★★☆☆)
1. **关键帧采样检查**
```bash
# 抽取I帧生成缩略图矩阵
ffmpeg -i encoded.mp4 -vf "select=eq(pict_type\,I)" -vsync 0 thumbs/thumb%d.png
img2pdf
将 YUV 对比图与质量指标生成 PDF 报告方案类型 | 推荐工具 | 适用场景 |
---|---|---|
全参考质量评估 | VMAF(Netflix)、Daala | 高精度主观质量仿真 |
无参考评估 | NIQE、BRISQUE | 无原始素材时的质量盲测 |
硬件加速方案 | NVIDIA Video Codec SDK + DLA | 超高清 8K 实时校验 |
groovy
stage('Codec Validation') {
parallel {
stage('H.264') {
sh 'python validate_codec.py --codec h264'
}
stage('HEVC') {
sh 'python validate_codec.py --codec hevc'
}
}
post {
always {
allure includeProperties: false,
results: [[path: 'allure-results']]
}
}
}
建议实施路径:优先完成码流校验和解码验证的基础自动化,再逐步集成质量指标计算,最后通过可视化报告实现人工二次确认的闭环。对于实时性要求高的场景,可引入 GPU 加速的并行校验框架。
用 openCV 啊,写脚本就好了。关键是你怎么去定义是否显示正常。你先把你手工测试的验证通过的标准说出来,才好知道怎么自动化
1、没有使用 opencv 的原因是没有一个 groudtruth 作为校验,以 JPEG 编码接口为例,有编码质量参数,不同的编码质量,编码后的 JPEG 文件显示的清晰度不同,目前没有一个指标可以说明在多少范围内是正常的。
2、手工测试的验证通过标准就是人眼去看没有花瓶、马赛克等图片不合理的情况
您这是 AI 生成的答案吗? ,我看标准里采用了 psnr 和 ssim_val 作为评判指标,但是现在我这里没有一个具体取值范围的标准可以作为评判参考
那简单,给你分享一下我们这边测试视频的方案。 我们会播放一个 动态二维码 (用 python 写一个生成二维码的工具,数字不断递增)。然后视频流解析出来之后,用 python 代码去给二维码解码。1.能解码成功说明视频流传输正常 2.解码出来的数字未中断,说明传输流没有中断是连续的。
色彩检测同理,python 随机生成指定颜色的色块传输,然后去接收端 openCV 解析颜色是否符合预期。
不说码流检查,如果只是清晰度评估,其实 psnr 这些无参考评估指标也可以用一点,并不是非要有个标准去对比,比如:用不同的滤波尺寸将图像做简单的高斯去噪和椒盐去噪,分别将结果与原图一起计算 PSNR/SSIM,然后再去加权计算、推断,评估图像质量……只是个思路,未必有用,供参考~
按理说编码之前应该能 dump 出原始的输入才对,要么问下开发能否帮忙提升可测性~