我正在使用 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!
}
}
为什么在这种情况下返回的样本缓冲区大小不是预期的大小?我该如何解决这个问题?
提前致谢!