2012-07-05 16 views
8

lo hice este script PHPHacer mp3 PHP reubicable

 

    $file_name = 'sample.mp3'; 

    header('Content-Type: audio/mpeg'); 

    $opts  = array('http' => 
         array(
          'method'   => 'GET', 
          'protocol_version' => 1.1, 
        ) 
    ); 
    $context = stream_context_create($opts); 
    $stream = fopen($file_name, 'rb', FALSE, $context); 
    $metadata = stream_get_meta_data($stream); 
    $data  = stream_get_contents($stream); 
    print($data); 
    fclose($stream); 

Podría transmitir contenido multimedia mp3 con éxito, pero no soy capaz de buscar el archivo mp3 que consiguen jugaron también en html5 video etiquetas no son capaces de extraer los metadatos de ella, por favor dígame dónde estoy haciendo mal y cómo hacer que este proceso funcione, gracias

Respuesta

1

Esto debería solucionar su problema con suerte, siga este método.

Lo que necesita hacer es usar readfile() y establecer file_exists() para que pueda decir que está abriendo el archivo correcto.

$extension = "mp3"; 
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; 

if(file_exists($file_name)){ 
    header('Content-type: {$mime_type}'); 
    header('Content-length: ' . filesize($file_name)); 
    header('Content-Disposition: filename="' . $file_name); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($file_name); 
} 

Reference

+0

lo quiero amortiguada, ¿cómo podría? –

+0

Como se indicó anteriormente, esto no tiene un 'Content-Range'; en Chrome, actualmente no es posible (5 años después) establecer el tiempo actual sin eso. – Agamemnus

+0

header ('Content-typ ... faltan comillas dobles y la solución no funciona –

18

Aquí probar esto, soporta descargas parciales y busca de cualquier tamaño del archivo, ahora también funciona correctamente en cromo:

<?php 
$file_name = './sample.mp3'; 
stream($file_name, 'audio/mpeg'); 

/** 
* Stream-able file handler 
* 
* @param String $file_location 
* @param Header|String $content_type 
* @return content 
*/ 
function stream($file, $content_type = 'application/octet-stream') { 
    @error_reporting(0); 

    // Make sure the files exists, otherwise we are wasting our time 
    if (!file_exists($file)) { 
     header("HTTP/1.1 404 Not Found"); 
     exit; 
    } 

    // Get file size 
    $filesize = sprintf("%u", filesize($file)); 

    // Handle 'Range' header 
    if(isset($_SERVER['HTTP_RANGE'])){ 
     $range = $_SERVER['HTTP_RANGE']; 
    }elseif($apache = apache_request_headers()){ 
     $headers = array(); 
     foreach ($apache as $header => $val){ 
      $headers[strtolower($header)] = $val; 
     } 
     if(isset($headers['range'])){ 
      $range = $headers['range']; 
     } 
     else $range = FALSE; 
    } else $range = FALSE; 

    //Is range 
    if($range){ 
     $partial = true; 
     list($param, $range) = explode('=',$range); 
     // Bad request - range unit is not 'bytes' 
     if(strtolower(trim($param)) != 'bytes'){ 
      header("HTTP/1.1 400 Invalid Request"); 
      exit; 
     } 
     // Get range values 
     $range = explode(',',$range); 
     $range = explode('-',$range[0]); 
     // Deal with range values 
     if ($range[0] === ''){ 
      $end = $filesize - 1; 
      $start = $end - intval($range[0]); 
     } else if ($range[1] === '') { 
      $start = intval($range[0]); 
      $end = $filesize - 1; 
     }else{ 
      // Both numbers present, return specific range 
      $start = intval($range[0]); 
      $end = intval($range[1]); 
      if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file 
     } 
     $length = $end - $start + 1; 
    } 
    // No range requested 
    else $partial = false; 

    // Send standard headers 
    header("Content-Type: $content_type"); 
    header("Content-Length: $filesize"); 
    header('Accept-Ranges: bytes'); 

    // send extra headers for range handling... 
    if ($partial) { 
     header('HTTP/1.1 206 Partial Content'); 
     header("Content-Range: bytes $start-$end/$filesize"); 
     if (!$fp = fopen($file, 'rb')) { 
      header("HTTP/1.1 500 Internal Server Error"); 
      exit; 
     } 
     if ($start) fseek($fp,$start); 
     while($length){ 
      set_time_limit(0); 
      $read = ($length > 8192) ? 8192 : $length; 
      $length -= $read; 
      print(fread($fp,$read)); 
     } 
     fclose($fp); 
    } 
    //just send the whole file 
    else readfile($file); 
    exit; 
} 
?> 
+0

He intentado esto y funciona brillantemente cuando copio la dirección de archivos PHP en VLC. Sin embargo, si agrego el enlace a una etiqueta de audio HTML5, o JWplayer no reconoce la secuencia. Recibo errores en mi registro que dicen: Advertencia de PHP: no se puede modificar la información del encabezado - los encabezados ya se enviaron. Gracias. – joshkrz

+1

@joshkrz - Debe asegurarse de no enviar ninguna salida (espacio en blanco, html) antes de configurar los encabezados, el error que obtiene le indicará dónde está produciendo –

+0

Aparentemente estoy generando en la línea 89 [print ($ download_data_chunk);]. El error simplemente me dice todas las líneas que tienen encabezados establecidos dentro de su código. Lo extraño es que si escribo un enlace directo a este script, aparece un reproductor de Google Chrome MP3 pero no hace nada. No obtengo ningún error cuando lo hago. El script no tiene ningún eco adicional ni impresiones. . – joshkrz