Можно ли динамически вставлять рекламу или сообщения в файл MP3 с помощью стандартного запроса GET?

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

Можно ли с помощью модуля nginx или apache изменить значение заголовка «Content-Length» MP3 на 60 500 000, а затем контролировать входящие запросы «Content-Range», чтобы первые 500 000 байт возвращали аудиорекламу, а любой запрос диапазона больше 500 000 начинает возвращать обычный аудиофайл со смещением в 500 000 байт?

Или можно только объединить рекламу (или сообщения) в файл MP3 с помощью приложения, такого как FFmpeg, для повторного рендеринга всего файла?

Извините, если это глупый вопрос, я просто пытаюсь мыслить нестандартно.


person Adam    schedule 18.08.2019    source источник
comment
Технически да, поскольку MP3 является потоковым форматом. У вас могут возникнуть сбои и треск, если вы не убедитесь, что обрезаете его на правильном полном кадре. MP3 довольно терпим к разрезанию и склеиванию. Для достижения наилучших результатов убедитесь, что все сегменты имеют одинаковый битрейт.   -  person Matthew Whited    schedule 19.08.2019


Ответы (1)


Вы не можете произвольно сплайсировать MP3 без артефактов и ошибок декодера.

Вы также, как правило, не можете вырезать/склеивать MP3 по границам кадра из-за Bit Reservoir . По сути, конкретный кадр MP3 может содержать данные из другого кадра, чтобы более эффективно использовать доступную полосу пропускания, когда это необходимо. Игнорирование битового резервуара также может вызвать артефакты и/или ошибки декодера.

Что вы можете сделать, так это перекодировать свою рекламу и в конечном итоге снова присоединиться к потоку. То есть в момент вставки рекламы декодируйте поток в PCM, микшируйте (или замените в аудио) для вашего объявления и перекодируйте этот параллельный поток в PCM. Если параметры кодирования те же, в конце концов (после пары дополнительных кадров MP3) у вас будут идентичные битовые потоки, и вы сможете вернуться к чтению потока из того же буфера.

Если вы делаете это для вставки рекламы в потоки интернет-радио (в прямом эфире), имейте в виду, что вам придется делать это на сервере для каждого клиента (или, по крайней мере, для каждого варианта рекламы и варианта времени). Если это для подкастов или другого предварительно записанного контента, я бы рекомендовал маршрут FFmpeg. Вам не нужно ничего создавать, вы можете транслировать и кэшировать вывод по мере его кодирования, и у вас будет совместимость с другими кодеками без создания одноразового кода для каждого кодека/контейнера.

person Brad    schedule 18.08.2019
comment
Спасибо за ваш подробный ответ. Это было бы для подкастов, и я не знал, что вы можете транслировать и кэшировать вывод во время его кодирования, это очень полезно знать. Я начну экспериментировать с FFmpeg и посмотрю, что у меня получится. Еще раз спасибо, что поделились своими знаниями, это очень ценно :) - person Adam; 19.08.2019
comment
@ Адам Конечно, нет проблем! Кроме того, чтобы внести ясность, я не знаю никаких готовых модулей Apache или Nginx, которые сделали бы это за вас. Вам нужно будет создать один или хотя бы скрипт с модулем Nginx Lua. Или напишите свой собственный сервер приложений, к которому вы прокси. Если вам интересно, у меня есть код в виде приложения Node.js, которое вы можете лицензировать для своих целей. Пишите мне по адресу [email protected], если вас это интересует. - person Brad; 19.08.2019
comment
У меня довольно большой опыт работы с Nginx, но я запишу вашу электронную почту, если не смогу придумать собственное решение. Спасибо еще раз! - person Adam; 19.08.2019
comment
@ Адам Звучит хорошо. Кроме того, опция FFmpeg для STDIO — это просто дефис - вместо входного или выходного файла. И, если есть возможность, используйте Опус. Лучшее качество звука, отсутствие проблем с лицензированием, возможность потоковой передачи в WebM или Ogg. - person Brad; 19.08.2019