【问题标题】:Seeking in remote flv files using PHP使用 PHP 在远程 flv 文件中查找
【发布时间】:2009-11-22 15:21:59
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 您是否正在寻找帧的开头?或者只是任何旧的任意字节?您要查找的字节很重要。

标签: php flv


【解决方案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 标头。

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

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

更新结束

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

【讨论】:

  • HTTP/1.0 200 OK 服务器:Apache/1.3.37 (Debian GNU/Linux) PHP/4.4.7 内容类型:video/flv ETag:“Y70ZTH90” 内容长度:86618084 内容-处置:附件缓存控制:私有内容传输编码:二进制接受范围:字节
  • 返回 200,所以它不支持部分搜索……mmh没有其他想法没有其他选择?
  • Accept-Ranges: bytes 建议它确实支持范围请求。 $pos 和 $end 的值是多少?介意分享$host/$path_to_flv?
  • 是的,经过一番搜索后得出了相同的结论。现在我的 FLV 播放器有问题……从不同范围开始时不显示视频。但我认为这超出了问题的范围,除非你知道一点闪光?无论如何谢谢
  • 感谢迪斯科的这项研究。唯一的问题是解码范围。这个文件 [1] 有一个函数 _decode,它显示了 url 的第一个混淆部分是如何构造的,可能范围部分是相似的。可能需要查看玩家的动作脚本才能找到答案。 [1]github.com/monsieurvideo/get-flash-videos/blob/master/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多