使用PHP寻找远程flv文件

时间:2009-11-22 15:22:00

标签: php flv

我是在远程托管的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);

有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

<强>更新

显然,即使服务器发出信号表明它接受范围请求(使用Accept-Ranges: bytes),它实际上并没有这样做。看看是否还有另一种方法可以使flv可以搜索,让我们来看一下flash播放器和服务器之间的通信(我使用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播放器中寻找时,会发送另一个请求。它与初始的几乎相同,但有以下区别:

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

  5. 让我假设请求url末尾的8800968是我们正在寻找的“搜索范围”(搜索后文件中的字节偏移量),第二个响应{{1} }是初始Content-Length(整个文件的长度)减去此范围。事实确实如此。

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

    更新结束

    这仅在服务器支持HTTP RANGE requests时才有效。如果是的话,那就will return a 206 Partial Content response code with a Content-Range header and your requested range of bytes。在回复您的请求时检查这些内容。