Различное поведение кодера H.264 MFT на Win7 и Win8
Несколько месяцев прошло с тех пор, как я закончил свою программу, которая использует H.264 и кодировщик AAC MFT для преобразования видеофайлов в MP4. Хотя он хорошо работает на Win7, когда я вчера запускал его на Win8 (также пробовал на Win10 Build 10240), я обнаружил нечто иное, что я видел на Win7.
Моя программа вызывает MFT->ProcessInput() для отправки кадров в кодировщик и вызывает ProcessOutput после каждого ProcessInput.
Ниже приведен журнал, созданный при конвертации файла в Win7. Каждый раз, когда вызывается ProcessInput, ProcessOutput возвращает кадр.
Line 178: 00:00:24.562 MAIN encoding time = 0, duration = 420000
Line 180: 00:00:24.828 MAIN sample returned, sample time = 0
Line 185: 00:00:24.875 MAIN encoding time = 420000, duration = 420000
Line 187: 00:00:25.234 MAIN sample returned, sample time = 420000
Line 192: 00:00:25.359 MAIN encoding time = 840000, duration = 420000
Line 194: 00:00:25.469 MAIN sample returned, sample time = 840000
Line 199: 00:00:25.484 MAIN encoding time = 1260000, duration = 410000
Line 201: 00:00:25.562 MAIN sample returned, sample time = 1260000
Line 206: 00:00:25.578 MAIN encoding time = 1670000, duration = 420000
Line 208: 00:00:25.656 MAIN sample returned, sample time = 1670000
Line 213: 00:00:25.672 MAIN encoding time = 2090000, duration = 420000
Line 215: 00:00:25.781 MAIN sample returned, sample time = 2090000
Line 220: 00:00:25.859 MAIN encoding time = 2510000, duration = 420000
Line 222: 00:00:26.015 MAIN sample returned, sample time = 2510000
Ниже приведено то, что я видел при преобразовании одного и того же файла в Windows 8.1 64bit и Windows 10
Line 196: 00:00:21.187 MAIN encoding time = 0, duration = 420000
Line 200: 00:00:21.203 MAIN encoding time = 420000, duration = 420000
Line 204: 00:00:21.234 MAIN encoding time = 840000, duration = 420000
Line 208: 00:00:21.265 MAIN encoding time = 1260000, duration = 410000
Line 210: 00:00:21.281 MAIN sample returned, sample time = 420000
Line 215: 00:00:21.297 MAIN encoding time = 1670000, duration = 420000
Line 217: 00:00:21.312 MAIN sample returned, sample time = 1260000
Line 222: 00:00:21.343 MAIN encoding time = 2090000, duration = 420000
Line 224: 00:00:21.359 MAIN sample returned, sample time = 840000
Line 230: 00:00:21.375 MAIN encoding time = 2510000, duration = 420000
Line 232: 00:00:21.406 MAIN sample returned, sample time = 2090000
Line 237: 00:00:21.422 MAIN encoding time = 2930000, duration = 410000
Line 239: 00:00:21.437 MAIN sample returned, sample time = 1670000
Line 245: 00:00:21.468 MAIN encoding time = 3340000, duration = 420000
Line 247: 00:00:21.484 MAIN sample returned, sample time = 2930000
Line 252: 00:00:21.515 MAIN encoding time = 3760000, duration = 420000
Line 254: 00:00:21.515 MAIN sample returned, sample time = 2510000
Не имеет значения, что первый кадр возвращается до тех пор, пока в кодер не отправлено 4 кадра, для меня важно, чтобы временные метки возвращенных кадров не монотонно увеличивались. (42, 126, 84, 209 ... временные метки получают путем вызова IMFSample->GetSampleTime()).
После этого я запустил mftrace на Windows 10 и получил это
MFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @08379F88, Time 0ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 42ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 84ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 126ms, Duration 41ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 167ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 209ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 42ms, Duration 42ms, Buffers 1, Size 24841B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=0 (0,0);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=0;MFSampleExtension_CleanPoint=1;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 251ms, Duration 42ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 126ms, Duration 42ms, Buffers 1, Size 1152B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=420000 (0,420000);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=1;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessInput @0845899C Stream ID 0, Sample @0C16F1B8, Time 293ms, Duration 41ms, Buffers 1, Size 345600B,
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 84ms, Duration 42ms, Buffers 1, Size 20B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=840000 (0,840000);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=2;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
Давайте проверим только ProcessOutput
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 42ms, Duration 42ms, Buffers 1, Size 24841B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=0 (0,0);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=0;MFSampleExtension_CleanPoint=1;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 126ms, Duration 42ms, Buffers 1, Size 1152B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=420000 (0,420000);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=1;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
CMFTransformDetours::ProcessOutput @0845899C Stream ID 0, Sample @08379F88, Time 84ms, Duration 42ms, Buffers 1, Size 20B, {73A954D4-09E2-4861-BEFC-94BD97C08E6E}=840000 (0,840000);{9154733F-E1BD-41BF-81D3-FCD918F71332}=65535;{973704E6-CD14-483C-8F20-C9FC0928BAD5}=2;MFSampleExtension_CleanPoint=0;{B2EFE478-F979-4C66-B95E-EE2B82C82F36}=29 (0,29)
CMFTransformDetours::ProcessOutput @0845899C failed hr=0xC00D6D72 MF_E_TRANSFORM_NEED_MORE_INPUT
мы можем видеть, что возвращенные метки времени 42, 126, 84 ...
Поскольку в моей программе мультиплексор (который мультиплексирует закодированные видео- и аудиоданные и записывает их в файлы) требует монотонно увеличивающихся временных меток, поведение кодера H.264 MFT на Win8/10 нарушает преобразование файлов.
Если кого-то интересует весь журнал mftrace, я разместил его здесь https://dl.dropboxusercontent.com/u/89678527/mfrelease.log
Спасибо за любое предложение.