По какой-то причине я не могу декодировать H.264. Конфигурация ввода/вывода прошла хорошо, точно так же, как создание буфера ввода/вывода.Как сделать декодер Media Foundation H.264?
Я вручную подаю декодер H.264 с использованием потокового видео. Поэтому я использую MFVideoFormat_H264_ES как подтип мультимедиа. Декодирование происходит очень медленно, а декодированные кадры - полный мусор. Другие декодеры должным образом декодируют один и тот же поток.
Странно то, что как только ProcessInput() возвращает MF_E_NOTACCEPTING, следующий ProcessOutput() возвращает MF_E_TRANSFORM_NEED_MORE_INPUT. Согласно MSDN, этого никогда не должно быть.
Может ли кто-нибудь предоставить конкретную информацию о том, как это сделать? (предполагая, что MF H.264 является функциональным, о чем я серьезно сомневаюсь).
Я готов предоставить дополнительную информацию, но я не знаю, что может кому-то понадобиться, чтобы помочь.
Редактировать: Когда нужно сбросить количество байтов в буфере ввода до нуля? Btw, я сброшу выходной буфер, когда ProcessOutput() поставляет что-то (мусор).
Редактирование2: Без сброса текущего размера буфера на входном буфере до 0 мне удалось получить некоторый полу-действительный вывод. По полу-значению я имею в виду, что на каждом успешном ProcessOutput() я получаю изображение YUV, где текущее изображение содержит несколько декодированных макроблоков больше, чем предыдущий кадр. Остальная часть кадра черная. Поскольку я не сбрасываю размер, это останавливается через некоторое время. Таким образом, я думаю, что есть проблема с сбросом размера буфера, и я думаю, что я должен получить некоторое уведомление, когда весь кадр будет выполнен (или нет).
Редактирование3: При создании входного буфера GetInputStreamInfo() возвращает 4096 в качестве размера входного буфера. Выравнивание 0. Однако 4k недостаточно. Увеличение до 4 МБ помогает в распаковке фрагмента кадра фрагментом кадра. Все еще нужно выяснить, есть ли способ рассказать, когда декодируется весь кадр.
Как вы называете SetInputType и SetOutputType декодера? Вы отправили сообщения MFT_MESSAGE_NOTIFY_BEGIN_STREAMING и MFT_MESSAGE_NOTIFY_START_OF_STREAM перед первым вызовом ProcessInput? – VuVirt
Не следует сбросить ни входной, ни выходной буфер. Цитата из MSDN: «Если вызывающий абонент выделяет образец носителя, образец носителя должен содержать буфер, который достаточно велик для хранения выходных данных. Чтобы найти требования к буферам, вызовите GetOutputStreamInfo. MFT записывает выходные данные в начало буфер, переписывая любые данные, которые уже существуют в буфере ». https://msdn.microsoft.com/en-us/library/windows/desktop/ms704014(v=vs.85).aspx – VuVirt
Да, оба сообщения были успешно отправлены, MFT_MESSAGE_NOTIFY_BEGIN_STREAMING и MFT_MESSAGE_NOTIFY_START_OF_STREAM. SetInputType & SetOutputType прошел хорошо. При декодировании я получил MF_E_TRANSFORM_STREAM_CHANGE и успешно обработал его. Когда дело доходит до перезаписывания буфера, на самом деле все не работает, как описывает MSDN. На некоторых декодерах мне пришлось сбросить длину буфера до 0, как только ProcessOutput() доставил что-то. – kytodrk