Resizer MFT не может обработать вывод во время воспроизведения видео в кодировке H264
Я реализую приложение для Windows, которое должно воспроизводить видео (какой-то видеоплеер). Я использую MediaFoundation для воспроизведения видео, и он отлично работает для большинства видео, но не работает с некоторыми.
Я создаю следующую топологию MF: MF_TOPOLOGY_SOURCESTREAM_NODE -> MF_TOPOLOGY_TRANSFORM_NODE (видеодекодер Microsoft H264 MFT) -> MF_TOPOLOGY_TRANSFORM_NODE (Resizer MFT) -> преобразователь MF_TOPOLOGY_TRANSFORM_NDF_RUST_FB_ROG_FD_TOP_OUT_OUT_OFT_NOF_TOR_NT_TORNT_TOR_NT_TOR_NT_TOR_NT_TOR_NT_ROG_TOR_NT_TOR_RUB_RUS_FORNT
Когда я играю определенное видео в моем приложении, происходит следующее (взято из следов MF с помощью инструмента mftrace):
MF создает узел преобразования, MFTransform и MEdiaObject для Resizer MFT:
COle32ExportDetours:: CoCreateInstance @ Created {1EA1EA14-48F4-4054-AD1A-E8AEE10AC805} Resizer DMO (C: \ Windows \ SysWOW64 \ vidreszr.dll) @ 0561F060 - отслеживаемые интерфейсы: IMFTransform @0561F060, IMedia
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(406405); 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(406405); 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 снова устанавливает тип ввода и тип преобразования преобразования:
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
MediaObject преобразования Resizer не может обработать вывод:
CMFTransformDetours:: ProcessInput @ 0561F060 Идентификатор потока 0, образец @056F74C8, время 80 мс, длительность 40 мс, буферы 1, размер 449280B, {B4DD4A8C-0BEB-44C4-8B75-B02B913B04F0}=0;MFSampleExtension_Ex_in_Ex_Ex_Ex_D_D_D_D_W_D_D_W_D_0_0_0_0_0_0_0_0_0_in_D_S_S_E_S_S_S_S_0_P_0_0_0_0_0-я_интер 0;MFSampleExtension_Token=@00000000 CMediaObjectDetours::ProcessInput @0561F078 MediaBuffer @0567AFE8, флаги 0x00000007, Time 80ms, продолжительность 40мс, размер 449280B CMediaObjectDetours::ProcessOutput @0561F078 удалось ч =0x80004005 E_FAIL CMFTransformDetours::ProcessOutput @0561F060 не удалось ч = 0x80004005 E_FAIL
По какой причине ResizerMFT не может обработать выходные данные после того, как его типы ввода и вывода были установлены во второй раз? Это что-то о свойствах типа вывода? Есть ли способ получить больше информации об этом сбое?
Любой ответ будет с благодарностью.
1 ответ
Я не уверен, потому что hr=0x80004005 означает "Unspecified Error", очень полезная информация...
Если посмотреть на вашу проблему, для типа Set (in/out) тип MF_MT_INTERLACE_MODE равен 7: MFVideoInterlace_MixedInterlaceOrProgressive.
Возможно, у вас есть эта ошибка, когда поток чересстрочный.
В вашем ProcessInput MF_MT_INTERLACE_MODE равно 0: MFVideoInterlace_Unknown. Возможно, проблема в этом.