【发布时间】:2016-05-30 14:43:15
【问题描述】:
我正在实现一个用于播放视频的 Windows 应用程序(某种视频播放器)。我正在使用 MediaFoundation 进行视频播放,它适用于大多数视频,但无法播放某些视频。
我创建了以下 MF 拓扑:MF_TOPOLOGY_SOURCESTREAM_NODE -> MF_TOPOLOGY_TRANSFORM_NODE(Microsoft H264 视频解码器 MFT)-> MF_TOPOLOGY_TRANSFORM_NODE(Resizer MFT)-> MF_TOPOLOGY_TRANSFORM_NODE(颜色转换器 MFT)-> MF_TOPOLOGY_OUTPUT_NODE(SampleGrabberSink)。
当我在我的应用程序中播放某些视频时,会发生以下情况(通过 mftrace 工具从 MF 跟踪中获取):
-
MF 为 Resizer MFT 创建变换节点、MFTransform 和 MEdiaObject:
COle32ExportDetours::CoCreateInstance @ Created {1EA1EA14-48F4-4054-AD1A-E8AEE10AC805} Resizer DMO (C:\Windows\SysWOW64\vidreszr.dll) @0561F060 - 跟踪接口:IMFTransform @0561F060,IMediaObject @0561F078
-
MF设置resizer变换的输入类型和输出类型:
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
用户开始播放视频。
-
MF 再次设置 resizer 变换的输入类型和输出类型:
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 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_DEFAULT_STRIDE=720; MF_MT_ALL_SAMPLES_INDEPENDENT=1; MF_MT_FIXED_SIZE_SAMPLES=1; MF_MT_SAMPLE_SIZE=438480
-
Resizer 转换的 MediaObject 无法处理输出:
CMFTransformDetours::ProcessInput @0561F060 流 ID 0,样本 @056F74C8,时间 80 毫秒,持续时间 40 毫秒,缓冲区 1,大小 449280B,{B4DD4A8C-0BEB-44C4-8B75-B02B913B04F0}=0;MFSampleExtension_Discontinuity_CleanPoint=1;MFSampleExtension_Discontinuity_Point=1 ;MFSampleExtension_Interlaced=0;MFSampleExtension_Token=@00000000 CMediaObjectDetours::ProcessInput @0561F078 MediaBuffer @0567AFE8,标志 0x00000007,时间 80 毫秒,持续时间 40 毫秒,大小 449280B CMediaObjectDetours::ProcessOutput @0561F078 失败 hr=0x80004005 E_FAIL CMFTransformDetours::ProcessOutput @0561F060 失败 hr=0x80004005 E_FAIL
ResizerMFT第二次设置输入输出类型后处理输出失败的原因是什么?与输出类型的属性有关吗?有没有办法获得有关此失败的更多信息?
任何答案将不胜感激。
【问题讨论】: