0

我正在使用 Media Foundation 为 Windows 开发音频/视频捕获库。但是,对于 Windows 8.1 上的某些网络摄像头,我遇到了这篇文章中描述的问题。因此,我决定使用 Directshow 进行另一个实现,以在我的应用程序中支持尚未更新驱动程序的网络摄像头。

该库运行良好,但我注意到一些网络摄像头存在问题,根据在启动摄像头之前设置的格式,返回的样本 (IMediaSample) 没有达到预期的大小。

例如,我遇到格式集的子类型为 MEDIASUBTYPE_RGB24(每像素 3 个字节)且帧大小为 640x480 的情况。应用格式时,biSizeImage(来自 BITMAPINFOHEADER)很好 640*480*3 = 921600。IAMStreamConfig::SetFormat() 方法成功应用格式。

hr = pStreamConfig->SetFormat(pmt);

我还将格式设置为 Sample Grabber Interface,如下所示:

hr = pSampleGrabberInterface->SetMediaType(pmt);

我在开始图表之前应用了格式。

但是,在回调 (ISampleGrabberCB::SampleCB) 中,我收到一个大小为 230400 的样本(它可能是大小为 320x240 (320*240*3=230400) 的帧的缓冲区)。

HRESULT MyClass::SampleCB(double sampleTime, IMediaSample *pSample)
{
   unsigned char* pBuffer= 0;
   HRESULT hr = pSample->GetPointer((unsigned char**) &pBuffer);
   if(SUCCEEDED(hr) {
      long bufSize = pSample->GetSize();
      //bufSize = 230400
   }
}

我试图调查使用 IMediaSample::GetMediaType() 方法返回的媒体类型,但媒体类型为 NULL,这意味着根据GetMediaType 方法的文档,媒体类型没有改变(所以我猜,它仍然是我使用 IAMStreamConfig::SetFormat() 函数成功应用的媒体类型)。

HRESULT hr = pSample->GetMediaType(&pType);

if(SUCCEEDED(hr)) {
   if(pType==NULL) {
     //it enters here => the media type has not changed!
   } 
}

为什么在这种情况下返回的样本缓冲区大小不是预期的大小?我该如何解决这个问题?

提前致谢!

4

1 回答 1

1

Sample Grabber 回调将始终返回“正确”的大小,它与流管道中使用的实际数据大小和格式相匹配。

如果您看到不匹配,这意味着您的过滤器图形拓扑与您期望的不同。您需要查看图表(尤其是通过 GraphEdit 使用远程连接),检查媒体类型并检查其构建不正确的原因。例如,您可能在连接引脚后应用您感兴趣的格式,但为时已晚。

也可以看看:

于 2015-04-03T13:24:04.713 回答