微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查Media Foundation是否可以实际播放文件而不只是加载文件

如何解决如何检查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 举报,一经查实,本站将立刻删除。