【发布时间】: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);
使用默认渲染器 w 和 h 是 640、480,而对于我的 VMR9 实例,它们是 352、288。
** 编辑 **
问题是在某些时候,出于某种原因,相机的输出 PIN 格式从以下位置切换:
RGB24
352x288
收件人:
I420
352x288
我猜媒体播放器在 AVI 中存在这种格式的问题。一个有趣的事实是,资源管理器中的视频缩略图是可以的,我可以看到颜色正确的第一帧。
【问题讨论】:
-
您是否正确设置了捕获针的分辨率?另外,尝试如果您不使用预览图钉会发生什么。过去我在预览 pin 上遇到过不同的问题,现在我也使用捕获 pin 进行预览(使用智能 tee 和调整大小过滤器)。
-
谢谢,但问题出在视频格式上,而不仅仅是我最初猜测的分辨率。但是,这种调整大小过滤器在某些情况下会非常有用,我该如何实例化一个呢?
-
查看 TransNull24 过滤器,它是 directshow sdk 中 RGBFilters 示例应用程序的一部分。它可用于强制 RGB24 流。
标签: c++ directshow video-capture