FFMPEG在RGB色彩空间中裁剪颜色范围至15-235。

6
我有一系列BMP(或PNG)图像,想要将它们转换为XVID和MP5电影格式。
编码可以实现,但生成的电影颜色看起来已经被冲淡了,黑色被移动到RGB 16,最亮的255值被移动到235。我希望输出电影使用与源帧相同的0到255颜色。
现在,有各种冲突的FFMPEG文档,所以我希望有人提供一个示例命令行,以满足我的需求。我尝试了各种pix_fmt标志,但没有一个能够使输出电影处于完整的色彩范围。
对于XVID
ffmpeg.exe -framerate 60 -i "D:\SRC%05d.BMP"  -c:v mpeg4 -vtag xvid -qscale 1 -y "D:\OUTPUT.AVI""

对于H265

ffmpeg.exe -framerate 60 -i "D:\SRC%05d.BMP" -c:v libx265 -x265-params lossless=1 -s 3840x2160 -pix_fmt yuvj420p -an -y "D:\OUTPUT.MP4""

yuvj420p是用来提供完整的色彩范围,但FFMPEG会出现错误提示:"Incompatible pixel format 'yuvj420p' for codec 'libx265', auto-selecting format 'yuv420p'"。

因此,是否有任何FFMPEG达人可以给我魔法开关,以便获得输出电影的黑色和保持原始帧文件0-255 RGB值的颜色?

1个回答

11

输出范围和颜色范围的元数据都可以被强制指定,但您的播放器或编辑器可能会强制限制范围的解释。因此,请注意转码器。

话虽如此,您需要设置两个标志:一个用于缩放器,另一个用于元数据。

ffmpeg.exe -framerate 60 -i "D:\SRC%05d.BMP" -vf format=yuv420p -dst_range 1 -color_range 2 -c:v mpeg4 -vtag xvid -qscale 1 -y "D:\OUTPUT.AVI""
因为你正在使用 mpeg4 编码器,所以这不是 Xvid,Xvid 应该是 -c:v libxvid;你需要链接此库才能使用它。
对于 x265,可以通过编码器标志设置范围。
ffmpeg.exe -framerate 60 -i "D:\SRC%05d.BMP" -c:v libx265 -x265-params lossless=1:range=full -s 3840x2160 -dst_range 1 -pix_fmt yuv420p -an -y "D:\OUTPUT.MP4""

1
完美。我的输出现在是完整的0-255范围。我确实读到有些播放器可能会裁剪等,但在我的情况下,这些电影是用于上传到YouTube的,只要源是0-255,那么YouTube就不会裁剪或拉伸到15-235范围。 - Some1Else
2
@gyan 你是怎么找到这个的?我在FFmpeg文档中甚至都找不到color_range或dst_range这些词。 - Wang
color_range 是 libavcodec 的 选项,用于提示解码器或编码器。dst_range 是 libswscale 的 选项,会传递到任何缩放或像素格式操作中。 - Gyan
你知道如何使用webm(libvpx)完成这个任务吗?我已经四处搜寻,但是找不到答案。 - felwithe
@felwithe 似乎只被VP9使用。WebM应该仍然存储标志。 - Gyan
@Gyan 呜呜,我一直尝试使用VP9进行编码,但是始终没有得到高质量的输出。我已经尝试了所有可能的选项组合,但结果是编码时间增加了四倍,而质量仍然不如VP8好。我已经花费了数天的时间来尝试解决这个问题,但最终放弃了。现在我需要找到一种解决VP8中颜色问题的方法。不过还是非常感谢你。 - felwithe

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