Использование php для открытия живого аудиопотока на Android

У нас есть аудиопотоки Shoutcast/Icecast. Я хотел бы иметь возможность предоставить ссылку, такую ​​​​как mobiledroid.php, на нашем веб-сайте, которая будет открываться с помощью проигрывателя по умолчанию. Я видел это на другом сайте, поэтому знаю, что это возможно.

Я предполагаю, что он использует заголовки и потоки php через файл php в качестве потока?


Используя инструкции Брэда, андроид фактически дает возможность открывать звуковой проигрыватель. Хороший.

Так же играет на WMP через ПК но не на андроиде как играет по ссылке выше

header("Content-type: audio/mpeg"); 
header("Transfer-Encoding: chunked"); 
header("Connection: close");

$sock = fsockopen($streamname,$port); //$streamname is the IP

fputs($sock, "GET $path HTTP/1.0\r\n"); //path in my case is /;stream.mp3
fputs($sock, "Host: $ip\r\n"); 
fputs($sock, "User-Agent: WinampMPEG/2.8\r\n"); 
fputs($sock, "Accept: */*\r\n"); 
fputs($sock, "Icy-MetaData:1\r\n"); 
fputs($sock, "Connection: close\r\n\r\n"); 


fpassthru($sock); 

fclose($sock);

На андроиде пишет Извините, этот плеер не поддерживает данный тип аудиофайла


Обновление 2:

Удаление "Transfer-Encoding" будет воспроизводиться на Android, но, как обычно, потребуется много времени, чтобы начать трансляцию со статусом «Подготовка» из-за того, что трансляция не имеет Content-Length.

header("Transfer-Encoding: none"); также удалено из приведенного выше кода:

Цитирую Бред:

В Android 2.3 и более поздних версиях есть проблема с параметром Transfer-Encoding, равным none. Удаление этого жестко установленного заголовка возвращает поток обратно в режим кодирования передачи по частям. Это отлично работает для Android 2.3+. Первоначально я отключил кодирование по частям, поскольку VLC его не поддерживает. Также кажется, что Android 2.2 и старше не поддерживает кодирование по частям.

Отметим здесь, что, хотя это работает на Android, для начала большинства прямых трансляций потребуется ужасно много времени.


person Onimusha    schedule 13.07.2012    source источник
comment
Здесь есть что-нибудь полезное - › stackoverflow.com/ вопросы/2568665/   -  person ethrbunny    schedule 13.07.2012
comment
Я проверил множество ссылок из того, что вы разместили, и до этого тоже. Поэтому я не могу использовать fopen и т. д., поскольку php не будет читать потоки mp3. Вы получите сообщение Ошибка HTTP-запроса! ICY 200 ОК – Все еще проверяется   -  person Onimusha    schedule 13.07.2012
comment
@Onimusha, конечно, вы можете читать потоки SHOUTcast/Icecast с PHP ... Я делаю это каждый день. Кроме того, мне очень любопытно, какой из найденных вами сайтов работает так, как вы хотите.   -  person Brad    schedule 14.07.2012
comment
@Brad Сайт, на который я наткнулся, сохранен по этой ссылке textsave.de/?p=127811 - пришлось сохранить ссылку извините   -  person Onimusha    schedule 15.07.2012
comment
На Android это работает путем прямой ссылки на поток MP3. Я пробовал это с SHOUTcast/Icecast в прошлом и никогда не мог заставить его работать напрямую. Однако, используя какой-то тестовый сервер, который у меня есть, он работает. Я выясню, в чем разница, и свяжусь с вами в ближайшее время.   -  person Brad    schedule 15.07.2012


Ответы (1)


Проблема

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

На Android они (по какой-то сумасшедшей причине) решили не поддерживать файлы списков воспроизведения в качестве поддерживаемых носителей. Из-за этого нет прямого способа запуска плеера традиционным методом.

Решение

На Android кажется, что если вы напрямую ссылаетесь на файл/поток MP3, вместо загрузки файла действие по умолчанию — открыть медиаплеер и попытаться передать его в потоковом режиме. Это означает, что вы можете легко сделать прямую ссылку на URL-адрес вашего потока (полностью минуя шаг плейлиста).

