これは私の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;
?>
簡潔な答え :
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 部分コンテンツで応答する必要もあります。この回答の最初のバージョンでそれを忘れていました。現在修正済み
私は同じことをしようとしています: 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スクリプトを作成する方法はないと思います...