Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 防止ffmpeg在降低视频分辨率时更改颜色强度_Image Processing_Ffmpeg_Colors_Video Processing - Fatal编程技术网

Image processing 防止ffmpeg在降低视频分辨率时更改颜色强度

Image processing 防止ffmpeg在降低视频分辨率时更改颜色强度,image-processing,ffmpeg,colors,video-processing,Image Processing,Ffmpeg,Colors,Video Processing,我有一个用例,需要将716x1280mp4视频缩小到358x640(原始视频的一半)。我使用的命令是 ffmpeg -i ./input.mp4 -vf "scale=640:640:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2" ./output.mp4 在10个样本视频中,有2个受到了颜色的影响。下面我附上了一份受影响最大的一份比较报告 注意:右侧的帧是原始视频中的帧,左侧的帧是已

我有一个用例,需要将
716x1280
mp4视频缩小到
358x640
(原始视频的一半)。我使用的命令是

ffmpeg -i ./input.mp4 -vf "scale=640:640:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2" ./output.mp4
在10个样本视频中,有2个受到了颜色的影响。下面我附上了一份受影响最大的一份比较报告

注意:右侧的帧是原始视频中的帧,左侧的帧是已处理(缩小)视频中的帧。请注意图像中的红色和绿色(甚至肤色和头发颜色也发生了变化)

我要找的是

  • 我有什么办法可以阻止这种变化的发生吗?可能是饱和度、亮度、对比度或任何其他参数的标志
  • 我假设ffmpeg在缩小视频尺寸时使用一些默认设置。是什么让ffmpeg仅为这两个视频更改颜色?如果它对其余的视频也做了类似的改变,那么如何事先预测这种行为呢
编辑:

我已经试过了什么?

  • -crf
    值为0和18
  • -如前所述预设veryslow
没有任何帮助

Mediainfo输入V/S输出

param 输入 输出 颜色范围 有限的 NA(属性不在描述中) 原色 英国电信2020 NA(属性不在描述中) 传输特性 HLG NA(属性不在描述中) 矩阵系数 BT.2020非常数 NA(属性不在描述中) 比特死亡 8. 8. 您需要使用来设置h264元数据

视频播放器播放视频文件时,会查找附加到视频流的元数据(例如h264元数据)。
影响颜色和亮度的H.264元数据参数有:
视频格式
颜色原色
传输特性
矩阵系数

如果未设置参数,则存在默认值。
低分辨率视频的默认设置为“有限范围”(在大多数播放器中-我不确定MAC OS)。
默认的gamma曲线(影响亮度)是gamma曲线。
播放器将像素从YUV颜色空间转换为RGB(用于显示视频)。转换公式是根据元数据进行的

您的输入视频文件
input.mp4
的H.264元数据参数与默认值相差甚远

我们可以假设
scale
视频过滤器不会改变颜色特征(过滤器应用YUV元素而不转换为RGB)

input.mp4
的特性适用,但被转换为默认值(BT.601和sRGB gamma),因此颜色和亮度与它们本应具有的颜色和亮度大不相同

当FFmpeg编码视频流时,它不会将元数据参数从输入复制到输出-您需要显式设置参数

解决方案是使用位流视频过滤器来设置元数据参数

尝试使用以下命令:

ffmpeg -i ./input.mp4 -vf "scale=640:640:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2" -vcodec libx264 -crf 17 -pix_fmt yuv420p -bsf:v h264_metadata=video_format=1:colour_primaries=9:transfer_characteristics=18:matrix_coefficients=9 ./output.mp4
  • video\u format=1
    应用“有限的颜色范围”
  • color\u primaries=9
    应用BT.2020彩色原色
  • transfer\u characteristics=18
    应用HLG伽马(参见 )
  • 矩阵_系数=9
    应用BT.2020矩阵系数

大多数参数都记录在(第E.2.1节)中。

是否必须使用ffmpeg完成?我在这里发现了另一个类似的问题:。特别是答案底部的“广告1补遗”部分。@IanChu我在浏览现有问题时尝试了它,但未能成功运行
-profile:v main444-10
的迭代。不过我确实试过了
ad1
部分。颜色变化可能与编码视频流的颜色参数有关:
颜色范围
颜色原色
传输特性
矩阵系数
。请您使用工具,发布
input.mp4
output.mp4
的这些参数,好吗?发布其他可能很重要的参数,如
位深度
(如果不是8位)。还缺少编解码器。尝试使用:
ffmpeg-i./input.mp4-vf“scale=640:640:force\u original\u aspect\u ratio=reduce,pad=ceil(iw/2)*2:ceil(ih/2)*2“-vcodec libx264-crf 17-pix\u fmt yuv420p./output.mp4
显示问题中ffmpeg命令的完整日志。您认为可以只复制
h264\u元数据而不复制整个编解码器吗从输入文件?换句话说,对于上面的属性,使用input.mp4中相同的值。这将是一个有用的功能,但我不知道如何使用FFmpeg。