5月27日 23:08

如何使用FFmpeg进行无损转码?需要注意哪些参数?

答案

FFmpeg 无损转码有两种思路:

  1. 只换容器,不重新编码ffmpeg -i input.avi -c copy output.mp4,速度极快,音视频流原样复制,这是最可靠的无损方式。

  2. 重新编码为无损格式:视频用 libx264/libx265 的无损模式,音频用 FLAC。

视频无损编码:

bash
# H.264 无损 ffmpeg -i input.mp4 -c:v libx264 -crf 0 -c:a copy output.mp4 # H.265 无损 ffmpeg -i input.mp4 -c:v libx265 -crf 0 -c:a copy output.mp4

音频无损编码:

bash
# WAV → FLAC ffmpeg -i input.wav -c:a flac output.flac # 保留元数据 ffmpeg -i input.wav -c:a flac -metadata title="原标题" output.flac

核心原则:能用 -c copy 就不要重新编码。重新编码即使设 -crf 0,也可能因编码器内部精度引入细微差异。

关键参数说明

参数作用注意事项
-c copy直接复制流,不重新编码最安全的无损方式,但只能换容器
-c:v libx264 -crf 0H.264 无损编码仅 libx264 支持 -crf 0,输出文件极大
-c:v libx265 -crf 0H.265 无损编码libx265 的 -crf 0 同样无损
-c:a flac音频无损压缩仅对无损源有意义
-c:a copy直接复制音频流适用任何场景

需要注意的问题

-crf 0 不等于绝对无损-crf 0 是编码器内部的无损模式,输出质量确实无损,但文件体积远大于原始文件(视频无损编码的输出通常是原文件的数倍)。如果只是想换容器格式,-c copy 才是正确选择。

有损源转无损没有意义。将 MP3 转为 FLAC 不会恢复丢失的数据,只会白白增大文件体积。无损转码的前提是输入源本身无损。

容器兼容性。MP4 容器不支持 FLAC 音频,也不支持某些无损视频编码。遇到兼容问题时需换用 MKV 等灵活容器:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 0 -c:a flac output.mkv

验证无损。转码后可用 ffprobe 对比输入输出流信息,或对原始帧做哈希校验:

bash
# 逐帧 MD5 校验 ffmpeg -i input.mp4 -f md5 input.md5 ffmpeg -i output.mp4 -f md5 output.md5 diff input.md5 output.md5

追问:-c copy 和 -crf 0 什么时候用?

-c copy:只需要改容器格式时(如 MKV 转 MP4、AVI 转 MP4)。不改变编码,速度快,零质量损失。

-crf 0:需要改变编码格式时(如 H.264 转 H.265 无损)。会重新编码,速度慢,输出文件大,但保证画面无损。

大多数"无损转码"需求实际上只需 -c copy

标签:FFmpeg