FFmpeg:如何将 H.264 视频标记为全色彩范围?

FFmpeg:如何将 H.264 视频标记为全色彩范围?

我有一个 H.264 视频文件(在 MP4 容器中),它是全色域的,我的意思是通道值从 0 到 255,而不是电视范围 16--235。但是,该文件无法在我的计算机上正确播放,因为(我认为)该文件没有标记为具有全色域。有没有办法重新混合(不重新编码)该文件,以便播放器可以识别颜色空间?

以下是ffprobe -show_streams该文件的输出:

ffprobe version 3.2 Copyright (c) 2007-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.100 / 57. 64.100
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/path/of/file':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Some Title
    encoder         : Lavf57.56.100
  Duration: 00:00:24.51, start: 0.000000, bitrate: 88695 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 3840x2160 [SAR 1:1 DAR 16:9], 88535 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 195 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=1/60
codec_tag_string=avc1
codec_tag=0x31637661
width=3840
height=2160
coded_width=3840
coded_height=2160
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=51
color_range=N/A
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/30000
start_pts=0
start_time=0.000000
duration_ts=735000
duration=24.500000
bit_rate=88535828
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=735
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=und
TAG:handler_name=VideoHandler
[/STREAM]
... // Audio stream info that I ignore.

答案1

使用h264_metadata 比特流过滤器ffmpeg

ffmpeg -i input.mp4 -map 0 -c copy -bsf:v h264_metadata=video_full_range_flag=1 output.mp4
video_full_range_flag价值 意义
-1 未知
0 电视(有限)
1 电脑(完整)

答案2

常规 FFmpeg 无法做到这一点,除非重新编码。

然而,ffmpeg来自 direct264 可以。它是旧版 ffmpeg 的修改版本,带有自定义过滤器以修改 H264 比特流。

ffmpeg -i in.mp4 -vcodec copy -acodec copy -vbsf h264_changesps=fullrange out.mp4

此构建在大多数其他方面都存在缺陷,因此请重命名它或不要将其放在您的路径中。

答案3

-bsf:v h264_metadata=video_full_range_flag=1

它不能 100% 地发挥作用,因为它还添加了:

color_range_Original: Limited

并且某些程序仍会将该文件视为受限文件(Magix Vegas 肯定如此)。

相关内容