Есть одна загвоздка... потоки, обслуживаемые SHOUTcast, не совсем совместимы с HTTP. Они близки, но не идеальны. Реальное зависание здесь, кажется, связано с длиной контента. Обычно HTTP-серверы отправляют заголовок ответа Content-Length. Длина потокового мультимедиа неизвестна. Есть два пути решения проблемы:

  1. Используйте фрагментированное кодирование передачи. Вы можете сделать это, установив следующие заголовки:
    Transfer-Encoding: chunked
    Затем используйте фрагментированное кодирование для потока, и все готово.
  2. Не используйте кодировку передачи и укажите, что соединение будет закрыто после завершения передачи ресурса, с этими заголовками:
    Transfer-Encoding: none
    Connection: close

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

Как только ваш сервер использует действительный протокол HTTP, воспроизведение на Android кажется легким делом.

Выполнение

Есть несколько способов реализовать это исправление. Вы упомянули решение PHP. Если cURL не работает, вы всегда можете fsockopen() или stream_socket_client(), чтобы установить прямое TCP-соединение и самостоятельно обрабатывать данные входящего потока. Оттуда вам просто нужно отправить правильные заголовки ответа и передать данные по мере их поступления. Имейте в виду, что экземпляр PHP будет работать для каждого подключенного клиента, и каждый экземпляр также будет устанавливать соединение с вашим сервером. Это не идеально, но в зависимости от того, что у вас есть, может быть единственным методом для вас.

person Brad    schedule 15.07.2012
comment
Замечательный. Я пометил это как решенное, поскольку вышеизложенное устранило рассматриваемые проблемы. Однако я обновил первоначальный код, так как сам поток не работает на андроиде. Отлично работает через ПК wmp - person Onimusha; 15.07.2012
comment
@Onimusha, можешь скинуть ссылку на свой стрим? - person Brad; 15.07.2012
comment
Поток, который я тестирую, это 159.253.143.4, порт 8000 - спасибо. - person Onimusha; 16.07.2012
comment
@Onimusha, Хороший выбор в музыке! BassDrive.com — один из моих любимых. Вы работаете с теми парнями? В любом случае, указанный вами IP/порт, по-видимому, предназначен непосредственно для вашего сервера SHOUTcast. Можешь скинуть ссылку на свой скрипт? Если это ваш скрипт, я не вижу соответствующих заголовков. Кроме того, строка состояния ICY 200 OK должна быть переписана как HTTP/1.0 200 OK. - person Brad; 16.07.2012
comment
Я понимаю. Нет, я просто создаю сценарий для них. У меня нет доступа к серверу. Я загрузил для вас скрипт shouthostdirect.com/tools/ - добавление &mount=SOMETHING добавит /SOMETHING к URL-адресу потока, например /;поток.mp3 - person Onimusha; 16.07.2012
comment
Я думаю, мне может понадобиться помощь в том, что вы имели в виду, переписав ICY 200 OK на HTTP/1.0 200 OK. До сих пор не продвинулся в этом. Надеюсь услышать вас снова - person Onimusha; 17.07.2012
comment
@Onimusha, когда вы впервые получите ответ от сервера SHOUTcast, в его строке состояния будет указано ICY 200 OK. Обычные строки состояния HTTP будут выглядеть как HTTP/1.0 200 OK. Большинству клиентов все равно... они смотрят только на код состояния. Однако некоторые это делают и жалуются, что HTTP-версия ответа кажется неправильной. Вы можете перехватить это и переписать эту строку состояния с помощью PHP. Для справки вы можете увидеть, как я сделал это с помощью приложения JavaScript Node.js, здесь: stackoverflow.com/a/9916603/362536 - person Brad; 18.07.2012
comment
@Onimusha, я также отмечу, что у меня этот тип потоковой передачи работает намного эффективнее, чем с PHP. Я еще не выпустил это программное обеспечение, но, возможно, захочу выпустить его для тестирования на BassDrive.com. Пожалуйста, напишите мне по адресу [email protected], если вы заинтересованы. В настоящее время он ведет трансляции на waug.fm. - person Brad; 18.07.2012
comment
Привет, @Brad, не могли бы вы помочь мне и с этой проблемой? stackoverflow.com/ вопросы/49322222/ - person Kootsj; 20.03.2018