Intereting Posts

Потоковое воспроизведение MP3

У меня очень похожая ситуация с человеком, который спросил: могу ли я служить MP3-файлам с PHP? В основном я пытаюсь защитить mp3-файлы от прямой загрузки, поэтому пользователям нужно пройти через php, чтобы получить аутентификацию в первую очередь. Вот мой код:

header('Content-type: audio/mpeg'); header('Content-length: ' . filesize($file)); header('X-Pad: avoid browser bug'); Header('Cache-Control: no-cache'); header("Content-Transfer-Encoding: binary"); header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"); readfile($file); 

Вот моя проблема: файл воспроизводит только очень маленький фрагмент начала (через Quicktime в браузере), а затем останавливается – Quicktime, похоже, считает, что длина файла остается до тех пор, пока кусок, который ему удалось загрузить . Когда я перезагружаюсь – он играет чуть больший кусок – все, что ему удалось загрузить до этого момента.

Это проблема в заголовках, которые я отправляю? Как я могу передать такой файл? Это проблема, если swf читает из этого файла?

Благодаря!


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

Вот что сделал трюк.

 $dir = dirname($_SERVER['DOCUMENT_ROOT'])."/protected_content"; $filename = $_GET['file']; $file = $dir."/".$filename; $extension = "mp3"; $mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; if(file_exists($file)){ header('Content-type: {$mime_type}'); header('Content-length: ' . filesize($file)); header('Content-Disposition: filename="' . $filename); header('X-Pad: avoid browser bug'); header('Cache-Control: no-cache'); readfile($file); }else{ header("HTTP/1.0 404 Not Found"); } 

если ваш сервер работает на apache или lighty, я бы предложил вам изучить x-sendfile

http://tn123.ath.cx/mod_xsendfile/

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

Вы можете попробовать HTTP-chunking . Установите заголовок «Transfer-Encoding» в «chunked», затем выведите размер каждого фрагмента перед его отправкой. Завершите каждый размер блока и кусок CRLF.

Для чего-то более сложного, я рекомендую использовать потоковый сервер, такой как Icecast .

Выделяются две вещи:

  1. У вас есть набор Content-Length . Если сервер настроен на автоматическое gzip выход, это может испортить вещи. Попробуйте отключить Content-Length и проверьте, исправляет ли он это.
  2. У вас около тысячи наборов Content-Type . Поскольку это Mp3, который вы используете, просто используйте audio/mpeg . Вы можете эффективно избавиться от всей последней команды header() . Легко увлечься HTTP-заголовками.

Попробуйте и сообщите нам, как это происходит!

Удалить header("Content-Transfer-Encoding: binary"); И ты станешь!

Для этого решения вам также необходимо настроить xsendfile в apache (mod_xsendfile) или nginx HttpSecureLinkModule – они дадут вам точный mp3, поэтому браузер будет правильно воспроизводить его

Применение всех этих решений, которые действительны, чтобы скрыть исходный путь и имя файла, к сожалению, не предотвращает несанкционированную загрузку. Действительно, клиент (по моему делу: Chrome) загружает файл.

Здесь строки, которые я накладываю на свой сервер:

 <?php $dir = dirname($_SERVER['DOCUMENT_ROOT'])."/mp3"; $filename = $_GET['file']; $file = $dir."/".$filename; $extension = "mp3"; $mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; if(file_exists($file)){ header('Content-type: {$mime_type}'); header('Content-length: ' . filesize($file)); header("Content-Transfer-Encoding: binary"); header('Content-Disposition: filename="' . $filename); header('X-Pad: avoid browser bug'); header('Cache-Control: no-cache'); readfile($file); }else{ header("HTTP/1.0 404 Not Found"); } ?> 

с линией или без нее

  header("Content-Transfer-Encoding: binary"); 

конечный результат не меняется. Каталог / mp3 находится в

 /home/myuser/ 

(таким образом, / home / myuser / mp3), а общедоступный каталог HTML –

 /home/myuser/public_html 

таким образом, называя мой домен и предоставляя

 /player.php?file=music.mp3 

он загружает файл под названием music.mp3 со всем исходным контентом.