簡體   English   中英

返回到php變量時如何使用Ajax播放音頻文件

[英]How to play audio file using ajax when it return to php variable

我正在嘗試從ajax響應數據動態播放音樂,但問題是當返回php變量時如何播放音頻文件?

我正在使用mediaelement.js插入音頻播放器。

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(data); player.setSrc('../play?song=songs_id'); 然后效果很好,但我不想要那樣。 任何想法?

您的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'); 您的代碼將正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM