VMR9 对捕获的文件施加错误的视频大小

VMR9 imposing wrong video size on captured file

本文关键字:错误 的视频 施加 文件 VMR9      更新时间:2023-10-16

我有以下代码,我试图用它来从网络摄像头捕获并同时预览视频(pRenderer指向窗口化的VMR9过滤器,mPMux指向ICaptureGraphBuilder2返回的mux::SetOutput文件名):

hr = mPBuild->RenderStream(
    &PIN_CATEGORY_PREVIEW,
    &MEDIATYPE_Video,
    mPCapVideo,
    NULL,
    pRenderer);
hr = mPBuild->RenderStream(
    &PIN_CATEGORY_CAPTURE,
    &MEDIATYPE_Video,
    mPCapVideo,
    NULL,
    mPMux);
虽然

预览看起来不错,但拍摄的视频分辨率只有352x288,并且严重失真,虽然我仍然可以在其中识别出我的两个脸部实例,但它充斥着明亮的绿色区域,并呈现出交错的伪像。只有Windows Media Player似乎无法渲染此视频,VLC和Quicktime显示正确渲染的352x288视频。

如果我使用默认渲染器:

hr = mPBuild->RenderStream(
    &PIN_CATEGORY_PREVIEW,
    &MEDIATYPE_Video,
    mPCapVideo,
    NULL,
    NULL);
hr = mPBuild->RenderStream(
    &PIN_CATEGORY_CAPTURE,
    &MEDIATYPE_Video,
    mPCapVideo,
    NULL,
    mPMux);

捕获的AVI的大小为640x480,所有播放器都可以正确复制它,包括媒体播放器。

看起来 VMR9 正在对整个图形施加视频大小,即使对于捕获的文件也是如此。这种直觉由以下代码确认,该代码放置在调用 IMediaControl::Run 之前:

IBasicVideo *pBasicVideo;
hr = mPGraph->QueryInterface(IID_PPV_ARGS(&pBasicVideo));
long w, h;
hr = pBasicVideo->GetVideoSize(&w, &h);

使用默认渲染器时,wh 为 640, 480,而使用我的 VMR9 实例时,它们为 352, 288。

**编辑**

问题是,在某些时候,由于某种原因,相机输出PIN的格式从以下位置切换:

RGB24
352x288

自:

I420
352x288

而且我想媒体播放器在 AVI 中存在这种格式的问题。一个有趣的事实是,资源管理器中的视频缩略图还可以,我可以看到颜色正确的第一帧。

好吧,当您连接两个过滤器时,它们必须就视频格式(包括分辨率)达成一致。不同的渲染器可能更喜欢不同的格式,因此您有此行为。您可以查询网络摄像头的输出引脚以获取 IAMStreamConfig 接口,以获取支持的格式列表并选择所需的格式。播放捕获的视频时出现问题应该是由不正确的标头引起的:实际视频格式不是文件标头中指定的格式。

RenderStream是其他 DirectShow API 方法的高级包装器,它为你构建流管道(筛选器图)来填充缺失的部分。由于它正在使用智能连接,因此它可能会添加您不知道的新筛选器,包括您不需要的筛选器,以及可能会影响您在调用时已有的筛选器上的媒体类型(格式)的筛选器。

这是由于未知原因将格式从 640x480 更改为 352x288 的可能原因。很难猜测什么是有效的拓扑,这取决于你来找出它。更可靠的方法是避免RenderStream,并通过添加和连接您感兴趣的特定过滤器,以更可控的方式以较小的增量构建图形。