ブラウザから動画ファイル名を確認できないようにPHPで動画を出力する方法
Webページ上で動画ファイルを再生したい場合、通常だとブラウザのソースコード上に「〇〇.mp4」等の動画ファイル名が記述されるが、このファイル名を記述せずに再生させたい。またURLのGETパラメータを読み取り対応する動画を再生したい。PHPから動画を出力する形で実装できたので以下に方法をメモ。
目次
サンプル
動画プレイヤー側ページ
https://taitan916.info/sample/video/php/
動画出力ページ
https://taitan916.info/sample/video/php/video.php
video.phpというファイルにてPHPから動画を出力できている点が確認できる筈。
ソースコード
動画プレイヤー側ページ(index.php)
<video src="./video.php" onclick="this.play();" controls="controls"></video>
動画出力ページ(video.php)
<?php $file = '../test.mp4'; $size = filesize($file); $fp = fopen($file,"rb"); $etag = md5($_SERVER["REQUEST_URI"]).$size; header("Accept-Ranges: bytes"); header("Content-Type: video/mp4"); header("Content-Length: {$size}"); header("Etag: \"{$etag}\""); if($size) echo fread($fp,$size); fclose($fp); exit;
解説等
動画の出し分け
実際の運用としては動画プレイヤー側ページ(index.php)で「movie_id」等のGETパラメータを受け取ってデータベースとやり取りし、対応する動画があれば以下のようにvideoタグにパラメータを付与し、
<video src="./video.php?video_id=xxxxxx&time=【タイムスタンプ】" onclick="this.play();" controls="controls"></video>
動画出力ページ(video.php)で再度GETパラメータを受け取ってデータベースとやり取りし、対応する動画ファイル名を$file変数に格納する形になると思われる。また、キャッシュ対策にタイムスタンプをつけておいた方が良さそう。
また、動画プレイヤー側ページ(index.php)で対応する動画が見つからない場合やGETパラメータが無い場合は、そもそもvideoタグを記述せずにエラー表示するよう分岐処理する。
動画ファイルへの直接アクセス禁止
動画ファイル用ディレクトリにブラウザからアクセスできないよう以下のようにhtaccessファイルを設置すると良い。
<Files ~ "\.(avi|mp4|ogv|webm|f4v)$"> SetEnvIf Cookie "videoaccess=true" ok order deny,allow deny from all allow from env=ok </Files>
尚、これでもFirefoxだと動画プレイヤー上で「Shift + 右クリック」から動画がダウンロードできるため、JavaScriptで右クリック禁止にするか、以前にメモした「Plyr」と併用するのが良いと思われる。