2

これは私のPHPビデオコードで、ブラウザで動作しますが、iPhoneやiPadで再生しようとすると、xが付いた再生ボタンが表示されるようです。

<?php
header('Content-type: video/mp4');
$homepage = file_get_contents('http://cdn.videos.budtraffic.com/sodaradio/J/Jessie%20J%20-%20Laserlight.mp4');
echo $homepage;
exit;
?>
4

2 に答える 2

4

Apple Web サイトでの説明

簡潔な答え :

iOS デバイスでは、サーバーがビデオのバイト範囲要求をサポートする必要があり、コードでその機能が提供されていないためです。

長い答え:

iOS デバイスがビデオのリクエストを行うとき、ビデオ全体をダウンロードするわけではありません。帯域幅の使用を最小限に抑えるため、またユーザーがビデオの前の部分をダウンロードせずに後の部分にスキップしたい場合があるため、一度に小さなチャンクのみをダウンロードします。そのために、バイト範囲リクエストを行います。基本的に、彼らはサーバーに「ねえ、ファイルの100番目と200番目のバイトの間の部分をくれ」と言います。バイト範囲リクエストはRangeヘッダーを使用し、次のようになります

GET /myvideo.mp4 HTTP/1.1
Host: www.example.com
Range: bytes=500-999

その場合、サーバーはそのようなもので応答する必要があります

HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Range: bytes 500-999/20000

したがって、iOS デバイスをサポートするには、これらの 4 つの php 行よりもはるかに多くの行が必要になります。まず、Rangeヘッダーを解析します。この情報は、$_SERVER['HTTP_RANGE']グローバル変数で利用できます。次に、ファイルのその部分だけを取得して、クライアントに送信する必要があります。Content-Rangeまた、ヘッダーを設定する必要があります。

Content-Rangeヘッダーには完全なファイル サイズが含まれているため、コードでその情報を提供する必要があることに注意してください。また、ほぼすべてのサーバーが静的ファイルに対するこの種の要求をサポートしていることにも注意してください。ファイルに特別な処理を行う必要がない場合、考えられるオプションは、ファイルを公開サーバーにコピーして、その処理を任せることです。

関係ないコメント

それを建設的な批判として受け止めてください。ただし、現在の形式のコードはサーバーをひざまずかせます。基本的に、送信する前にファイル全体をメモリに入れます。さらに悪いことに、リクエストごとにそれを行います。100 人のユーザーが 100 MB のビデオを同時にダウンロードした場合、サーバーに10 GBのメモリが必要になります。それはまったくスケーリングしません。

より良い解決策は、readfile関数を使用して、CDN からの読み取りとしてファイルを送信することです。そうすれば、メモリの小さなチャンクを使用するだけで済み、より多くの同時リクエストを処理できます。

EDIT : 実際には、特別な応答コードである 206 部分コンテンツで応答する必要もあります。この回答の最初のバージョンでそれを忘れていました。現在修正済み

于 2012-04-23T08:17:34.410 に答える
1

私は同じことをしようとしています: MP4 ビデオにアクセスするための安全な PHP スクリプトです。

iOS (iPad & iPhone) では動作しません。

このチュートリアルに従って、あなたが言ったこと(バイト範囲)を試しました:

http://mobiforge.com/developing/story/content-delivery-mobile-devices

しかし、iPad はリクエストで「HTTP_RANGE」を送信することはありません。これは .php ファイルなので、なぜ送信する必要があるのでしょうか??

書き換えルール(access.mp4→access.php)を作ったところ、iOSがaccess.mp4に到達しようとしても、サーバーへのリクエストにHTTP_RANGEがありません。

だから、iOSで動作する安全なPHPスクリプトを作成する方法はないと思います...

于 2012-06-08T13:38:21.783 に答える