在 Linux 系统中,计算 YUV 文件的 MD5 哈希值是一个常见操作,常用于验证文件完整性、比对编码输出一致性、自动化测试等场景。
YUV 文件是原始像素数据(如 YUV420p、NV12 等),虽然不能直接"查看"内容,但可以像任何二进制文件一样计算其 MD5 值。
✅ 一、最常用命令:md5sum
bash
md5sum your_video.yuv
📌 示例:
bash
$ md5sum traffic_1920x1080.yuv
d41d8cd98f00b204e9800998ecf8427e traffic_1920x1080.yuv
输出格式:
<MD5哈希值> <文件名>
✅ 二、其他实用用法
1. 只输出哈希值(不显示文件名)------适用于脚本处理
bash
md5sum your_video.yuv | awk '{print $1}'
输出:
d41d8cd98f00b204e9800998ecf8427e
2. 批量计算多个 YUV 文件的 MD5
bash
md5sum *.yuv
输出示例:
a3d7e43d874f9cb0955df08b4b7d9e5a input.yuv
d41d8cd98f00b204e9800998ecf8427e output.yuv
可用于快速比对两个文件是否完全相同。
3. 将 MD5 结果保存到文件
bash
md5sum *.yuv > checksums.md5
生成内容:
a3d7e43d874f9cb0955df08b4b7d9e5a input.yuv
d41d8cd98f00b204e9800998ecf8427e output.yuv
之后可用以下命令校验:
bash
md5sum -c checksums.md5
✅ 适合用于回归测试或 CI/CD 流程。
4. 比较两个 YUV 文件是否相同
bash
diff <(md5sum file1.yuv) <(md5sum file2.yuv)
或者更简单:
bash
if [ "$(md5sum file1.yuv)" = "$(md5sum file2.yuv)" ]; then echo "Same"; else echo "Different"; fi
✅ 三、使用 Python 脚本计算(高级控制)
如果你需要自定义分段读取、跳过头部等操作:
python
# calc_md5.py
import hashlib
import sys
def get_md5(file_path):
hash_md5 = hashlib.md5()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python calc_md5.py <file.yuv>")
exit(1)
print(get_md5(sys.argv[1]))
运行方式:
bash
python calc_md5.py traffic.yuv
✅ 四、结合 find 命令递归处理所有 YUV 文件
bash
find /path/to/videos -name "*.yuv" -exec md5sum {} \;
输出所有子目录下的 YUV 文件 MD5。
✅ 五、为什么使用 MD5 计算 YUV 文件?
| 应用场景 | 说明 |
|---|---|
| 🔍 编码一致性验证 | 判断两个编码器输出是否完全一致 |
| 🔄 自动化测试 | 在 CI 中通过 MD5 对比预期结果 |
| 💾 数据完整性检查 | 验证 YUV 文件传输后是否损坏 |
| ⏱️ 快速比对大文件 | 比逐字节比较更快 |
⚠️ 注意:MD5 是基于整个文件的字节流计算的,因此即使两个 YUV 视频视觉相同,但如果分辨率、填充、字节顺序不同,MD5 也会不同。
✅ 六、注意事项
| 项目 | 说明 |
|---|---|
| ❗ YUV 是裸数据 | 不包含元信息(宽高、帧率),MD5 只反映字节流差异 |
| 🧮 大文件性能 | 即使是 1GB 的 YUV 文件,md5sum 也能快速完成 |
| 🔤 区分大小写 | Linux 文件系统通常区分大小写,请确保路径正确 |
| 🐢 避免中断 | 如果文件正在被写入,可能导致 MD5 错误 |
✅ 总结:推荐命令一览
| 目的 | 命令 |
|---|---|
| 查看单个文件 MD5 | md5sum video.yuv |
| 仅输出哈希值 | `md5sum video.yuv |
| 批量处理 | md5sum *.yuv |
| 保存校验和 | md5sum *.yuv > checksums.md5 |
| 校验已存文件 | md5sum -c checksums.md5 |
| 脚本中调用 | 使用 Python 或 Shell 函数封装 |
📌 提示:你还可以将此命令集成到 .sh 脚本中,实现一键批量校验多个实验输出的 YUV 文件。