потоковое аудио с IMFSourceReader (Microsoft Media Foundation) - PullRequest
2 голосов
/ 10 января 2020

Я использую MFCreateSourceReaderFromByteStream для создания IMFSourceReader с пользовательским IMFByteStream, получающим данные из удаленного источника HTTP.

Когда источником является файл m4a, все работает как положено. Однако, когда источником является mp3, функция MFCreateSourceReaderFromByteStream не возвращает, пока весь файл не будет загружен. Любая идея о том, как избежать такого поведения и начать декодировать аудио до окончания загрузки?

1 Ответ

1 голос
/ 14 января 2020

Предполагая, что вы используете источник мультимедиа по умолчанию, возможно, это поведение по умолчанию для источника файлов MP3 и источника файлов MPEG-4.

Чтобы подтвердить это, вы можете попробовать использовать пользовательский источник аудиофайлов mpeg, как этот, который я реализовал: MFSrMpeg12Decoder

Этот источник медиа-фонда управляет только аудиофайлом в формате mp1 / mp2 и выполняет декодирование. Это не mp3, но он предоставляет байтовый поток при наличии действительного audio mpeg header и не читает полный файл (вы можете мне доверять ...).

Это подтвердит, что по умолчанию для источника файлов MP3 необходимо прочитать полный файл, прежде чем будет предоставлен байтовый поток.

Одним из возможных ответов будет то, что источник файла MP3 читает весь файл, чтобы увидеть, есть ли переменная скорость передачи данных, и, таким образом, обеспечивает правильную длительность файла (MF_PD_DURATION). Для аудиофайла m4a длительность определяется атомом moov, поэтому нет необходимости читать полный файл.

...