Живой аудиопоток действительный HTTP-ресурс

Серверы Shoutcast не генерируют действительный ресурс HTTP. Для ссылки на наш мобильный плеер (Android) требуется действительный HTTP-ресурс. Как я могу использовать php-скрипт для трансляции крика? Этот скрипт предоставляет действительный ресурс http? Кто-нибудь знает?

<?php

$track = "shoutcaststream.mp3";

if (file_exists($track)) {
    header("Content-Type: audio/mpeg");
    header('Content-Length: ' . filesize($track));
    header('Content-Disposition: inline; filename="shoutcaststream.mp3"');
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    readfile($track);
    exit;
} else {
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
    echo "no file";
}

Обновление 2

Теперь все в порядке, согласно инструкции «Брэд». Мы используем set_time_limit(0) Но мой поток все еще закрывается через 3-5 минут? Как исправить? Пожалуйста, помогите мне.. :)


person Joshua    schedule 24.11.2012    source источник
comment
я имею в виду, что вывод mp3 Shoutcast не имеет Content-Type   -  person Joshua    schedule 24.11.2012
comment
Вы спрашиваете, допустим ли это HTTP-ресурс, а затем говорите, что это означает, что он имеет Content-Type, тогда как в вашем коде есть header("Content-Type: audio/mpeg");. Слишком расплывчато...   -  person HamZa    schedule 24.11.2012
comment
Эй, ребята, в его вопросе нет ничего плохого. Проблема, с которой он столкнулся, хорошо известна при работе с потоками SHOUTcast.   -  person Brad    schedule 24.11.2012


Ответы (1)


Да, то, что у вас есть, действительно.

Недопустимая часть потоков SHOUTcast заключается в том, что они возвращают ICY 200 OK вместо HTTP/1.0 200 OK в своих ответах. Если вы хотите изменить свой сценарий для проксирования запроса SHOUTcast, вам, вероятно, потребуется подключиться к серверу SHOUTcast через обычное соединение TCP (см. fsockopen()) и отправить необработанные данные запроса.

Когда у вас есть соединение и вы получаете данные, отправьте эти данные вашему клиенту.

Также обратите внимание, что вы захотите вызвать set_time_limit(0), чтобы ваш скрипт не истек через 30 секунд или около того. Также убедитесь, что вы не отправляете заголовок Content-Length, и установите свой ответ как HTTP/1.0, чтобы вам не приходилось отправлять данные в виде фрагментов. (Воспроизведение фрагментированного кодирования работает только на Android 2.3 или более поздней версии.)

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

person Brad    schedule 24.11.2012
comment
Теперь все в порядке. Мы используем set_time_limit(0) Но мой поток все еще закрывается через 3-5 минут? Как исправить? Пожалуйста, помогите мне.. :) - person Joshua; 28.11.2012
comment
@ Джошуа, у тебя, наверное, что-то убивает процесс PHP. Это твой сервер? Многие хосты будут регулярно убивать процессы PHP. Без вмешательства процесс может продолжаться бесконечно. Также проверьте наличие утечек памяти. - person Brad; 28.11.2012