Как мне обработать первый вывод ByteBuffers декодера Android MediaCodec?

Я пытаюсь написать звуковой ресемплер, используя пакет Android MediaCodec.

В настоящее время я загружаю стереофонический аудиофайл MP3 в MediaExtractor, который затем декодируется MediaCodec. Частота дискретизации исходного аудио составляет 48000.

Чего я не понимаю, так это первых четырех выходных буферов, которые я получаю от декодера:

  1. размер 0, время 0
  2. размер 0, время 24000
  3. размер 4312, время 48000
  4. размер 4608, время 72000
  5. размер 4608, время 96000
  6. и т.п.

Из этот ответ, этот ответ и эту статью , я считаю, что первые два буфера просто распространяют «задержку кодировщика» и могут быть просто выброшены. Однако третий буфер, который я перечислил, ставит меня в тупик.

Для буфера № 4 (и далее) математика работает так:

((4608 bytes) / (2 bytes/sample) / (2 channels)) 
    / ((48,000 samples/sec) / (1,000,000 us/sec))
= 24,000 us (i.e. the change in time between buffers)

Что происходит с буфером № 3? Прямой взгляд на данные показывает, что звук начинает воспроизводиться во время 48000 мкс, а затем на мгновение останавливается перед отметкой 72000 мкс, после чего он начинает воспроизводиться непрерывно без перерывов.

Кажется более вероятным, что перед данными буфера № 3 есть 296 скрытых нулей, но это смещение, похоже, не указывается никакими переменными в моем коде. Может ли кто-нибудь пролить свет на это для меня?


person Grant    schedule 30.10.2016    source источник
comment
Удалось ли вам написать аудиосэмплер, используя API медиакодека?   -  person Amit Bhandari    schedule 02.03.2020


Ответы (1)


Насколько я понял, аудиоматериалы MediaCodec* на самом деле не заботятся о том, какие временные метки связаны с каждым буфером. Вместо этого он просто волшебным образом пересчитывает временные метки, которые должны быть для каждого фрагмента данных, используя указанный битрейт, предполагая, что в потоке байтов нет дыр.

В качестве подтверждения этой гипотезы одна из частей решения в этом ответе просто предлагает увеличить значения отметки времени и фактически не вычисляя правильные временные метки.

Таким образом, в примере с этим вопросом аудиоматериалы MediaCodec * полностью игнорируют все значения временных меток. MediaCodec будет считать время байта №1 буфера №3 равным 0, а время для байта №1 буфера №4 будет выведено из количества обработанных байтов и не принято как 24000 или 48000.

* а именно объект MediaCodec или какой-либо связанный с ним пользовательский компонент

Примечание. Видеокодер MediaCodec, кажется, заботится о временных метках.

person Grant    schedule 22.01.2017