调整大小MFT在播放H264编码视频时无法处理输出

3
我正在为Windows实现一个应用程序,用于播放视频(一种视频播放器)。我正在使用MediaFoundation进行视频播放,并且对于大多数视频,它都可以正常工作,但是对于某些视频失败了。
我创建了以下MF拓扑结构:MF_TOPOLOGY_SOURCESTREAM_NODE -> MF_TOPOLOGY_TRANSFORM_NODE(Microsoft H264视频解码器MFT)-> MF_TOPOLOGY_TRANSFORM_NODE(Resizer MFT)-> MF_TOPOLOGY_TRANSFORM_NODE(Color Converter MFT)-> MF_TOPOLOGY_OUTPUT_NODE(SampleGrabberSink)。
当我在我的应用程序中播放某些视频时,发生了以下情况(通过mftrace工具从MF跟踪中获取):
  1. MF创建变换节点,MFTransform和Resizer MFT的MediaObject:

    COle32ExportDetours::CoCreateInstance @ Created {1EA1EA14-48F4-4054-AD1A-E8AEE10AC805} Resizer DMO (C:\Windows\SysWOW64\vidreszr.dll) @0561F060 - 跟踪接口: IMFTransform @0561F060, IMediaObject @0561F078

  2. MF设置调整器变换的输入类型和输出类型:

    CMFTransformDetours::SetInputType @0561F060 成功 MT: MF_MT_MAJOR_TYPE=MEDIATYPE_Video; MF_MT_SUBTYPE=MFVideoFormat_YV12; MF_MT_FRAME_SIZE=3092376453526 (720,406); MF_MT_FRAME_RATE=107374182401(25,1); MF_MT_PIXEL_ASPECT_RATIO=1743756722581(406,405); MF_MT_INTERLACE_MODE=7; MF_MT_AVG_BITRATE=639540; MF_MT_DEFAULT_STRIDE=720; MF_MT_ALL_SAMPLES_INDEPENDENT=1; MF_MT_FIXED_SIZE_SAMPLES=1; MF_MT_SAMPLE_SIZE=438480

    CMFTransformDetours::SetOutputType @0561F060 成功 MT: MF_MT_MAJOR_TYPE=MEDIATYPE_Video; MF_MT_SUBTYPE=MFVideoFormat_YV12; MF_MT_FRAME_SIZE=3092376453526 (720,406); MF_MT_FRAME_RATE=42949672960400000 (10000000,400000); MF_MT_GEOMETRIC_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 96 01 00 00 ; MF_MT_PIXEL_ASPECT_RATIO=1743756722581(406,405); MF_MT_INTERLACE_MODE=7; MF_MT_DEFAULT_STRIDE=720; MF_MT_ALL_SAMPLES_INDEPENDENT=1; MF_MT_FIXED_SIZE_SAMPLES=1;MF_MT_SAMPLE_SIZE=438480

  3. 用户开始视频播放。

  4. MF再次设置调整器变换的输入类型和输出类型:

    CMFTransformDetours::SetInputType @0561F060 成功 MT: MF_MT_MAJOR_TYPE=MEDIATYPE_Video; MF_MT_SUBTYPE=MFVideoFormat_YV12; MF_MT_FRAME_SIZE=3092376453536 (720,416); MF_MT_FRAME_RATE=107374182401 (25,1); MF_MT_GEOMETRIC_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 96 01 00 00 ; MF_MT_MINIMUM_DISPLAY_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 96 01 00 00 ; MF_MT_PAN_SCAN_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 96 01 00 00 ; MF_MT_PIXEL_ASPECT_RATIO=1743756722581 (406,405); MF_MT_VIDEO_PRIMARIES=2; MF_MT_INTERLACE_MODE=7; MF_MT_VIDEO_NOMINAL_RANGE=2; MF_MT_TRANSFER_FUNCTION=5; MF_MT_YUV_MATRIX=1; MF_MT_AVG_BITRATE=639540; MF_MT_DEFAULT_STRIDE=720; MF_MT_ALL_SAMPLES_INDEPENDENT=1; MF_MT_FIXED_SIZE_SAMPLES=1; MF_MT_SAMPLE_SIZE=449280; MF_MT_COMPRESSED=0; MF_MT_AVG_BIT_ERROR_RATE = 0

    CMFTransformDetours::SetOutputType @0561F060 成功 MT: MF_MT_MAJOR_TYPE=MEDIATYPE_Video; MF_MT_SUBTYPE=MFVideoFormat_YV12; MF_MT_FRAME_SIZE=3092376453526 (720,406); MF_MT_FRAME_RATE=42949672960400000 (10000000,400000); MF_MT_GEOMETRIC_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 a0 01 00 00 ; MF_MT_MINIMUM_DISPLAY_APERTURE=00 00 00 00 00 00 00 00 d0 02 00 00 96 01 00 00 ; MF_MT_PAN_SCAN_APERTURE=00 00 00 00 00 00 00

    在第二次设置其输入和输出类型后,ResizerMFT无法处理输出的原因是什么?这与输出类型的属性有关吗?有没有方法可以获取有关此错误的更多信息?

    任何答案将不胜感激。

1个回答

1
我不确定,因为hr=0x80004005表示“未指定错误”,这是非常有用的信息...
看着你的问题,在设置(输入/输出)类型时,MF_MT_INTERLACE_MODE等于7:MFVideoInterlace_MixedInterlaceOrProgressive。
也许在流是隔行扫描时你会遇到这个错误。
在你的ProcessInput中,MF_MT_INTERLACE_MODE等于0:MFVideoInterlace_Unknown。也许问题就出在这里。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接