【问题标题】:VMR9 imposing wrong video size on captured fileVMR9 在捕获的文件上施加错误的视频大小
【发布时间】:2013-11-05 16:38:54
【问题描述】:

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

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 中存在这种格式的问题。一个有趣的事实是,资源管理器中的视频缩略图是可以的,我可以看到颜色正确的第一帧。

【问题讨论】:

  • 您是否正确设置了捕获针的分辨率?另外,尝试如果您不使用预览图钉会发生什么。过去我在预览 pin 上遇到过不同的问题,现在我也使用捕获 pin 进行预览(使用智能 tee 和调整大小过滤器)。
  • 谢谢,但问题出在视频格式上,而不仅仅是我最初猜测的分辨率。但是,这种调整大小过滤器在某些情况下会非常有用,我该如何实例化一个呢?
  • 查看 TransNull24 过滤器,它是 directshow sdk 中 RGBFilters 示例应用程序的一部分。它可用于强制 RGB24 流。

标签: c++ directshow video-capture


【解决方案1】:

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

【讨论】:

  • 谢谢,你说得对,问题出在格式上,而不是真正的分辨率。检查更新的帖子。
【解决方案2】:

RenderStream 是其他 DirectShow API 方法的高级包装器,它为您填充缺失的部分构建流式管道(过滤器图)。由于它正在积极使用Intelligent Connect,它可能会添加您不知道的新过滤器,包括您不想要的过滤器,以及可能影响您在发布时已有的过滤器上的媒体类型(格式)的过滤器称呼。

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

【讨论】:

  • 谢谢,我需要仔细检查一下,但看起来 RenderStream 会构建我手动构建的 same 拓扑,但是这样做会将视频源的输出引脚格式更改为媒体播放器和 AVI 不喜欢的格式。
  • 您期望它是相同的,然后您需要查看实际构建的内容。 RenderStream 不为您提供微调构建过程的灵活性。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
相关资源
最近更新 更多