c++ - DirectShow:YV12 渲染

标签 c++ video rendering directshow yuv

我试图了解如何进行 YV12 格式的渲染。例如,我拿了一个简单的样本。看这个图: enter image description here

网络摄像头以 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 ) 时,渲染器会向我显示移动后的图像,尽管所有参数都相同,如第一张图所示:

enter image description here

为什么?我注意到 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/

相关文章:

java - 如何从各种视频文件格式中提取元数据?

javascript - AJAX PHP 视频上传并转换为 flv

javascript - 如何提高 jQuery 动画性能?

java - JNI native dll 不返回 jobjectArray 导致 VM 崩溃

c++ - 部分udp文件传输

c++ - 使用初始化列表的优点?

video - 使用ffmpeg连接后如何输出mp4

javascript - 将 draw.io 图渲染为 png

c# - ASP.NET MVC 渲染 Model 时如何绑定(bind) jQuery 事件

C++ 如何对非常快的操作进行基准测试