2013-10-14 31 views
0

我正在尝试将视频流式传输到iPhone。我的情况与this问题几乎完全相同,只是更具体。我检索的视频来自不同的网站,因此我无法更改视频的检索方式。使用cURL处理字节范围请求

我目前必须发布一些数据到一个URL,我会得到一个视频回来(如果所有的数据都是有效的)。我目前只是使用cURL获取数据,将其回显出来,并将标头设置为video/mp4。这在大多数情况下工作正常,但像其他问题 - 它不适用于iPhone。我查了一下,显然碰到了。现在

,这将是很好,如果我是简单地读取从服务器上的文件,但不幸的是,因为我有具体的数据发布到服务器实际检索视频,这不是这种情况。

我将如何去处理字节范围请求与卷曲?

回答

0

我通过简单地下载来自外部源的视频(整个事情),该数据打开一个流,然后打印出从字节范围请求所请求的字节的固定这一点。要做到这一点,我修改了答案this answer,所以它只是打开基于我下载的数据流:

function rangeDownload($file) 
{ 
    $fp = fopen('php://memory', 'r+'); 
    fwrite($fp, $file); 
    rewind($fp); 

    $size = strlen($file); 
    $length = $size; 
    $start = 0; 
    $end = $size - 1; 
    header("Accept-Ranges: 0-$length"); 
    if (isset($_SERVER['HTTP_RANGE'])) 
    { 
     $c_start = $start; 
     $c_end = $end; 
     list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); 
     if (strpos($range, ',') !== false) 
     {    
      header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
      header("Content-Range: bytes $start-$end/$size"); 
      exit; 
     } 

     if ($range == '-') 
      $c_start = $size - substr($range, 1); 
     else 
     { 

      $range = explode('-', $range); 
      $c_start = $range[0]; 
      $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size; 
     } 
     $c_end = ($c_end > $end) ? $end : $c_end; 
     if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) 
     { 

      header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
      header("Content-Range: bytes $start-$end/$size"); 
      exit; 
     } 
     $start = $c_start; 
     $end = $c_end; 
     $length = $end - $start + 1; 
     fseek($fp, $start); 
     header('HTTP/1.1 206 Partial Content'); 
    } 
    header("Content-Range: bytes $start-$end/$size"); 
    header("Content-Length: $length"); 

    $buffer = 1024 * 8; 
    while (!feof($fp) && ($p = ftell($fp)) <= $end) 
    {  
     if ($p + $buffer > $end) 
      $buffer = $end - $p + 1; 
     set_time_limit(0); 
     echo fread($fp, $buffer); 
     flush(); 
    } 

    fclose($fp); 
} 

此代码假设传递给rangeDownload参数是数据的字符串。这是使用的例子:

// curl initialization here... 
$result = curl_exec($ch); 
rangeDownload($result); 

rangeDownload将处理出呼应的数据,并解析所述HTTP范围。这种方法是不是最好的,但我发现我的外部主机不支持字节范围请求,所以我不能做它一个更好的方法(除了可能缓存)。除非您无法控制您是否正在从处理字节范围请求下载数据的位置,否则我不会使用此方法。

相关问题