сокет живого аудио потока застревает в браузере

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

Смотри ниже скрипт с примером работающего хоста (см. http://icecast.omroep.nl/radio4-bb-mp3)

Может ли кто-нибудь, пожалуйста, просветить меня.

Tnx заранее!

    $host = "icecast.omroep.nl";
$port = 80;
$sub = "/radio4-bb-mp3";


$sock = fsockopen($host,$port, $errno, $errstr, 30);
if (!$sock){
throw new Exception("$errstr ($errno)");
}

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

fputs($sock, "GET $sub HTTP/1\r\n");
fputs($sock, "Host: $host \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);

7

Решение

После комментариев решение, которое вы ищете:

<?php

$host = "icecast.omroep.nl";
$sub = "/radio4-bb-mp3";
header("Location:  http://{$host}{$sub}");

Теперь я объясню, что случилось с вашим кодом

У вас есть проблема с заголовками. Вы добавляете свои собственные заголовки и удаленные заголовки как часть тела.

заголовки icecast.omroep.nl

HTTP/1.0 200 OK
Content-Type: audio/mpeg
Date: Sat, 24 Mar 2018 16:01:23 GMT
icy-br:192
ice-audio-info: samplerate=48000;channels=2;bitrate=192
icy-br:192
icy-genre:Classical
icy-metadata:1
icy-name:NPO Radio4
icy-pub:0
icy-url:http://www.radio4.nl
Server: Icecast 2.4.0-kh8
Cache-Control: no-cache, no-store
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
Connection: Close
Expires: Mon, 26 Jul 1997 05:00:00 GMT
icy-metaint:16000

Учитывая ваш скрипт index.php

<?php

$host = "icecast.omroep.nl";
$port = 80;
$sub = "/radio4-bb-mp3";


$sock = fsockopen($host,$port, $errno, $errstr, 30);
if (!$sock){
throw new Exception("$errstr ($errno)");
}

fputs($sock, "GET $sub HTTP/1\r\n");
fputs($sock, "Host: $host \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);

request.txt

GET /
[Blank line]

Обслуживание вашего сценария

$ php -S 0.0.0.0:8000 index.php

Ваш сценарий ответа:

$ (nc 127.0.0.1 8000 < request.txt) | head -n 27

HTTP/0.9 200 OK
Date: Sat, 24 Mar 2018 16:01:23 +0000
Connection: close
X-Powered-By: PHP/7.1.14
Content-type: text/html; charset=UTF-8

HTTP/1.0 200 OK
Content-Type: audio/mpeg
Date: Sat, 24 Mar 2018 16:01:23 GMT
icy-br:192
ice-audio-info: samplerate=48000;channels=2;bitrate=192
icy-br:192
icy-genre:Classical
icy-metadata:1
icy-name:NPO Radio4
icy-pub:0
icy-url:http://www.radio4.nl
Server: Icecast 2.4.0-kh8
Cache-Control: no-cache, no-store
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
Connection: Close
Expires: Mon, 26 Jul 1997 05:00:00 GMT
icy-metaint:16000

PHP добавляет свои собственные заголовки.

Вам нужно обработать заголовки, полученные от http://icecast.omroep.nl/radio4-bb-mp3 и вернуть их, используя метод header() и тогда вы можете сделать fpassthru(),

HTTP отделяет заголовки от тела новой строкой: https://tools.ietf.org/html/rfc2616#section-6

[header]
CRLF
[body]

Так что должно быть легко разбирать построчно и вызывать header() до тех пор CRLF (пустая строка), а затем вызвать fpassthru(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]