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

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

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

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам