使用 x265 且具有相同设置时,Ffmpeg 产生的结果比 Handbrake 更差

使用 x265 且具有相同设置时,Ffmpeg 产生的结果比 Handbrake 更差

我正在尝试使用 ffmpeg 复制 Handbrake 设置,因为我想使用 ffmpeg 添加一些元数据和一些 Handbrake 无法做到的其他东西。

我所做的似乎很接近,生成的文件大小和编码时间也类似,但 Handbrake 只是产生了明显(但不是显著)更好的图像。

以下是一个例子, 原来的 手刹 FFMPEG

这些是裁剪并放大 300% 后的照片。例如,这里的手刹保留了蝴蝶腿的更多颜色,翅膀黄色部分之间的细节更多,总体看起来更清晰。可能很难注意到我在说什么,但差异是存在的,而且在其他一些视频中更明显。

x265 编码器版本略有不同,但我相信这不是造成差异的原因。Handbrake 有“x265 3.5+1-f0c1022b6”,ffmpeg 有“x265 3.5+37-07b011400”,但我尝试使用 ffmpeg 处理较旧的 x265,结果与最新的 x265 相同。在我看来,它们都不如 Hanbrake。

以下是 Handbrake 的截图概括 方面 视频

和 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 个文件的 Mediainfo,包括原始文件、编码日志、Handbrake 预设和 ffmpeg 命令Pastebin 文件夹

另外由于某种原因,关键帧位于不同的位置。

我的问题是,我可以在 ffmpeg 命令中做哪些更改才能使结果与 Handbrake 相同?

答案1

在日志中,有几个不同之处:输入是 4k 10bit 视频,输出是 720p。ffmpeg 选择使用 main10 配置文件对 x265 进行编码以保持 720p-10bit。在 HandBrake 中,您必须选择 H.265 10-bit 作为编码器,因此在这种情况下其输出为 8bit。我更喜欢 10 bit 输出,因为这可以减少低比特率源上的带状现象。

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

因此,要接近手刹的使用方法:

ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720 -c:a copy -c:v libx265 -crf 27 -preset fast -x265-params "deblock=-1:min-keyint=60:keyint=600" out.mp4"

如果你想强制 8 位(比如你的手刹输出)

ffmpeg -i "in.mp4" -map_metadata -1 -vf scale=1280:720,format=yuv420p -c:a copy -c:v libx265 -crf 27 -preset fast -x265-params "deblock=-1:min-keyint=60:keyint=600" out.mp4"

要从 8 位源强制获得 10 位,请使用 format=yuv420p10le。

为了进一步提高质量,将 crf 从 27 更改为 25 或 23(越低越好)。

如果您不受 mp4 和 ffmpeg 的限制,您可以使用 handbrake gui 或 cli 进行编码,然后使用 mkvmerge gui 或 cli 将数据输出为带有元数据的 mkv。

相关内容