gpt4 book ai didi

c++ - Sample Grabber 返回的 IMediaSample 具有意外的缓冲区大小

转载 作者:行者123 更新时间:2023-11-28 06:20:14 34 4
gpt4 key购买 nike

我正在使用 Media Foundation 开发适用于 Windows 的音频/视频捕获库。但是,我遇到了描述的问题 in this post对于 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,这意味着,根据 the documentation of the GetMediaType method媒体类型没有改变(所以我猜,它仍然是我使用 IAMStreamConfig::SetFormat() 函数成功应用的媒体类型)。

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

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

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

提前致谢!

最佳答案

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

如果您发现不匹配,则表示您的过滤图拓扑结构与您预期的不同。您需要查看图表(特别是 using remote connection by GraphEdit ),检查媒体类型并检查构建错误的原因。例如,您可能在连接引脚后应用您感兴趣的格式,但为时已晚。

另见:

关于c++ - Sample Grabber 返回的 IMediaSample 具有意外的缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29431790/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com