2009-11-22 45 views
1

我是一個字符串在遠程託管的FLV文件中尋找並使其在本地流。從開始的工作流,但當我試圖'尋求',玩家停止。在使用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); 

任何想法?

+0

你正在尋求一個框架的開始?或者只是任何舊的任意字節?它對你尋找哪個字節很重要。 – 2009-11-23 21:30:34

回答

-1

UPDATE

所以很顯然,即使服務器信號,它可以接受範圍請求(與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 Player求,另一個請求是發送。它幾乎是一樣的初始之一,具有以下不同:

    GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/8800968 HTTP/1.1 
    <same headers as first request> 
    
  4. 而它與幾乎相同的初始一個的響應,其中僅在Content-Length報頭中的差分回答。

這讓我假設8800968在請求URL的末尾是我們正在尋找的「討範圍」(字節謀求之後的文件中偏移量),而第二反應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。請在回覆您的請求時檢查這些信息。

+0

HTTP/1.0 200 OK 服務器:Apache/37年3月1日(的Debian GNU/Linux的)PHP/4.4.7 的Content-Type:視頻/ FLV 的ETag: 「Y70ZTH90」 的Content-Length:86618084 內容處置:附件 緩存控制:私人 內容傳輸編碼:二進制 接受範圍:字節 – Disco 2009-11-22 15:43:36

+0

返回200,所以它不支持部分尋找... mmh沒有其他的想法沒有其他的選擇嗎? – Disco 2009-11-22 15:45:14

+0

'Accept-Ranges:bytes'表明它支持範圍請求。 '$ pos'和'$ end'的值是什麼?介意分享'$ host/$ path_to_flv'? – 2009-11-22 16:09:18