我正在尝试使用 ffmpeg 复制 Handbrake 设置,因为我想使用 ffmpeg 添加一些元数据和其他一些 Handbrake 无法做到的东西。
我所做的似乎很接近,生成的文件大小和编码时间相似,但 Handbrake 只是产生明显(但不是大幅度)更好的图像。
这些被裁剪并放大 300%。例如,手刹在其中一只蝴蝶腿上保留了更多颜色,在其翅膀的黄色部分之间保留了更多细节,并且总体上看起来更清晰。可能很难注意到我在说什么,但差异是存在的,并且在其他一些视频中更为明显。
x265 编码器版本略有不同,但我相信这不是造成差异的原因。Handbrake 有“x265 3.5+1-f0c1022b6”,ffmpeg 有“x265 3.5+37-07b011400”,但我尝试过使用旧 x265 的 ffmpeg,结果与最新的 x265 相同。在我看来,它们都不如 Hanbrake。
和 ffmpeg 命令
ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720 -c:a copy -c:v libx265 -crf 27 -preset fast "out.mp4"
这是所有 3 个文件的 Mediainfos,包括原始文件、编码日志、Handbrake 预设和 ffmpeg 命令:Pastebin 文件夹
同样由于某种原因,关键帧位于不同的位置。
我的问题是,我可以在我的 ffmpeg 命令中进行哪些更改以使结果与 Handbrake 相同?
在日志中,几乎没有区别:输入是 4k 10bit 视频,输出是 720p。ffmpeg 选择使用 main10 配置文件对 x265 进行编码以保持 720p-10bit。在 HandBrake 中,您必须选择 H.265 10 位作为编码器,因此在本例中其输出为 8 位。我更喜欢 10 位输出,因为这减少了较低比特率源的条带。
keyint 最小值/最大值(又名关键帧或 GOP)。ffmpeg 使用默认值 25/250,而 handbrake 将其调整为 1 秒 / 10 秒(* 在这种情况下约为 60 fps),参数为 60 /600。我还建议 deblock=-1 因为 x265 编码器有点软。
输出视频可能存在问题,在非 HDR 显示器上颜色显得褪色或变暗。在这种情况下,您需要将 bt2020 色调映射到 bt709。可以在这里找到讨论https://github.com/jellyfin/jellyfin/issues/415
所以要接近手刹使用:
如果你想强制 8 位(比如你的手刹输出)
要从 8 位源强制 10 位,请使用 format=yuv420p10le。
要进一步提高质量,请将 crf 从 27 更改为 25 或 23(越低越好)。
如果你没有卡在 mp4 和 ffmpeg 上,你可以使用 handbrake gui 或 cli 进行编码,然后使用 mkvmerge gui 或 cli 输出到带有元数据的 mkv。