1

私は、プログレッシブにエンコードされたmp4ビデオとmp3オーディオファイルを大量にストリーミングし、プライベートネットワーク上にあるTomcatサーバー(サーバーA)を持っています。また、Apache 2 と PHP を実行する Web サーバー (サーバー B) もあり、これはプライベート ネットワーク上にあり、公開インターフェイスを備えています。サーバー B はアプリケーション ACL を管理します。

クライアント (ブラウザなど) がサーバー B のパブリック インターフェイスの特定の URL にアクセスし、プライベート サーバーからメディアをダウンロード (再生またはプレーヤーで表示) できるようにします。現時点では、サーバー B で次のことを試しました。

<?php
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
while (!feof($handler)) {
    print fread($handler, 8192);
}
exit;

<?php
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
print stream_get_contents($handler);
exit;

<?php
$handler = fopen('http://server_a/path/to/file.mp4', 'r');
header('Content-type: video/mp4');
fpassthru($handler);
exit;

PHP がメモリ不足になるか、クライアント (ブラウザ) が再生を開始する前にファイル全体をダウンロードします。私はこれについて間違った方向に進んでいますか?私が間違っている可能性があることについてのアイデアはありますか?

4

3 に答える 3

0

1番目と3番目のオプションでメモリが不足することはありませんが、サーバーBに特定のパス(例)のプロキシを設定することをお勧めします/path/to/videos/

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass

それが部分的なコンテンツ要求を受け入れるかどうかはわかりません。あなたが理解しなければならないことです。

次に、ブラウザが再生前にファイル全体をダウンロードする必要がある理由を説明できる2つのことがあります。

  1. ファイルはWebストリーミング用に最適化されていません。MP4Boxを使用して最適化できます(つまり、メタデータヘッダーをファイルの先頭に配置します)
  2. ファイルサイズは不明です。前述のプロキシまたはheader()解決可能なPHPのいずれかを使用します。
于 2012-08-14T01:38:15.327 に答える
0

いいえ、そのように動作します。基本的に、あなたのphpはファイルをファイルとして表示しています。あなたのPHPスクリプトは、「私はHTMLファイルではありません。私はMP4ファイルです。ここに私のコンテンツがあります」から進んでいます。PHPはストリーミングに必要なものではありません

PHP スクリプトを指定して、 HTML5ビデオまたはオーディオを使用してみませんか?

于 2012-08-14T01:31:40.250 に答える
0

ループのバッファをフラッシュ!!!

function flush_buffers(){
   ob_end_flush();
   ob_flush();
   flush();
   ob_start();
}
于 2016-03-06T02:22:57.610 に答える