4

H.264でエンコードされたMP4ビデオを提供するWebアプリを書いています。ChromeとSafariでは、HTML5ビデオタグを介してこれを行います。

これらのビデオへのアクセスを制御するために、それらのコンテンツは、本当に単純なメカニズムを使用してPHP経由で提供されます。

header('Content-type: video/mp4');
readfile($filename);
exit;

私が何をしても、ビデオはストリーミングされません。さらに:

  • 同じビデオタ​​グを使用してファイルを直接提供するようにソースコードを変更したが、PHPパススルーなしでApacheが提供するビデオのコピーにリンクすると、ストリーミングは正常に機能します。
  • ストリーミングが機能しない場合でも、グレー表示されたHTML5プレーヤーをいつでも右クリックして、PHPパススルーを介してファイルをダウンロードできます。オフラインでの再生に最適です。

何か案は?髪を抜いてます!

4

3 に答える 3

7

多分。コンテンツの長さのヘッダーも追加してみてください。

header('Content-length: '.filesize($filename));

それでも機能しない場合は、前の出力readfileecho'sまたは前の空白<?php)を確認してください。?>後に空白がないこと、または単に省略していることも確認してください?>(後に空白がない場合は必須ではありません)。

Rangeブルーノが述べたように、ストリーミングをサポートするには、ヘッダーにも従う必要があります。左境界のみを尊重する単純化された例を次に示します。

if (empty($_SERVER["HTTP_RANGE"])) {
    //do your current stuff...
}
else { //violes rfc2616, which requires ignoring  the header if it's invalid
    preg_match("/^bytes=(\d+)-/i",$_SERVER["HTTP_RANGE"], $matches);
         $offset = (int) $matches[1];
    if ($offset < $filesize && $offset >= 0) {
        if (@fseek($fp, $offset, SEEK_SET) != 0)
            die("err");
        header("HTTP/1.1 206 Partial Content");
        header("Content-Range: bytes $offset-".($filesize - 1)."/$filesize");
    }
    else {
        header("HTTP/1.1 416 Requested Range Not Satisfiable");
        die();
    }
        //fread in loop here
}
于 2010-07-11T10:11:57.947 に答える
0

コメントをご覧ください!

readfileは、出力前にファイル全体をメモリにロードするため、ビデオファイルのストリーミングにはお勧めしません。これにより、メモリが不足するという深刻な問題が発生します。

ファイルをチャンクごとに読み取って出力してみてください。

于 2010-07-11T10:37:22.470 に答える
0

HTML5 Embeddedビデオプレーヤーにファイルをストリーミングする場合でも、ビデオに関する情報をプレーヤーに通知するヘッダーを追加する必要があります。

読み取りコマンドを実行することだけを期待することはできませんreadfile()。物事は魔法のように機能します。申し訳ありませんが、プログラミングはそれほど簡単ではありません。(そうだったらいいのに)。

ここに、適切にストリーミングしたり、学習したりするために使用できる小さなアプリケーションがあります。

http://stream.xmoov.com/download/xmoov-php/

于 2010-07-11T10:43:22.280 に答える