FFMPEG:将 UHD H265 转码为 SDR H264 而不会丢失颜色

FFMPEG: Transcode UHD H265 to SDR H264 without color loss

我正在我的服务器上测试 FFMPEG。我正在尝试将 H265 10 位转码为 H264 8 位,以支持在所有主要网络浏览器上播放视频。

1。这是第一个命令:

ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -preset ultrafast out.mp4

结果:视频只能在 VLC 媒体播放器上播放。无法在任何浏览器上播放

2。然后我尝试使用这个命令:

ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -profile:v main -preset ultrafast -vf "format=yuv420p" out.mp4

结果:视频到处都可以播放,但颜色严重丢失。

3。然后我尝试了另一个命令:

ffmpeg -i 4K.ts -c:a aac -c:v h264 -crf 19 -profile:v main -preset ultrafast -vf "format=yuvj420p" out.mp4

结果:视频可在任何地方播放,但颜色范围增加

我不知道我是否遗漏了什么,或者我是否应该完全禁止用户上传 10 位深度的视频。任何帮助将不胜感激

如果有人对我正在测试的视频感兴趣,请点击这里 link:https://drive.google.com/uc?export=download&id=1pGsnknkoIDRPKrW-YPFS7U31J09PeM4N

我查看了许多 google 结果得出了这些命令,其中一些是:

  1. FFMPEG Transcode H265 video from 10-bit to 8-bit
  2. https://blender.stackexchange.com/questions/73743/lossless-10-bit-colorspace-yuvj420p-video-output
  3. https://askubuntu.com/questions/922563/set-bit-depth-in-ffmpeg-encoding-for-hevc

问题与 10 位 HEVC 编码无关,而是在转换过程中丢失了 HDR 元数据。这是一个典型的 UHD 4K 视频到 SDR 转换的案例。

我不是 FFMPEG 专家,所以我无法为这个答案提供更多细节,但是如果有人想将 HDR 转换为 SDR,那么您可以使用此命令:

ffmpeg -i 4K.ts -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -c:v h264 -crf 19 -preset ultrafast output.mp4