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

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

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

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

Q&A

解決済

1回答

4481閲覧

PHPを使って、mp4を表示と再生

YoheiFujii

総合スコア16

PHP

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

0グッド

0クリップ

投稿2018/06/29 06:10

編集2018/06/29 06:11

前提・実現したいこと

様々なサイトを拝見して、コピペして、$fileの参照部分を書き換えましたが、再生されません。
何かご教授いただけたら嬉しいです。XAMPPのローカル環境で試しています。
(プログラミング初心者です。お手柔らかにお願いします。)

発生している問題・エラーメッセージ

PHPによるmp4の表示と再生ができない。

該当のソースコード

<?php $file = "video/test.mp4"; $file_size = filesize( $file ) ; header( "Accept-Ranges: bytes" ) ; //header('Content-type: video/mp4'); $handle = fopen($file, 'rb'); if ($handle === false) { return false; } if( isset( $_SERVER['HTTP_RANGE'] ) ) { list($toss, $range) = explode('=', $_SERVER['HTTP_RANGE']); list($range_start, $range_end) = explode('-', $range); $size = $file_size - 1; $length = $range_end - $range_start +1; // (rangeは0から始まる数なので) header('HTTP/1.1 206 Partial Content'); header('Content-type: video/mp4'); header('Content-Length: ' . $length); header('Content-Range: bytes ' . $range . '/' . $file_size); header("Etag: \"" . md5( $_SERVER["REQUEST_URI"] ) . $file_size . "\"" ); header("Last-Modified: " . gmdate( "D, d M Y H:i:s", filemtime($file)) . " GMT"); fseek($handle, $range_start); }else { // 一回目のリクエスト // Content-Length のヘッダと、ファイル全体をレスポンス $content_length = $file_size ; header('Content-type: video/mp4'); header('Content-Length: ' . $file_size); header("Etag: \"" . md5( $_SERVER["REQUEST_URI"] ) . $file_size . "\"" ); header("Last-Modified: " . gmdate( "D, d M Y H:i:s", filemtime($file)) . " GMT"); } @ob_end_clean(); while (!feof($handle) && connection_status() == 0 && !connection_aborted()) { set_time_limit(0); $buffer = fread($handle,8192); echo $buffer; @flush(); @ob_flush(); } fclose($handle); exit(0); ?>

試したこと

チェック済みサイト
http://www.phppro.jp/qa/2654
https://titirobo-develop.hatenablog.jp/entry/2017/02/21/131150
https://teratail.com/questions/38989
などなど。読んでも、試してもわからなかった。。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2018/06/29 06:58

htmlのvideoタグではなくわざわざphpで出力しようとするのはなぜでしょう?Webから参照できない場所にあるとか?
YoheiFujii

2018/07/02 22:53 編集

ありがとうございます!videoタグでできました。当初、画像しか取り出せていないのかと思いましたが、再生機能をつけていなかっただけのようです。お騒がせしました。。ありがとうございます!
guest

回答1

0

ベストアンサー

こちらのソースをから必要そうな部分を抜き出してみました。
phpを経由して動画(mp4)を出力する方法

PHP

1<?php 2// ファイルのフルパス 3$file = "/****/test.mp4"; 4 5$size = filesize($file); 6$fp = fopen($file,"rb"); 7 8// コンテンツの識別子 9$etag = md5($_SERVER["REQUEST_URI"]).$size; 10 11// ブラウザがHTTP_RANGEを要求してきた場合 12if(@$_SERVER["HTTP_RANGE"]){ 13 14 // 要求された開始位置と終了位置を取得 15 list($start,$end) = sscanf($_SERVER["HTTP_RANGE"],"bytes=%d-%d"); 16 17 // 終了位置が指定されていない場合(適当に1000000bytesづつ出す) 18 if(empty($end)) $end = $start + 1000000 - 1; 19 20 // 終了位置がファイルサイズを超えた場合 21 if($end>=($size-1)) $end = $size - 1; 22 23 // 部分コンテンツであることを伝える 24 header("HTTP/1.1 206 Partial Content"); 25 26 // コンテンツ範囲を伝える 27 header("Content-Range: bytes {$start}-{$end}/{$size}"); 28 29 // 実際に送信するコンテンツ長: 終了位置 - 開始位置 + 1 30 $size = $end - $start + 1; 31 32 // ファイルポインタを開始位置まで移動 33 fseek($fp,$start); 34 35} 36 37// HTTP_RANGE(部分リクエスト)に対応していることを伝える 38header("Accept-Ranges: bytes"); 39header("Content-Type: video/mp4"); 40header("Content-Length: {$size}"); 41header("Etag: \"{$etag}\""); 42 43// ファイルポインタの開始位置からコンテンツ長だけ出力 44if($size) echo fread($fp,$size); 45 46fclose($fp); 47 48exit;

投稿2018/06/29 07:27

編集2018/06/29 07:29
mayoi_maimai

総合スコア1583

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

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

YoheiFujii

2018/07/02 22:56

ありがとうございます!今回は自分の不注意で、videoタグで出力できました。次回、PHPでmp4を改めて、出力する必要がある場合、試してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問