2017-01-05 3 views
2

Я кодирую исходный звук в AAC с помощью API MediaCodec для Android. Проблема: мне нужно отправить на сервер поток AAC в кусках одной секунды. Поэтому мне нужно разделить поток. Прямо сейчас, поскольку кадр AAC составляет 1024 образца, я принимаю round(SAMPLE_RATE/1024) AAC кадры для каждого фрагмента. Однако из-за «пробных образцов» эта простая резка потока AAC не работает. Подробнее см. Ниже. После отправки фрагмента на сервер клиент получает его в веб-браузере Chrome, а с помощью API Web Audio воспроизводит все полученные фрагменты. Воспроизведение выполняется таким образом, чтобы быть бесщелочным: изначально выделяется большой аудиоблокер, полученные фрагменты декодируются и копируются в аудиобуфере, воспроизводится аудиокнига. Теперь это не работает с AAC (хотя он работает с Ogg/Vorbis). С AAC у меня есть артефакты в сгенерированном звуке. В конце каждой секунды начало следующей секунды равно нулю, затем постепенно, форма волны растет до тех пор, пока она не будет иметь нормальный размер. Это длится 10, 20 миллисекунд. Я считаю, что проблема вызвана отсутствием "priming samples". Возможно, Web Audio API ожидает «пробных образцов» в начале каждого фрагмента AAC, он не находит их и, таким образом, изменяет фактический звук.Разделение потока AAC, проблемы с загрунтованием/заполнением образцов (безщелезное воспроизведение)

Вопрос: как я могу разделить исходный поток AAC и отправить «хорошие» AAC куски одной секунды? Из того, что я понял, я должен включить в начале каждого фрагмента предыдущие два кадра (последние два кадра предыдущего фрагмента). Однако это число должно меняться, и документации не так много. Некоторые советы экспертов приветствуются.

ответ

1

Я использую следующий метод. Я не эксперт AAC, поэтому я, возможно, что-то пропущу, но экспериментально он работает. Предполагая, что декодер Chrome ожидает образцы примитивов в начале каждого фрагмента, я делаю следующее: перед отправкой фрагмента на сервер я добавляю в начале 4 последних кадра AAC предыдущего фрагмента (если это первый фрагмент Я не делаю это). На стороне клиента я извлекаю фрагмент, я его декодирую и удаляю первые 4 * 1024 выборок (1024 = выборки в одном кадре AAC). Это работает.