Я пытаюсь воспроизвести 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 и веб-сервера идентичны!