gpt4 book ai didi

video - 为什么 ffmpeg 中的置换复合滤波器对 Cb 和 Cr 平面的置换与 lum 不同?

转载 作者:行者123 更新时间:2023-12-04 22:59:55 32 4
gpt4 key购买 nike

我有一个用 yuv420p 像素格式编码的视频,我想替换它的像素。我正在使用 ffmpeg 及其新的置换过滤器。过滤器将 X 轴和 Y 轴分别作为输入(要置换的视频和)两个置换图。我决定使用 nullsrc 视频源过滤器和 geq 过滤器将置换贴图直接创建到 ffmpeg 中,以指定三个平面的值:lum、Cb、Cr。脚本如下:

ffmpeg INPUT.mp4 -f lavfi -i nullsrc=size=${WIDTH}x${HEIGHT}:d=0.1,geq='lum=128+30*sin(2*PI*X/400):Cb=128+30*sin(2*PI*X/400):Cr='128+30*sin(2*PI*X/400)' -f lavfi -i nullsrc=size=${WIDTH}x${HEIGHT}:d=0.1,geq='lum=128+30*sin(2*PI*X/400):Cb=128+30*sin(2*PI*X/400):Cr=128+30*sin(2*PI*X/400)' -lavfi '[0][1][2]displace' OUTPUT.mp4

我使用了 ffmpeg 文档中提供的示例,因为 geq 中使用的表达式与问题的目的无关。

在计算过程中,我得到输入视频的像素没有正确移位,这意味着我可以在移位但黑白的视频下清楚地看到一种带有颜色信息的幽灵视频。
经过一些测试,我注意到创建的置换贴图只有在色度平面被置换时正确置换了亮度平面,但与亮度不同,亮度是输入视频中平面错位的原点,您可以在下面的摘录中看到框架:

enter image description here

我还注意到描述位移图的 Cb 和 Cr 平面的视频具有亮度平面的一半分辨率。

我的问题是:如何正确设置 geq 定义中的 Cr 和 Cb 平面,以使它们与 luma 平面完全相同?

如果有人能解释我为什么 ffmpeg 给我的输出对于 luma 和 Cb、Cr 平面有如此大的不同,即使提供的功能是相同的,那也很好。

如果有帮助,我正在使用 ffmpeg 3.3-static 构建。

谢谢你的时间。

最佳答案

YUV420P 意味着 Cb 和 Cr 的采样率是您发现的一半。每个 Cb/Cr 像素/样本应用于 4 个像素(在本例中为 2x2)。您的表达式将每个色度样本替换为与亮度相同的量,这具有使有效位移加倍的效果。解决方法是将输入和位移图重新缩放到完全采样的色度平面,并在过滤结束时根据需要将采样率降低到 4:2:0。

ffmpeg -i in.mp4 -f lavfi -i nullsrc=size=1280x720:d=0.1,format=yuv444p,geq=lum='128+30*sin(2*PI*X/400)':cb='(128+30*sin(2*PI*X/400))':cr='(128+30*sin(2*PI*X/400))' -lavfi [0]format=yuv444p[v];[v][1][1]displace,format=yuv420p out.mp4

对于 YUV420P 输入,无需任何像素格式转换,请使用
ffmpeg -i in.mp4 -f lavfi -i nullsrc=size=1280x720:d=0.1,geq=lum='128+30*sin(2*PI*X/400)':cb='(128+15*sin(2*PI*2*X/400))':cr='(128+15*sin(2*PI*2*X/400))' -lavfi [0][1][1]displace out.mp4

关于video - 为什么 ffmpeg 中的置换复合滤波器对 Cb 和 Cr 平面的置换与 lum 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818912/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com