繁体   English   中英

使用PHP寻找远程flv文件

[英]Seeking in remote flv files using PHP

我想在远程托管的FLV文件中查找并在本地流式传输。 从开始播放流媒体,但是当我尝试“搜索”时,播放器停止。

我正在使用此脚本来查找远程文件

  $fp = fsockopen($host, 80, $errno, $errstr, 30);
  $out  = "GET $path_to_flv HTTP/1.1\r\n";
  $out .= "Host: $host\r\n";
  $out .= "Range: bytes=$pos-$end\r\n";
  $out .= "Connection: Close\r\n\r\n";

  fwrite($fp, $out);

  $content = false;

  while (!feof($fp))
  {
    $data = fgets($fp, 1024);
    if($content) echo $data;
    if($data == "\r\n")
    {
      $content = true;
      header("Content-Type: video/x-flv");
      header("Content-Length: " . (urlfilesize($file) - $pos));
      if($pos > 0)
      {
        print("FLV");
        print(pack('C', 1));
        print(pack('C', 1));
        print(pack('N', 9));
        print(pack('N', 9));
      }
    }
  }
  fclose($fp);

有任何想法吗 ?

更新

因此,显然,即使服务器发信号通知它接受范围请求(使用Accept-Ranges: bytes ),它实际上也没有这样做。 看看是否还有另一种方法使flv变得可查找,让我们看一下Flash Player和服务器之间的通信(为此,我使用wireshark ):

  1. 启动播放器时的请求是:

     GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ HTTP/1.1 Host: xxxxxx.megavideo.com <some more headers> <no range header> 
  2. 这是用这样的回答来回答的:

     HTTP/1.0 200 OK Server: Apache/1.3.37 (Debian GNU/Linux) PHP/4.4.7 Content-Type: video/flv ETag: "<video-id>" Content-Length: <length of complete video> <some more headers> <the flv content> 
  3. 现在,当我在Flash Player中搜索时,将发送另一个请求。 它与初始版本几乎相同,但有以下区别:

     GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/8800968 HTTP/1.1 <same headers as first request> 
  4. 答案与最初的答案几乎相同,只是Content-Length标头有所不同。

这让我假设请求URL末尾的8800968是我们正在寻找的“搜索范围”(查找后文件中的字节偏移),第二个响应Content-Length是初始Content-Length (即整个文件的长度)减去此范围。 确实是这样。

有了这些信息,应该可以得到想要的东西。 祝好运!

更新结束

仅当服务器支持HTTP RANGE请求时,此方法才有效。 如果是这样,它将返回206部分内容响应代码,其中包含Content-Range标头和您请求的字节范围 在对您的请求的回复中检查这些内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM