我经常需要使用
unknown
颜色元数据放大许多文件(可能是因为 FFmpeg 本身直到最近才删除该元数据):
$ ffprobe -v error -show_streams "input.mp4" | grep color
color_range=tv
color_space=unknown
color_transfer=unknown
color_primaries=unknown
无论我做什么来尝试保留这些文件中的颜色,都无法阻止颜色发生变化,通常会比输入的颜色更暗。我已经尝试过:
-colorspace
、
-color_trc
、
-color_primaries
、
-color_range
)设置为 PAL、NTSC 和 HD 输入(
bt470bg
、
smpte170m
和
bt709
)的所有可能值分别)
in_color_matrix=auto:out_color_matrix=<COLORSPACE>
自动将色彩空间转换为比例的一部分,其中
bt470
、
smpte170m
或
bt709
in_color_matrix=<COLORSPACE>:out_color_matrix=bt709
将色彩空间显式转换为比例的一部分,其中 是
bt470
、
smpte170m
或
bt709
只是让我的颜色看起来像在原始输入中一样。
这是我作为较大脚本的一部分运行的(简化的)FFmpeg 命令,其中大部分“可能”与问题无关,但我已将其包含在内,以防它“不是”:
ffmpeg -y -hide_banner \
-i "input.webm" -i "outro.mp4" -loop 1 -i "watermark.png" \
-movflags +faststart+write_colr \
-filter_complex \
"color=black:16x16:d=780[base];
[0:v]scale=1922:'max(1080,ih)':flags=lanczos:in_color_matrix=auto:out_color_matrix=bt709[v0];
[1:v]scale=1922:'max(1080,ih)':flags=lanczos,fade=in:st=0:d=2:alpha=1[v1];
[2:v]lut=a=val*0.7,fade=in:st=15:d=3:alpha=1,fade=out:st=775:d=3:alpha=1[v2];
[base][v0]scale2ref[base][v0];
[base][v0]overlay[tmp];
[tmp][v1]overlay,setsar=1[tmp2];
[v2][tmp2]scale2ref=w=oh*mdar:h=ih*0.07[watermark_scaled][video]
[video][watermark_scaled]overlay=80:50:shortest=1:format=rgb[outv];
[0:a]afade=out:st=778:d=2[0a];
[0a][1:a]concat=n=2:v=0:a=1[outa]" \
-map "[outv]" -map "[outa]" -c:v libx264 -crf 15 -c:a libopus \
-pix_fmt yuv420p -colorspace bt709 -color_trc bt709 -color_primaries bt709 -color_range tv "output.mp4"
标记色彩空间/传输/原色?这设置了 ffmpeg 使用的 AVFrame“标签”。
或者,如果唯一的问题是您的输入文件缺少颜色元数据,并且当您标记了视频时,这种类型的过滤器链可以正常工作...只需重新混合它们并将其添加进去?
ffmpeg -i in.mp4 -c copy -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -movflags faststart+write_colr out.mp4