PHP kullanarak uzak flv dosyaları arayan

1 Cevap php

Ben uzaktan barındırılan FLV dosyasında aramak ve yerel akışı var dize değilim. Başlangıç ​​eserlerinden akarsu, ama ben 'aramak' çalıştığınızda, çalar durur.

Ben uzaktan dosya aramak için bu komut dosyasını kullanıyorum

  $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);

Herhangi bir fikir?

1 Cevap

UPDATE

(Accept-Ranges: bytes ile), aslında bunu yapmaz yani görünüşte, hatta sunucu sinyalleri olsa aralık isteklerini kabul eder. flv Seekable yapmak için başka bir yolu olup olmadığını görmek için, en (ben bu için wireshark kullanabilirsiniz) flash player ve sunucu arasındaki iletişimi bir göz atalım:

  1. çaları başlangıç ​​isteği:

    GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/ HTTP/1.1
    Host: xxxxxx.megavideo.com
    <some more headers>
    <no range header>
    
  2. Bu böyle bir tepki ile cevap şudur:

    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. i flash player aradıkları zaman şimdi, başka bir istek gönderilir. aşağıdaki fark ile, hemen hemen ilk olarak aynıdır:

    GET /files/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/8800968 HTTP/1.1
    <same headers as first request>
    
  4. sadece Content-Length başlığında bir fark ile ilk bir, hemen hemen aynı bir tepki ile cevap aldığı.

Beni 8800968 isteği url sonunda biz arıyoruz "aramak aralığı" (başvurduktan sonra dosyada ofset bayt) ve ikinci tepki {olduğunu varsayalım ki [(1) }] başlangıç ​​Content-Length (bütün dosya uzunluğu) eksi bu alanıdır. Gerçekten de böyle edilmektedir.

Bu bilgi ile, o istediğini elde etmek mümkün olmalıdır. iyi şanslar!

UPDATE END

Bu sadece çalışacaktır eğer sunucunun desteklediği HTTP RANGE requests. öyle ise, o will return a 206 Partial Content response code with a Content-Range header and your requested range of bytes. isteğinize yanıt olarak bu kontrol edin.