2013-02-19 23 views
7

Oto mój kod php do strumienia plik mp3 poprzez phpStreaming plików mp3 przez php

set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 
$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
header('content-type: application/octet-stream'); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

To działa na Mac Mini i wszystkich innych komputerach, ale nie działa na iPad i iPhone. Nawet streaming działa na wszystkich innych smartfonach. Twoja pomoc byłaby doceniona.

Dzięki

Odpowiedz

3

Dlaczego content-type: application/octet-stream jeśli jest to piosenka? Zmienić nagłówki:

set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 
$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
header('Content-Disposition: inline; filename="song.mp3"'); 
header('Pragma: no-cache'); 
header('Content-type: audio/mpeg'); 
header('Content-Length: '.filesize($filePath)); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

LE: Content-Transfer-Encoding usuwane i zmieniane Content-Disposition z attachment do inline

+0

odpowiednio zmienione, ale nadal nie działa na iPhone i iPad. Kod działa na komputerach wszystkich platform i wszystkich innych smartfonów oprócz iPhone'a i iPada. Co jest nie tak z kodem? – Anindya

+0

Dodałem nazwę pliku, spróbuj również dodać te nagłówki. –

+0

Testowany na iPhonie i działa. –

3
<?php 
set_time_limit(0); 
$dirPath = "path_of_the_directory"; 
$songCode = $_REQUEST['c']; 
$filePath = $dirPath . "/" . $songCode . ".mp3"; 
$bitrate = 128; 
$strContext=stream_context_create(
    array(
     'http'=>array(
     'method'=>'GET', 
     'header'=>"Accept-language: en\r\n" 
     ) 
    ) 
); 


header('Content-type: audio/mpeg'); 
header ("Content-Transfer-Encoding: binary"); 
header ("Pragma: no-cache"); 
header ("icy-br: " . $bitrate); 

$fpOrigin=fopen($filePath, 'rb', false, $strContext); 
while(!feof($fpOrigin)){ 
    $buffer=fread($fpOrigin, 4096); 
    echo $buffer; 
    flush(); 
} 
fclose($fpOrigin); 

Znam ten post był z zeszłego roku, ale ktoś może się on przydać. Spowoduje to strumieniowe przesyłanie treści.

1

Wiem, że jest stary, ale po prostu wpadliśmy na ten sam problem z iOS.

Zasadniczo wydaje się, że jeśli aplikacja korzysta z natywnego odtwarzacza do odczytu pliku, trzeba wdrożyć Accept-Zakresy i 206 Partial Content dla pliku do odczytu.

W naszym przypadku, co się działo, plik trwał 4 minuty. Aplikacja będzie odtwarzana przez około 1 minutę 50 sekund, a następnie zostanie przywrócona do początku. Nie wykryłaby całkowitej długości pliku.
Mimo że ustawiliśmy Accept-Ranges na none, iOS ignorował to i wciąż prosił o części pliku. Odkąd zwróciliśmy całą sprawę, "pętla" powracała do początku, czytając następny "zakres".

Dla realizacji częściowym Treści użyliśmy https://mobiforge.com/design-development/content-delivery-mobile-devices, Dodatek A: Streaming dla Apple iPhone przez Thomasa Thomassen

Mam nadzieję, że to pomoże komuś