2017-05-08 9 views
0

나는 Ajax 응답 데이터에서 음악을 동적으로 재생하려하지만 문제는 PHP 변수로 돌아올 때 오디오 파일을 재생하는 방법입니다.PHP 변수로 돌아 왔을 때 아약스를 사용하여 오디오 파일을 재생하는 방법

오디오 플레이어에 mediaelement.js pluging을 사용하고 있습니다.

JAVASCRIPT

  var player = new MediaElementPlayer('audio-player', { 
         //options 
      }); 


        $.ajax({ 
         url: '../play?song=songs_id', 
         type: "get", 
         success:function(data){ 

           player.pause(); 
           player.setSrc(data); 
           player.load(); 
           player.play(); 

         } 
        }); 

PHP

$song_id = 'folder/'.$_GET['song']; 

// get the file request, throw error if nothing supplied 

// hide notices 
@ini_set('error_reporting', E_ALL & ~ E_NOTICE); 

//- turn off compression on the server 
@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 'Off'); 



// sanitize the file request, keep just the name and extension 
// also, replaces the file location with a preset one ('./myfiles/' in this example) 

$file = $song_id; 
$path_parts = pathinfo($file); 
$file_name = $path_parts['basename']; 
$file_ext = $path_parts['extension']; 
$file_path = $song_id; 



// allow a file to be streamed instead of sent as an attachment 
$is_attachment = isset($_REQUEST['stream']) ? false : true; 

// make sure the file exists 
if (is_file($file_path)) 
{ 
    $file_size = filesize($file_path); 
    $file = @fopen($file_path,"rb"); 



    if ($file) 
    { 

     // set the headers, prevent caching 
     header("Pragma: public"); 
     header("Expires: -1"); 
     header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0"); 
     header("Content-Disposition: attachment; filename=\"$file_name\""); 

     // set appropriate headers for attachment or streamed file 
     if ($is_attachment) { 
       header("Content-Disposition: attachment; filename=\"$file_name\""); 

     } 
     else { 
       header('Content-Disposition: inline;'); 
       header('Content-Transfer-Encoding: binary'); 
     } 

     // set the mime type based on extension, add yours if needed. 
     $ctype_default = "application/octet-stream"; 
     $content_types = array(
       "exe" => "application/octet-stream", 
       "zip" => "application/zip", 
       "mp3" => "audio/mpeg", 
       "mpg" => "video/mpeg", 
       "avi" => "video/x-msvideo", 
     ); 
     $ctype = isset($content_types[$file_ext]) ? $content_types[$file_ext] : $ctype_default; 
     header("Content-Type: " . $ctype); 

     //check if http_range is sent by browser (or download manager) 
     if(isset($_SERVER['HTTP_RANGE'])) 
     { 
      list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2); 
      if ($size_unit == 'bytes') 
      { 
       //multiple ranges could be specified at the same time, but for simplicity only serve the first range 
       //http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt 
       list($range, $extra_ranges) = explode(',', $range_orig, 2); 
      } 
      else 
      { 
       $range = ''; 
       header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
       exit; 
      } 
     } 
     else 
     { 
      $range = ''; 
     } 
     //figure out download piece from range (if set) 
     list($seek_start, $seek_end) = explode('-', $range, 2); 

     //set start and end based on range (if set), else set defaults 
     //also check for invalid ranges. 
     $seek_end = (empty($seek_end)) ? ($file_size - 1) : min(abs(intval($seek_end)),($file_size - 1)); 
     $seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0); 

     //Only send partial content header if downloading a piece of the file (IE workaround) 
     if ($seek_start > 0 || $seek_end < ($file_size - 1)) 
     { 


      header('HTTP/1.1 206 Partial Content'); 
      header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$file_size); 
      header('Content-Length: '.($seek_end - $seek_start + 1)); 


     } else { 

     } 


      header("Content-Length: $file_size"); 
     header('Accept-Ranges: bytes'); 


    set_time_limit(0); 
     fseek($file, $seek_start); 


     while(!feof($file)) 
     { 
      print(@fread($file, 1024*8)); 
      ob_flush(); 
      flush(); 

      if (connection_status()!=0) 
      { 

       @fclose($file); 
       exit; 
      }   
     } 

     // file save was a success 

     @fclose($file); 
     exit; 
    } 
    else 
    { 
     // file couldn't be opened 
     header("HTTP/1.0 500 Internal Server Error"); 
     exit; 
    } 
} 
else 
{ 

    // file does not exist 
    header("HTTP/1.0 404 Not Found"); 
    exit; 
} 

내가 player.setSrc('../play?song=songs_id');player.setSrc(data);를 설정하면 그것은 잘 작동하지만 난 그렇게하고 싶지 않아요. 어떤 생각?

+0

데이터를 base64로 응답 한 다음 src에 할당 할 수 있습니다. http://stackoverflow.com/questions/13645223/html5-using-src-using-raw-binary-data –

+0

이 코드는 의미가 없습니다. Ajax로 오디오 파일 데이터를 전송하려고하십니까? 왜? –

답변

0

귀하의 PHP 코드는 원하는 URL을 처리 할 수있는 모든 일을하고있다, 당신은 기본적으로 헤더를 설정하고이 코드 조각을 통해 파일을 전송하는 play?song=songs_id을 사용하고 있습니다 :

print(@fread($file, 1024*8)); 
ob_flush(); 
flush(); 

if (connection_status()!= 0) 
{ 
    @fclose($file); 
    exit; 
} 

당신이, 당신을 볼 수 있듯이 return 문을 사용하지 않으므로 해당 URL을 사용하여 미디어를 재생할 수 있습니다. PHP를 통해 미디어를 읽는 것을 시도하고 있습니다. 따라서 player.setSrc('../play?song=songs_id');을 사용하면 코드가 작동합니다.