Потоковое mp3 с PHP, на Linux + FireFox - PullRequest
1 голос
/ 11 марта 2012

Я пытаюсь воспроизвести mp3-файл с помощью PHP и воспроизвести его в браузере. Я использую Ubuntu для сервера (apache) и клиента для тестирования. Мой код работает на Chrome, но не на FireFox. Когда я получаю прямой доступ к mp3 (так что он обслуживается веб-сервером), он также работает в FireFox, но, сравнивая заголовки, которые генерирует веб-сервер, с заголовками, которые я отправляю в PHP, я не смог найти, как решить проблему. (Я слежу за заголовками, используя FireBug)

Вот заголовки, сгенерированные веб-сервером (это работает):

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Length  490265
Content-Type    audio/mpeg
Date    Sun, 11 Mar 2012 04:01:45 GMT
Etag    "22064e-77b19-4badff4a88200"
Keep-Alive  timeout=5, max=100
Last-Modified   Sat, 10 Mar 2012 09:15:52 GMT
Server  Apache/2.2.20 (Ubuntu)

Вот заголовки, которые отправляются в браузер из моего PHP-скрипта:

Accept-Ranges   bytes
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection  Keep-Alive
Content-Length  490265
Content-Type    audio/mpeg
Date    Sun, 11 Mar 2012 04:16:00 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive  timeout=5, max=100
Pragma  no-cache
Server  Apache/2.2.20 (Ubuntu)
X-Powered-By    PHP/5.3.6-13ubuntu3.6

Это код, который я использую для потоковой передачи mp3:

header('Content-length: ' . filesize($path));
header('Content-Type: audio/mpeg');
header('Accept-Ranges: bytes');

readfile($path);

exit;

Я также пробовал другие заголовки, которые не помогли, такие как:

header('Content-Disposition: inline; filename="name.mp3"');
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
header('Pragma: no-cache');
header('Cache-Control: no-cache');

Но, как я уже сказал, ни один из них не решил проблему.

Большое спасибо за любую помощь,

Одед.

РЕДАКТИРОВАТЬ:

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

  • 1) Сохраните строку пути в $ _SESSION в предыдущем сценарии.
  • 2) Прочитайте эту строку в сценарии, который транслирует mp3.
  • 3) Используйте эту строку в качестве пути для загрузки mp3-файла.

Если я это сделаю, FireFox не сможет воспроизвести файл, и когда я нажму на mp3-плеер, он напечатает сообщение «GstDecodeBin2: это похоже на текстовый файл». Если я жестко закодирую путь вместо использования $ _SESSION, это работает. Сумасшедшая вещь в том, что я абсолютно уверен, что путь в $ _SESSION правильный! Помните, что заголовки и содержимое версий PHP и веб-сервера идентичны!

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Я обнаружил, в чем проблема с помощью WireShark для мониторинга запросов. Ранее я использовал FireBug и HTTPFox, и они не показывают все запросы!

WireShark показал мне, что после первоначального успешного запроса есть другой запрос на тот же URI. Этот второй запрос не был перехвачен xdebug и пропущен FireBug и HTTPFox. Проблема в том, что этот запрос не включает PHPSESSID! Очевидно, что в результате сессия не сработала, и поскольку она сработала по первому запросу, я запутался. Это кажется мне ошибкой в ​​FireFox с его модулем медиаплеера. Я могу обойти это, вручную добавив PHPSESSID к URL-адресу в виде строки запроса.

0 голосов
/ 11 марта 2012

Заголовок HTTP Accept-Ranges позволяет браузеру отправлять начальную и конечную точку файла для загрузки, что позволяет загружать один и тот же файл из нескольких частей.Существует множество реализаций PHP, вот одна из них найдена на странице документации PHP.net для fread ().

http://www.php.net/manual/en/function.fread.php#106999

...