我试图了解如何进行 YV12 格式的渲染。例如,我拿了一个简单的样本。看这个图:
网络摄像头以 RGB24 或 MJPEG 格式创建尺寸为 640x480 的帧。之后,LAV 解码器将帧转换为 YV12 并将它们发送到 DS 渲染器(EVR 或 VMR9)。
解码器将帧宽度(步幅)640更改为1024。因此,帧的输出大小将为1.5*1024*640=737280。 YV12的正常大小是1.5*640*480=460800。我知道步幅可以超过真实框架的宽度( https://learn.microsoft.com/en-us/windows/desktop/medfound/image-stride )。我的第一个问题 - 为什么渲染器选择该值(1024)而不是另一个值?我可以通过编程方式获取它吗?
当我用我的过滤器替换 LAV 解码器以进行 RGB24/YV12 转换 ( https://gist.github.com/thedeemon/8052fb98f8ba154510d7 ) 时,渲染器会向我显示移动后的图像,尽管所有参数都相同,如第一张图所示:
为什么?我注意到 VIDEOINFOHEADER2 设置了隔行标记 dwInterlaceFlags。因此我的下一个问题是:我是否必须在过滤器中添加隔行扫描才能使渲染器正常工作?最佳答案
My first question - why did the renderer select that value (1024) than another? Can I get it programmatically?
视频渲染器使用Direct3D纹理作为图像的载体。当纹理被映射到系统内存以启用 CPU 的写访问时,由于视频硬件实现的具体情况,可以应用这种扩展的步幅。您可以通过动态媒体类型协商获取值 1024,如 Handling Format Changes from the Video Renderer 中所述。 .
如果您希望转换过滤器能够直接连接到视频渲染器,则您的转换过滤器必须处理此类更新。
您通常对获取此扩展步幅值不感兴趣,否则因为您通过媒体类型更新获得的值就是要使用的值,并且您必须接受它。
When I replace the LAV decoder with my filter for transformation RGB24/YV12, the renderer shows me a shifted image, though all parameters are the same, as for the first graph... Why?
您的过滤器无法正确处理步幅更新。
...I noted that VIDEOINFOHEADER2 had the set interlacing flag dwInterlaceFlags. Therefore my next question: Do I have to add interlacing into my filter for normal work of renderer?
您此处没有隔行扫描视频。该问题与隔行扫描视频无关。
关于c++ - DirectShow:YV12 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52941728/