我正在尝试使用以下命令在 .mp4 文件上叠加一些字幕:
ffmpeg -y -i count5.mp4 -i subs1.png -i subs2.png \
-filter_complex "[0][1]overlay=enable=between(t\,1\,2):x=0:y=0[out]; \
[out][2]overlay=enable=between(t\,3.5\,4.6):x=0:y=0[out]" \
-map [out] -map 0:a? new.mp4
它可以起作用,但是字幕颜色不正确:这是覆盖:
.mp4 输出的结果如下:
看起来它变成了粉色或橙色。也许更好的问题是如何保持正确的视频质量?我对视频格式和 ffmpeg 的了解非常有限,所以不确定从哪里开始调试或使用正确的关键字。
Finder 告诉我 png 是颜色配置文件sRGB IEC61966-2.1
,视频是HD (1-1-1)
这是一个关联到文件
答案1
该问题与关注帖子。
subs1.png
在我们的例子中,和的像素格式subs2.png
是RGBA(适用sRGB标准与 alpha 透明通道)。
像素格式为count5.mp4
“有限范围”yuv420pBT.709标准。
输出视频new.mp4
保留 BT.709 特性。
我们可以使用以下方法查看这些细节媒体信息工具。
正如我所描述的其他答案,FFmpeg 总是假设BT.601颜色特性,并且在应该转换为 BT.709 时却没有转换。
解决方案是使用以下方法将 PNG 图像的颜色格式转换为 BT.709规模筛选:
ffmpeg -y -i count5.mp4 -i subs1.png -i subs2.png -filter_complex "[1]scale=out_color_matrix=bt709:dst_format=yuva420p[v1];[2]scale=out_color_matrix=bt709:dst_format=yuva420p[v2];[0][v1]overlay=enable=between(t\,1\,2):x=0:y=0[out];[out][v2]overlay=enable=between(t\,3.5\,4.6):x=0:y=0[out]" -map [out] -map 0:a? new.mp4
为了获得更好的文本质量,我们可以避免色度二次采样并使用 yuv444 而不是 yuv420(请注意,我不知道您的目标应用程序是否可以处理 yuv444 像素格式):
ffmpeg -y -i count5.mp4 -i subs1.png -i subs2.png -filter_complex "[1]scale=out_color_matrix=bt709:dst_format=yuva444p[v1];[2]scale=out_color_matrix=bt709:dst_format=yuva444p[v2];[0][v1]overlay=enable=between(t\,1\,2):x=0:y=0:format=yuv444[out];[out][v2]overlay=enable=between(t\,3.5\,4.6):x=0:y=0:format=yuv444[out]" -map [out] -map 0:a? -c:v libx264 -crf 17 -pix_fmt yuv444p new.mp4
使用 paint.net 检查颜色:
我们可以看到,输出的颜色值与输入几乎相同。