- ベストアンサー
PHPでWebに動画埋め込みを行うには?
HTMLで、<embed></embed>タグを使うことによって、動画などをWebに埋め込み再生できると思うのですが、同じようなことをPHPで記述したいと思っています。 理由は、<embed></embed>タグだと、ソースを見ることで、動画ファイル名や格納先フォルダがわかってしまうので。 PHPで記述して、それらを見られないようにしたいと思っています。 ストリーミングで行うには、環境とか揃えるのにいろいろ大変なので、PHPで行いたいと思っています。 どなたか、PHPでの記述例をご教授下さいませ。 よろしくお願い致します。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
<embed>にtype属性を指定したらどうなりますか?推測ですが、ブラウザ側でプラグインを起動する時、contents-typeだけじゃなくて拡張子で判断してるかも知れないなぁなんて思いました。エクスプローラーで普通にローカルのファイルをクリックした時って、拡張子で立ち上げるソフトを判別するじゃないですか。だからもしかしたら・・・なんて思ったんですが。 ま、今回は一問一答のようになってしまいましたが、何か期待通りの動きをしない時には、その原因を一生懸命想像して色々試してみて下さい。試行錯誤した事はなかなか忘れませんし、深く理解する事ができます。
その他の回答 (11)
- wakame0729
- ベストアンサー率32% (245/765)
<embed>タグは使った事がないので・・・説明を見る限りでは問題が無いようにも見えますが、よくわかりません。 で、動画ファイルを公開ディレクトリに置き、<embed>タグでそのファイルを直接してすれば表示されるのですか?それで表示されなければ<embed>タグの使い方に問題があるので、HTMLのカテゴリで聞かれてはどうでしょうか?直接動画ファイルを指定して表示されるのであれば、原因はなんだろうな。ファイル名にURLエンコードが必要な文字は入ってないですよね?日本語とか変な記号とか。
お礼
はい、<embed>タグでそのファイルを直接していすれば、動画再生します。 最初、この方法でHTMLに埋め込んでいたので。 動画ファイル自体も半角英数小文字も用いており、2バイトや大文字でのファイル名は用いておりません。 私もこれ以上は、ちょっと不明なのですが、画像イメージファイルで試してみるとか、ちょっといろいろとやってみようと思います。 でも、今回、お教えいただいたことで、PHPの使い方ならびに方法がだいぶわかりましたので、今後にも使えると思っております。 どうも、ありがとうございます。
補足
お礼書き込みの後、試してみました。 <a href="./movie.php?f=filename">★</a> と、HTMLに記述してみました。 “★”部分をクリックすると、無事に動画再生されました。 ということは、<embed>タグでは、上手く動作しないのかもしれません。 一応、ご報告まで。
- wakame0729
- ベストアンサー率32% (245/765)
$_GET["f"]という事は、そのスクリプトを.php?f=ファイルとリクエストしていますか?
お礼
失礼しました。 ファイル名を渡していませんでした。 ブラウザで直接、http://localhost/XXXXXXX/movie.php?f=filename とすると、メディアプレイヤが起動し再生されました。 しかし、<embed src="./movie.php?f=filename"></embed>として、 HTMLから呼び出しましたが、何も表示動作しませんでした。 HTML内の指定は間違っておりますでしょうか? ちなみに、これらの方法だと、拡張子前のファイル名は知られてしまう(HTML内に引数として記述するので)が、格納先ディレクトリを知られることはないので、結果として直アクセスなどはできないということで、よろしいでしょうか?
- wakame0729
- ベストアンサー率32% (245/765)
何度も何度もすみません。 もしうまく表示できなけえれば @readfileの@を外して下さい。これで、readfileでエラーが出た時にエラーメッセージが表示されます。
お礼
どうも、お手数おかけします。 教えていただいた方法を含めて、いろいろやってみましたが、なにをどうやっても変わらずでした。 そこで・・・print $filename;で、中身を表示させてみました。 すると、xxxxx/movie/.mpgとなってブラウザの表示されました。 どうやら、$_GET["f"]で上手く取ってこれてなく空っぽのようです。
- wakame0729
- ベストアンサー率32% (245/765)
必ず"/"からの絶対アドレスにした方が安全だと思います。includeするファイルのあるディレクトリを予め設定する方法もありますが、これだけであればその都度指定しても大した手間ではありませんしね。 Windowsであれば、"c:\"のようにドライブ指定からすれば間違いないでしょう。
- wakame0729
- ベストアンサー率32% (245/765)
あ、あとNo4のお礼の欄にあるソース、$filenameの指定ですが、URLではなくサーバー上の絶対パスです。例えば/home/xxxxx/movie/みたいな感じです。 ついでに言えば、この動画置き場はWEBで公開する必要はありません。webアクセスできなければセキュリティ的にもかなり安全になります。
お礼
たびたび、ありがとうございます。 $filenameの指定は、ローカル環境ですので、 http://localhost/XXXXXXX/movie/の場合、 "XXXXXXX/movie/"で良いでしょうか?
- wakame0729
- ベストアンサー率32% (245/765)
No4のお礼に書かれたソースですが、落ち着いて見直して頂ければわかると思います。No2の方が提示してくれたサンプルと僕が提示した直接ファイル指定のサンプルがごっちゃになっています。No2の方の提案と僕の提案は別物ですからごっちゃにしないで下さい。 最低限でしたら僕のサンプルだけで動くとは思いますよ。 アクセス制限ですが、一番簡単なのは$_SERER["HTTP_REFERER"]のチェックです。正常なリクエストであれば、<embed>タグが書かれたページのURLが入ってると思います(念のため一度$_SERVER["HTTP_REFERER"]の値をprintで確認してみて下さい)。これ以外のURLがここに入ってたらエラー、のような感じにすれば良いと思います。 それとmpegのコンテンツタイプですが、video/mpegかな、と思います。
お礼
失礼しました。 以下のコードでよろしいでしょうか? --------------- <?php $filename = "XXXXXXX/movie/".$_GET["f"].".mpg"; if (!file_exists($filename)){ //エラー処理 exit(); } header("contents-type: video/mpg"); @readfile($filename); exit(); ?> --------------- で、<embed src="./movie.php"></embed>として、 HTMLから呼び出しましたが、やはり何も表示動作しませんでした。 movie.phpに直接アクセスしても、同様でした。 ローカル環境では、動作しないとかありますか? 現在、サーバ環境が整っていないため、PHPもCGIもローカルでしか開発および動作確認が取れないんです。
- wakame0729
- ベストアンサー率32% (245/765)
補足の補足です。 この方法を応用すると、画像や動画への直リンクを防止する事もできます。例えば前の画面からタイムスタンプを渡してあげて、一定時間経っていたらエラーにするとか、$_SERER["HTTP_REFERER"]をチェックして、自ドメイン以外からのリクエストはエラーにするなどです。 だって、ディレクトリやファイル名を隠したいという理由は、直リンク、直アクセスを避けたいっていう要素もあるんじゃないですか?
お礼
> 直リンク、直アクセスを避けたい はい、おっしゃるとおりです。 そのようにもしたいです。 そうするにローカルにファイルを安易にダウンロードされないようにしたいと思っています。
- wakame0729
- ベストアンサー率32% (245/765)
LancerVIIさん、フォローどうもでした。いつも思うのですが、質問者の方の理解度がわからないので、どの程度噛み砕いて説明すればいいのかわからないんですよ。 さて、実際の動画ファイルが置いてあるディレクトリがWEBで公開されていなければ、パラメータとしてファイル名を渡してしまうのもアリだと思いますよ。拡張子は固定でしょうから、ベース名だけでいいでしょう。この場合、ユーザーが適当なファイル名を渡してリクエストする場合もありますから、きちんとエラー処理してやる必要はありますが。 $filename = "絶対パス".$_GET["f"].".mov(例えば)"; if (!file_exists($filename)){ エラー処理 exit(); } header("contents-type: うんちゃらかんたら"); @readfile($filename); exit(); 最低限の要素を並べるとこんな感じ?
お礼
ご回答ありがとうございました。 PHPは初心者なもので、すいません・・ 一応、教えていただいた内容を元に、コードにしてみましたが、これであっているでしょうか? 特に、header関数のcontents-typeに指定の仕方がわかりませんでした。 で、、<embed src="./movie.php?mid=0001"></embed> とHTMLから呼んでみましたが、何も表示されませんでした。 すいません、ご教授いただけると幸いです。 ------------------------------ <?php define ( 'MOVIE_DIR', './movie/' ); $mid = $_GET['mid']; if ( $mid == "0001" ) { $url = MOVIE_DIR."YYYYY.mpg"; } elseif ( $mid == "0002" ) { $url = MOVIE_DIR."ZZZZZ.mpg"; } $filename = "http://localhost/XXXXXXX/movie/".$_GET["f"].".mpg"; if (!file_exists($filename)){ //エラー処理 exit(); } header("contents-type: mpg/$mpgtype"); @readfile($filename); exit(); ?> ------------------------------
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 下の私のNo2の回答はNo1さんのに補足した形になります。 どういうパラメータを渡して、どういう処理をすればよいかということだけのアドバイスでした。 実行するにはmovie.phpで#1さんの >パラメータを受け取ってファイルを特定する事、contents-typeをheader関数で指定する事、そしてreadfile()関数を実行するって感じです。これで目的は果せるのかな、と思いますがどうでしょう? を実行しなければいけません。 また呼び出しは動画を表示したいHTML内に <embed src="./movie.php?mid=0001"></embed> という形でmovie.phpを呼び出します。 mySQLを使用できる環境であれば create table MOVIE ( MOVEID char(4), MOVENAME varchar(128), primary key (MOVEID) ) みたいなテーブルを作成して、 MOVEIDをキーにしてMOVENAMEを取得するようにすれば わざわざif文を沢山書く必要もなくなります。 (渡されたIDでレコードがあるかどうかは見ないと駄目でしょうけど)
お礼
ご回答、ありがとうございます。 > を実行しなければいけません。 そうでしたか、大変失礼しました。 > また呼び出しは動画を表示したいHTML内に > <embed src="./movie.php?mid=0001"></embed> > という形でmovie.phpを呼び出します。 はい、これはそのようにして呼び出しております。 とりあえず、PHPのみで動作させて、その後に動画ファイルがかなり増えるようであれば、DBを使いたいと思います。
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 >ここで言うパラメータとは、動画ファイル名、格納先フォルダ名ということでしょうか? これをパラメータにしてしまうと、同じことになってしまいます。 例えば動画にIDを付けて movie.php?mid=0001 とmovie.phpに0001を渡します。 define ( 'MOVIE_DIR', './moviexxxx/' ); $mid = $_GET['mid']; if ( $mid == "0001" ) { $url = MOVIE_DIR."movie001"; } elseif ( $mid == "0002" ) { $url = MOVIE_DIR."movie002"; } こうすることにより$urlに動画へのパスが ファイル名、ディレクトリ場所がわかることなく 生成することが出来ます。 それを使ってあげて処理すれば隠蔽できると思います。 表向きにはmid=0001というものしか出てきませんので。 本来はDBが使えると、if文等使わずに簡単に処理できます。
補足
ご回答、ありがとうございます! ちなみに、DBはMySQLを用いています。 (まだ、ぜんぜん使い込んでいませんが・・) 早速、以下のPHP文、 ---------- <?php define ( 'MOVIE_DIR', './xxxxx/' ); $mid = $_GET['mid']; if ( $mid == "0001" ) { $url = MOVIE_DIR."yyyyy.mpg"; } elseif ( $mid == "0002" ) { $url = MOVIE_DIR."zzzzz.mpg"; } ?> ---------- を、movie.phpというファイル名で保存し、 http://localhost/movie.php?mid=0001 という具合にブラウザから実行してみましたが、 ブラウザも真っ白のままで何も動作しませんでした。 もちろん、PHPはローカルで動作する環境になっておりますが。 何か、おかしいところでもあるでしょうか?
- 1
- 2
お礼
http://www.interq.or.jp/blue/inside/tech/embedtype.html を参考に、<embed>タグのType属性を調べて、 <embed src="./movie.php?f=filename" type="application/x-mplayer2"></embed> あるいは、 <embed src="./movie.php?f=filename" type="video/mpeg"></embed> という具合に指定してみました。 すると、ブラウザに埋め込まれた形の動画画面までは表示されました。 しかし、再生されず。。。再生ボタンを押しても再生されないです。 ん~、、、、残念・・ でも、何か一歩だけ進んだような気がしました。