2013-02-19 3 views
7

Ecco il mio codice php per lo streaming di file mp3 tramite phpStreaming file mp3 tramite 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); 

Si sta lavorando su Mac Mini e tutti gli altri PC, ma non funziona su iPad e iPhone. Anche lo streaming funziona su tutti gli altri smartphone. Il tuo aiuto sarebbe apprezzato.

Grazie

risposta

3

Perché content-type: application/octet-stream se si tratta di una canzone? Modificare le intestazioni:

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: rimosso Content-Transfer-Encoding e cambiò Content-Disposition da attachment a inline

+0

cambiato di conseguenza, ma ancora non funziona su iPhone e iPad. Il codice funziona su PC di tutte le piattaforme e di tutti gli altri smartphone tranne iPhone e iPad. Cosa c'è che non va nel codice? – Anindya

+0

Ho aggiunto un nome file, provo ad aggiungere anche quelle intestazioni. –

+0

Testato su iPhone e funziona. –

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); 

So che questo post è stato l'anno scorso, ma qualcuno potrebbe trovare questo utile. Questo trasmetterà il contenuto in streaming.

1

So che questo è vecchio, ma ci siamo imbattuti nello stesso tipo di problema con iOS.

In sostanza, sembra che se la vostra applicazione utilizza il giocatore nativo per leggere il file, è necessario implementare Accept-Ranges e 206 Partial Content per il file da leggere.

Nel nostro caso, ciò che stava accadendo era che il file era lungo 4 minuti in totale. L'app avrebbe giocato per circa 1 minuto e 50 secondi e poi sarebbe ricominciata dall'inizio. Non rileva la lunghezza totale del file.
Anche se abbiamo impostato Accept-Ranges su none, iOS lo ignorava e chiedeva ancora parti del file. Dato che stavamo restituendo il tutto, era "in loop" all'inizio del prossimo "intervallo" letto.

Per l'attuazione del Partial Content, abbiamo usato https://mobiforge.com/design-development/content-delivery-mobile-devices, Appendice A: Streaming per Apple iPhone da Thomas Thomassen

Spero che questo aiuta qualcuno