2013-05-13 5 views
6

Я записываю непрерывный поток в потоке высокой четкости HLS. Затем я хочу асинхронно перекодировать это в разные форматы/битрейты. У меня это работает, в основном, кроме аудио артефактов появляются между каждым сегментом (пробелы и попсы).Транскодированные сегменты HLS индивидуально с использованием FFMPEG

Вот пример команды FFmpeg линия:

ffmpeg -threads 1 -nostdin -loglevel verbose \ 
    -nostdin -y -i input.ts -c:a libfdk_aac \ 
    -ac 2 -b:a 64k -y -metadata -vn output.ts 

Осматривая пример звукового файла показывает, что существует разрыв в конце аудио:

End

и начало файл выглядит подозрительно аттенуированным (хотя это может и не быть проблемой):

Start

Мое подозрение, что эти артефакты происходят, потому что транскодирование происходит без контекста потока в целом.

Любые идеи о том, как убедить FFMPEG в создании звука, который поместится обратно в поток HLS?

** UPDATE 1 **

Вот начало/конец оригинального сегмента. Как вы можете видеть, старт по-прежнему выглядит одинаково, но конец заканчивается на 30 секунд. Я ожидаю, что в некоторой степени заполнения с потерями кодирования, но я есть какой-то способ, что HLS удается сделать беспрерывное воспроизведение (это связано с ITunes метод с пользовательских метаданных?)

Original Start Original End

** ОБНОВЛЕНО 2 **

Итак, я преобразовал оба оригинала (128k aac в MPEG2 TS) и перекодированный (64k aac в aac/adts container) в WAV и поместил два бок о бок. Это результат:

Side-by-side start Side-by-side end

Я не уверен, если это представитель того, как клиент будет играть его обратно, но это кажется немного странным, что декодирование транскодированного один вводит щель в start и делает сегмент дольше. Учитывая, что они являются кодировкой с потерями, я бы ожидал, что отступы будут одинаково присутствовать в обоих (если вообще).

** UPDATE 3 **

По http://en.wikipedia.org/wiki/Gapless_playback - только несколько кодеров поддержки бесщелевым - MP3, я переключился на хромой в FFmpeg, и проблема, до сих пор, по-видимому, не было.

Для AAC (см. http://en.wikipedia.org/wiki/FAAC), я попробовал libfaac (в отличие от libfdk_aac), и это также, кажется, создает бесщеточный звук. Однако качество последнего не так велико, и я предпочел бы использовать libfdk_aac.

+0

И как форма волны сравнивается с входным файлом? – vipw

+0

Обновлено с помощью оригинальных и сравниваемых сигналов – rayh

ответ

0

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

Мое предложение состояло в том, чтобы не разбивать несжатый входной звук вообще, а производить только непрерывный сжатый поток, который вы подключаете к аудиопрокси, например сервер icecast2 (или аналогичный, если icecast не поддерживает AAC) и затем выполните разделение/рекомбинацию на стороне клиента прокси, используя куски сжатого аудио.

Итак, метод здесь должен был регулярно (скажем, каждые 60 секунд?) Подключаться к прокси-серверу и собирать кусок звука немного больше, чем период, в который вы проводите опрос (скажем, стоит 75 сек.) - это должен быть настроен для параллельной работы, так как в некоторых точках будет работать два клиента - он может даже запускаться из cron, если это необходимо или требуется из сценария оболочки ...

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

Очевидно, что это упрощение on, но, предполагая, что прокси не добавляет никакой информации метаданных (то есть данных ICY или намека), тогда разделение звука таким образом должно позволить объединять обработанные куски без каких-либо звуковых артефактов, поскольку имеется только один набор выходных данных для исходный аудиовход и их сравнение будут уклоняться, так как на самом деле вам все равно, о формате, это просто байты.

Выгода заключается в том, что вы отключили аудиокодер от клиента, поэтому, если вы хотите запустить какой-либо другой процесс параллельно с перекодировкой в ​​разные форматы или битрейты или более агрессивно переместить поток для какого-либо другого потребителя, тогда что ничего не меняет на стороне кодировщика прокси - вы просто добавляете другого клиента в прокси-сервер, используя цепочку инструментов, аналогичную описанной выше.

+0

Мне нравится идея простого прокси-сервера, который будет буферизовать аудиоданные с устройства. Это позволило бы перезапустить кодировку без потери данных ... особенно если она поняла образцы и могла бы куски данных на границы выборки. – rayh

+0

Однако, не решая исходную проблему, транскодирование в 60-х кусках будет просто вводить эти проблемы на границе фрагментов - артефакты, по-видимому, являются результатом кодирования aac, поэтому они, вероятно, будут влиять и на любые звуковые файлы с сумасшедшим объединением. – rayh

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^