Как транслировать аудио файлы в режиме реального времени - PullRequest
0 голосов
/ 17 января 2019

Я пишу сервер потокового аудио - аналогично Icecast, и у меня возникла проблема с потоковыми аудиофайлами. Прокси-аудио работает нормально (аудио-источник подключается и отправляет аудио в режиме реального времени, который затем передается клиентам через HTTP), но когда я пытаюсь передать аудиофайл, он быстро проходит - клиенты получают весь аудиофайл в пределах их локальный буфер. Я хочу, чтобы в их локальном буфере было всего несколько секунд секунд.

По сути, как я могу замедлить отправку аудиофайла по HTTP? Все файлы в формате MP3. Мне удалось заставить его работать, экспериментируя с жестко заданными задержками потоков и т. Д., Но это не является устойчивым решением.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Самый простой способ (на сегодняшний день) будет иметь по запросу клиентские фрагменты аудиофайла. std::net::TcpStream (это то, что вы сказали, что используете) не имеет метода регулирования скорости передачи, поэтому у вас нет многих возможностей ограничить потоковую передачу, кроме использования жестко закодированных задержек потоков.

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

Это похоже на работу реальных потоковых сервисов (таких как Youtube), потому что, как вы сказали, было бы плохой идеей хранить весь файл на стороне клиента.

0 голосов
/ 17 января 2019

Если вы придерживаетесь http, вы можете использовать кодирование передачи по частям и отложить отправку пакетов / кусков. Это действительно будет что-то похожее на жестко закодированный thread::sleep, но вы можете использовать цикл обработки событий, чтобы определить, когда отправлять следующий фрагмент, вместо того, чтобы останавливать поток.

Вы можете столкнуться с проблемами синхронизации, возможно, ваша логика сна вызывает более длительные задержки, чем время исполнения песни. У YouTube та же логика, о которой вы говорите. Похоже, что они разбивают видео на несколько HTTP-запросов, а клиент внешнего интерфейса запрашивает новый чанк, когда буфер слишком мал. Разделение файла на несколько запросов http тела и последующая сборка их на клиенте может иметь те характеристики, которые вы ищете.

Вы можете просто внедрить заголовок http Range и позволить клиенту запрашивать только определенный Range файл mp3. https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

...