如何解决如何检查Media Foundation是否可以实际播放文件而不只是加载文件
我在使用MPEG1视频和Media Foundation时遇到了一些问题:因此,Media Foundation不支持MPEG1视频流(see here)的播放,但是由于某些原因,它仍然会打开它们,甚至会报告正确的持续时间和帧大小。因此,在打开时,一切看起来都可以播放这些文件。
但是不能!一旦您尝试实际播放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,pTypeUncomp);
if(SUCCEEDED(hr)) printf("NOT AN MPEG1 STREAM!\n");
}
}
}
SAFERELEASE(&pAttr);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。