我是在远程托管的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);
有什么想法吗?
答案 0 :(得分:-1)
<强>更新强>
显然,即使服务器发出信号表明它接受范围请求(使用Accept-Ranges: bytes
),它实际上并没有这样做。看看是否还有另一种方法可以使flv可以搜索,让我们来看一下flash播放器和服务器之间的通信(我使用wireshark):
启动播放器时的请求是:
GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ HTTP/1.1
Host: xxxxxx.megavideo.com
<some more headers>
<no range header>
这回答了这样的回答:
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>
现在当我在flash播放器中寻找时,会发送另一个请求。它与初始的几乎相同,但有以下区别:
GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/8800968 HTTP/1.1
<same headers as first request>
得到的答案几乎与初始答案相同,只有Content-Length
标题不同。
让我假设请求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。在回复您的请求时检查这些内容。