[英]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 ):
启动播放器时的请求是:
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 Player中搜索时,将发送另一个请求。 它与初始版本几乎相同,但有以下区别:
GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/8800968 HTTP/1.1 <same headers as first request>
答案与最初的答案几乎相同,只是Content-Length
标头有所不同。
这让我假设请求URL末尾的8800968
是我们正在寻找的“搜索范围”(查找后文件中的字节偏移),第二个响应Content-Length
是初始Content-Length
(即整个文件的长度)减去此范围。 确实是这样。
有了这些信息,应该可以得到想要的东西。 祝好运!
更新结束
仅当服务器支持HTTP RANGE请求时,此方法才有效。 如果是这样,它将返回206部分内容响应代码,其中包含Content-Range标头和您请求的字节范围 。 在对您的请求的回复中检查这些内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.