Как я могу кодировать и сегментировать аудиофайлы без промежутков (или звуковых всплесков) между сегментами при их восстановлении?

Я работаю над веб-приложением, которое требует потоковой передачи и синхронизации нескольких аудиофайлов. Для этого я использую API веб-аудио по тегам аудио HTML5 из-за важности синхронизации звука.

В настоящее время я использую функцию сегментации FFMPEG для кодирования и сегментации аудиофайлов на более мелкие фрагменты. Причина, по которой я сегментирую их, заключается в том, что я могу начать потоковую передачу с середины файла, а не с начала (иначе я бы просто разделил файлы с помощью разделения UNIX, , как показано здесь. Проблема в том, что когда я соединяю аудио сегменты вместе, Я слышу всплывающий звук между сегментами.

Если я кодирую сегменты с использованием кодировки PCM (pcm_s24le) в файле .wav, воспроизведение будет плавным, что наводит меня на мысль, что кодировщик заполняет либо начало, либо конец файла. Поскольку я буду иметь дело с множеством разных аудиофайлов, использование .wav потребует слишком большой полосы пропускания.

Я ищу одно из следующих решений проблемы:

  • Как я могу легко сегментировать закодированные аудиофайлы,
  • Как я могу заставить кодировщик НЕ заполнять аудиокадры с помощью ffmpeg (или другой утилиты) или
  • Как лучше транслировать звук (начиная с произвольного времени трека) без использования тега audio?

Системная информация

  • Пользовательский сервер node.js
  • После загрузки аудиофайла node.js передает данные в кодировщик ffmpeg.
  • Необходимо использовать кодировку, поддерживаемую HTML5 Web Audio API
  • Сервер отправляет звуковые фрагменты по одному через сокет WebSockets

Заранее спасибо. Я старался быть как можно более ясным, но если вам нужны разъяснения, я буду более чем готов их предоставить.


person fenduru    schedule 13.02.2013    source источник


Ответы (1)


Поскольку PCM - это несжатый формат, ожидается плавное воспроизведение. Нет ничего, что могло бы вызвать сбой. То же самое произойдет, если вы используете какой-нибудь кодек без потерь, например flac. С другой стороны, если вы используете какой-либо кодек с потерями, такой как mp3, wma и т. Д., Без каких-либо вмешательств избежать сбоев невозможно. Например, декодер WMA всегда будет давать больше PCM, чем вы изначально предоставили при кодировании. Эти дополнительные байты вызовут сбой, а также уменьшат продолжительность. Кроме того, такое объединенное воспроизведение (список вырезок) будет иметь большую продолжительность, чем должно. Вы можете попытаться сгладить сбой с помощью фильтрации DSP. Вы даже можете попробовать некоторые простые действия, такие как перекрестное затухание переходов и т. Д. Возможно, это дало бы некоторые полезные результаты.

Если какой-либо кодек без потерь неприемлем из-за пропускной способности, другим подходом было бы создание сжатых файлов с кодеком с потерями, например mp3, и начало потоковой передачи с расчетной позиции. Конечно, у вас не может быть точного поиска по сэмплу, как в PCM, и вы получите небольшое количество бесполезного PCM во время декодирования, потому что вы начнете декодирование сжатых данных в середине без каких-либо «предыдущих данных», необходимых для декодера. Я бы предложил постоянный битрейт при кодировании таких файлов, потому что вы сможете более точно вычислить позицию поиска в сжатом файле до начала потоковой передачи.

Что касается сбоев здесь, если вы начнете кодировать такие файлы mp3 и создадите эти файлы БЕЗ остановки кодировщика, тогда не будет сбоев при переключении файлов, потому что вы просто разделили сжатые данные на большее количество файлов. Конечно, вам, вероятно, придется реализовать это самостоятельно.

person user1764961    schedule 16.05.2013