ffmpeg png 叠加到 mp4 颜色不正确

ffmpeg png 叠加到 mp4 颜色不正确

我正在尝试使用以下命令在 .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 检查颜色:

subs1.png
在此处输入图片描述

框架来自new.mp4
在此处输入图片描述

我们可以看到,输出的颜色值与输入几乎相同。

相关内容