Продолжить потоковую передачу звука в автономном режиме/отключении в течение нескольких минут?

Я искал несколько дней, и я не могу найти решение. Я надеюсь, что кто-то здесь может указать мне в правильном направлении.

Я создаю iOS-приложение для радио с использованием Cordova/Angular, и у меня есть один поток mp3 (http://mp3lg3.tdf-cdn.com/5593/goo_102004.mp3), который я играю с HTML5.

Я хотел бы найти способ продолжить стрим, даже если устройство потеряет связь на несколько минут, а если соединение вернется, чтобы продолжить потоковую передачу в обычном режиме. На данный момент, если я отключу Wi-Fi или включу на своем устройстве «Режим полета», он немедленно остановит поток.

Я довольно новичок в мире аудио, и надеюсь, что кто-то с опытом может помочь.


person anon    schedule 12.02.2015    source источник


Ответы (2)


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

person Eugene J. Lee    schedule 15.05.2015

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

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

Хотя это только половина проблемы. Что вы делаете, когда снова подключаетесь? Как клиент синхронизируется с сервером? К сожалению, нет общедоступных серверов, выполняющих прогрессивный HTTP в реальном времени, которые поддерживают способ синхронизации. Я сам экспериментировал с заголовками Range и с тем, что не работает, но требует специального клиента. (Однако VLC работает...)

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

При всем при этом есть два решения в зависимости от ваших потребностей:

Выжить в случаях, когда качество сети меняется, TCP-соединение сохраняется

Это просто. Увеличьте буфер на стороне сервера, который сбрасывается клиентам. Я обычно использую 20 секунд.

Обратите внимание, что не все клиенты примут такой большой буфер. Некоторые уменьшают размер окна TCP, не позволяя серверу отправлять слишком много аудиоданных.

(Примечание. Если вы не можете понять, как это сделать с существующим сервером потоковой передачи, конфигурация буфера доступна на CDN AudioPump., который я создал. Он пока недоступен, но вы можете написать мне по электронной почте [email protected], чтобы попробовать его.)

Пережить изменение IP-адреса, TCP-соединение гарантированно будет потеряно

Для этого сценария вам нужен совершенно новый протокол потоковой передачи. HLS — это то, что вам нужно.

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

HLS, к сожалению, не так хорошо поддерживается клиентами, но на стороне сервера все просто. В большинстве случаев подойдет любой HTTP-сервер. Кодер — это то, что нужно изменить, чтобы закодировать и загрузить сегменты.

person Brad    schedule 12.02.2015
comment
Брэд, большое спасибо за ваш ответ, это невероятно полезно и информативно. Я пошлю вам по электронной почте сейчас. - person anon; 13.02.2015