質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3174閲覧

PHPを用いてiOSの端末向けに大容量動画ファイルを観れるようにしたい

p_nta

総合スコア7

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/02/21 08:53

PHPを用いてiOSの端末向けに大容量(300~600MB程度)動画ファイルを観れるようにしたいです。
・ファイル格納場所を秘匿したい。
・認証のあるサイト内で会員のみ再生させたい。
・メモリは128MB迄

上記の様な要件からPHPで動画ファイルを読出して表示するコードを書いたのですが、メモリサイズを超えるファイルを再生できません。
(数十MB程度のファイルでは問題なく再生できます)

$_SERVER["HTTP_RANGE"]で細かくロードされると思っていたのですが、$_SERVER["HTTP_RANGE"]のログを取ったところ、動画の全容量がリクエストされてしまうようでメモリが足りなくなってしまっているようです。
$_SERVER["HTTP_RANGE"]でリクエストされるレンジを数十MB程度等制御できるればと思い調べましたが、
見つける事が出来ませんでした、何か解決する方法ございますでしょうか。
bytes=0-1
bytes=0-265650875
bytes=632850-265650875
bytes=34734080-265650875
bytes=37224448-265650875

現在のソースコード

$fp = fopen(動画のパス, "r"); $etag = md5($_SERVER["REQUEST_URI"]).$size; if(isset($_SERVER["HTTP_RANGE"]) && $_SERVER["HTTP_RANGE"]){ header("Accept-Ranges: bytes"); list($start,$end) = sscanf($_SERVER["HTTP_RANGE"],"bytes=%d-%d"); if(empty($end)) $end = $start + 1000000 - 1; if($end>=($size-1)) $end = $size - 1; header("HTTP/1.1 206 Partial Content"); header("Content-Range: bytes {$start}-{$end}/{$size}"); $size = $end - $start + 1; fseek($fp,$start); header("Content-Type: video/mp4"); header("Content-Length: {$size}"); header("Etag: \"{$etag}\""); header("Connection: close\r\n"); echo fread($fp,$size); }else{ header("Accept-Ranges: bytes"); header("Content-Type: video/mp4"); header("Etag: \"{$etag}\""); } fclose($fp); exit;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

list($start,$end) = sscanf($_SERVER["HTTP_RANGE"],"bytes=%d-%d"); if(empty($end)) $end = $start + 1000000 - 1; if($end>=($size-1)) $end = $size - 1;

リクエストされたからといって全部返さなくても良いのでは・・・?

チャンクサイズを1000000 byteにするなら

list($start,$end) = sscanf($_SERVER["HTTP_RANGE"],"bytes=%d-%d"); if(empty($end) || $start - $end > 1000000) $end = $start + 1000000 - 1; if($end>=($size-1)) $end = $size - 1;

では?

投稿2018/02/23 05:02

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

p_nta

2018/02/23 06:23

ありがとうございます!無事再生できました! ご指摘いただいた箇所はチャンクサイズを1Mbyteにしたかったのではなく$endが空でリクエストされた場合の為に入れたものでした。 リクエストと違うサイズを返却しても大丈夫だったのですね…勉強になりました。 ``` if(empty($end) || $end - $start > 1000000) $end = $start + 1000000 - 1; ``` $startと$end逆になってましたがこちらのコードで解決しました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問