VMR9 对捕获的文件施加错误的视频大小
VMR9 imposing wrong video size on captured file
我有以下代码,我试图用它来从网络摄像头捕获并同时预览视频(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);
使用默认渲染器时,w 和 h 为 640, 480,而使用我的 VMR9 实例时,它们为 352, 288。
**编辑**
问题是,在某些时候,由于某种原因,相机输出PIN的格式从以下位置切换:
RGB24
352x288
自:
I420
352x288
而且我想媒体播放器在 AVI 中存在这种格式的问题。一个有趣的事实是,资源管理器中的视频缩略图还可以,我可以看到颜色正确的第一帧。
好吧,当您连接两个过滤器时,它们必须就视频格式(包括分辨率)达成一致。不同的渲染器可能更喜欢不同的格式,因此您有此行为。您可以查询网络摄像头的输出引脚以获取 IAMStreamConfig 接口,以获取支持的格式列表并选择所需的格式。播放捕获的视频时出现问题应该是由不正确的标头引起的:实际视频格式不是文件标头中指定的格式。
RenderStream
是其他 DirectShow API 方法的高级包装器,它为你构建流管道(筛选器图)来填充缺失的部分。由于它正在使用智能连接,因此它可能会添加您不知道的新筛选器,包括您不需要的筛选器,以及可能会影响您在调用时已有的筛选器上的媒体类型(格式)的筛选器。
这是由于未知原因将格式从 640x480 更改为 352x288 的可能原因。很难猜测什么是有效的拓扑,这取决于你来找出它。更可靠的方法是避免RenderStream
,并通过添加和连接您感兴趣的特定过滤器,以更可控的方式以较小的增量构建图形。
- QT在错误的班级中寻找空位
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 使用std::source_location报告错误的最佳实践
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 如何在c++中录制具有精确帧时间戳的视频
- 我无法缩小此分段错误的原因
- 我是如何在这段代码中出现分段错误的
- 错误的cv::face FacemarkLBF实例化
- 模板,函数使用错误的构造函数来复制我的对象
- 使用 bfs 解决连接组件问题时得到错误的答案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 使用具有结构不完整类型错误的模板
- 错误的自动扣除 c++14
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- 导致Segmentation错误的结构中的矢量
- 链表错误的中间
- VMR9 对捕获的文件施加错误的视频大小
- SDL应用程序使用DirectFB错误:没有可用的视频设备