PHP потоковое MP3 - PullRequest
       50

PHP потоковое MP3

12 голосов
/ 01 марта 2010

У меня очень похожая ситуация с человеком, который спросил: Можно ли подавать файлы 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 читает из этого файла?

Спасибо!


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

Ответы [ 7 ]

8 голосов
/ 03 марта 2010

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

$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");
}
1 голос
/ 02 марта 2010

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

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

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

1 голос
/ 01 марта 2010

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

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

0 голосов
/ 31 марта 2015

Применение всех этих решений, которые действительны для скрытия исходного пути и имени файла, к сожалению, не предотвращает несанкционированную загрузку. Действительно, клиент (в моем случае: 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 со всем исходным содержимым.

0 голосов
/ 06 июня 2013

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

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

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

0 голосов
/ 01 марта 2010

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

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

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

...