FFmpeg H265转H264颜色失真?

3
我希望您能够将一段H265视频转换成H264格式,并且尽可能地减少质量损失。但是,在进行转换时,输出的颜色会出现偏差,最明显的是红色会变成橙色。总体而言,输出的视频颜色更加暗淡/饱和度低/灰暗。
我认为这个问题(链接)很相关,因此是否有可能在不重新编码整个文件的情况下添加color_range、color_space、color_transfer和color_primaries标志?
命令:
ffmpeg -i input.mkv -c:v libx264 -crf 17 output.mp4

输入视频流:

{
  "index": 0,
  "codec_name": "hevc",
  "codec_long_name": "H.265 / HEVC (High Efficiency Video Coding)",
  "profile": "Main 10",
  "codec_type": "video",
  "codec_time_base": "1/24",
  "codec_tag_string": "[0][0][0][0]",
  "codec_tag": "0x0000",
  "width": 1920,
  "height": 1080,
  "coded_width": 1920,
  "coded_height": 1080,
  "closed_captions": 0,
  "has_b_frames": 2,
  "sample_aspect_ratio": "1:1",
  "display_aspect_ratio": "16:9",
  "pix_fmt": "yuv420p10le",
  "level": 120,
  "color_range": "tv",
  "color_space": "bt2020nc",
  "color_transfer": "smpte2084",
  "color_primaries": "bt2020",
  "refs": 1,
  "r_frame_rate": "24/1",
  "avg_frame_rate": "24/1",
  "time_base": "1/1000",
  "start_pts": 0,
  "start_time": "0.000000",
  "disposition": {
    "default": 1,
    "dub": 0,
    "original": 0,
    "comment": 0,
    "lyrics": 0,
    "karaoke": 0,
    "forced": 0,
    "hearing_impaired": 0,
    "visual_impaired": 0,
    "clean_effects": 0,
    "attached_pic": 0,
    "timed_thumbnails": 0
  },
  "tags": {
    "language": "eng",
    "BPS": "4421595",
    "DURATION": "00:41:46.417000000",
    "NUMBER_OF_FRAMES": "60154",
    "NUMBER_OF_BYTES": "1385295394",
    "_STATISTICS_WRITING_APP": "mkvmerge v62.0.0 ('Apollo') 64-bit",
    "_STATISTICS_TAGS": "BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES"
  }
}

视频输出流:
{
  "index": 0,
  "codec_name": "h264",
  "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
  "profile": "High 10",
  "codec_type": "video",
  "codec_time_base": "1/48",
  "codec_tag_string": "avc1",
  "codec_tag": "0x31637661",
  "width": 1920,
  "height": 1080,
  "coded_width": 1920,
  "coded_height": 1088,
  "closed_captions": 0,
  "has_b_frames": 2,
  "sample_aspect_ratio": "1:1",
  "display_aspect_ratio": "16:9",
  "pix_fmt": "yuv420p10le",
  "level": 40,
  "chroma_location": "left",
  "refs": 1,
  "is_avc": "true",
  "nal_length_size": "4",
  "r_frame_rate": "24/1",
  "avg_frame_rate": "24/1",
  "time_base": "1/12288",
  "start_pts": 0,
  "start_time": "0.000000",
  "duration_ts": 30798848,
  "duration": "2506.416667",
  "bit_rate": "4073900",
  "bits_per_raw_sample": "10",
  "nb_frames": "60154",
  "disposition": {
    "default": 1,
    "dub": 0,
    "original": 0,
    "comment": 0,
    "lyrics": 0,
    "karaoke": 0,
    "forced": 0,
    "hearing_impaired": 0,
    "visual_impaired": 0,
    "clean_effects": 0,
    "attached_pic": 0,
    "timed_thumbnails": 0
  },
  "tags": {
    "language": "eng",
    "handler_name": "VideoHandler"
  }
}

之前我也遇到过类似的问题。你可以看看这个链接:https://dev59.com/l7_qa4cB1Zd3GeqPJYbQ,或许会有所帮助。 - dravit
2个回答

2
这些元数据中的一些也可以在比特流中进行标识,但您可以对视频进行重新复制(复制视频位,不重新编码),并使用以下命令设置mp4容器元数据:
ffmpeg -i output.mp4 -c:v copy -color_primaries bt2020 -color_range tv -colorspace bt2020nc -color_trc smpte2084 output_updated.mp4

这是设置以匹配您的输入视频设置。 参考FFMPEG文档(搜索color_trc以找到正确部分)

0

编辑h264/h265视频流元数据(正式称为'VUI')的另一种方式(也许更一致,因为更加'直接')是使用比特流过滤器。

例如,在您的情况下:ffmpeg -i input.mp4 -c copy -bsf:v h264_metadata=colour_primaries=9:transfer_characteristics=16:matrix_coefficients=9 out.mp4

您必须使用整数作为bsf的参数,整数及其相应名称的表格可以在Recommendation ITU-T H.273中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接