如何检查Media Foundation是否真的可以播放文件,而不仅仅是加载它



我在MPEG1视频和Media Foundation方面遇到了一些问题:因此Media Foundation不支持播放MPEG1视频流(请参阅此处(,但出于某种原因,它仍然会打开它们,甚至会报告正确的持续时间和帧大小。所以在打开的时候,一切看起来都可以播放这些文件。

但它不能!一旦您尝试实际播放MPEG1视频文件,IMFAsyncCallback::Invoke()将被调用,状态为MESessionTopologySet,然后IMFMediaEvent::GetStatus()将返回0xc004f011,仅此而已。

那么,有没有办法检查Media Foundation在打开视频格式后是否真的可以播放该格式,或者有没有办法让Media Foundation只打开它能播放的文件?目前,我只能通过尝试开始播放来判断文件是否可以播放,然后看看它是否有效,这有点不方便。我希望能够判断一个文件是否可以更早播放。

我现在已经通过使用IMFSourceReader解决了这个问题。我发现尝试将媒体类型设置为MFVideoFormat_RGB32在MPEG1视频流中会失败,但在MPEG4中可以正常工作,因此这可能是检查media Foundation是否真的可以播放文件的可行方法。在代码中,解决方案如下:

hr = MFCreateAttributes(&pAttr, 1);
if(SUCCEEDED(hr)) {

IMFAttributes_SetUINT32(pAttr, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
IMFAttributes_SetUINT32(pAttr, &MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING, TRUE);
hr = MFCreateSourceReaderFromURL(filename, pAttr, &pReader);
if(SUCCEEDED(hr)) {

hr = IMFSourceReader_GetCurrentMediaType(pReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &pFileVideoMediaType);
if(SUCCEEDED(hr)) {

hr = MFCreateMediaType(&pTypeUncomp);
if(SUCCEEDED(hr)) {

IMFMediaType_CopyAllItems(pFileVideoMediaType, (IMFAttributes *) pTypeUncomp);
IMFMediaType_SetGUID(pTypeUncomp, &MF_MT_SUBTYPE, &MFVideoFormat_RGB32);
IMFMediaType_SetUINT32(pTypeUncomp, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
IMFMediaType_SetUINT32(pTypeUncomp, &MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
hr = IMFSourceReader_SetCurrentMediaType(pReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, pTypeUncomp);
if(SUCCEEDED(hr)) printf("NOT AN MPEG1 STREAM!n");
}
}
}

SAFERELEASE(&pAttr);
}

相关内容

最新更新