2

我正在使用smartReadFile我在网上找到的这种 PHP 方法将音频流式传输到 jQuery jPlayer。虽然这在从浏览器播放时效果很好,但我可以搜索曲目并显示持续时间,但是当我在 iOS Safari 上尝试时,持续时间是未知的,我无法搜索,但它确实可以播放。有什么想法吗?非常感激。

function _smartReadFile($location, $filename, $mimeType = 'application/octet-stream')
    {
        if (!file_exists($location))
        {
            header ("HTTP/1.1 404 Not Found");
            return;
        }

        $size   = filesize($location);
        $time   = date('r', filemtime($location));

        $fm     = @fopen($location, 'rb');
        if (!$fm)
        {
            header ("HTTP/1.1 505 Internal server error");
            return;
        }

        $begin  = 0;
        $end    = $size - 1;

        if (isset($_SERVER['HTTP_RANGE']))
        {
            if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
            {
                $begin  = intval($matches[1]);
                if (!empty($matches[2]))
                {
                    $end    = intval($matches[2]);
                }
            }
        }

        if (isset($_SERVER['HTTP_RANGE']))
        {
            header('HTTP/1.1 206 Partial Content');
        }
        else
        {
            header('HTTP/1.1 200 OK');
        }

        header("Content-Type: $mimeType"); 
        header('Cache-Control: public, must-revalidate, max-age=0');
        header('Pragma: no-cache');  
        header('Accept-Ranges: bytes');
        header('Content-Length:' . (($end - $begin) + 1));
        if (isset($_SERVER['HTTP_RANGE']))
        {
            header("Content-Range: bytes $begin-$end/$size");
        }
        header("Content-Disposition: inline; filename=$filename");
        header("Content-Transfer-Encoding: binary");
        header("Last-Modified: $time");

        $cur    = $begin;
        fseek($fm, $begin, 0);

        while(!feof($fm) && $cur <= $end && (connection_status() == 0))
        {
            print fread($fm, min(1024 * 16, ($end - $cur) + 1));
            $cur += 1024 * 16;
        }
    }
4

1 回答 1

1

瓦西姆,

您是否对所有文件类型都存在此问题?

也许将 mimetype 设置为更接近文件类型会有所帮助。

例子:

$file = '/music/song.mp3';
// Add the mimeTypes for mp3
_smartReadFile($file, basename($file), 'audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3');

希望它有所帮助。

于 2012-11-10T06:04:48.607 回答