• ベストアンサー

PHPでWebに動画埋め込みを行うには?

HTMLで、<embed></embed>タグを使うことによって、動画などをWebに埋め込み再生できると思うのですが、同じようなことをPHPで記述したいと思っています。 理由は、<embed></embed>タグだと、ソースを見ることで、動画ファイル名や格納先フォルダがわかってしまうので。 PHPで記述して、それらを見られないようにしたいと思っています。 ストリーミングで行うには、環境とか揃えるのにいろいろ大変なので、PHPで行いたいと思っています。 どなたか、PHPでの記述例をご教授下さいませ。 よろしくお願い致します。

  • THUBAN
  • お礼率76% (771/1002)
  • PHP
  • 回答数12
  • ありがとう数18

質問者が選んだベストアンサー

  • ベストアンサー
回答No.12

<embed>にtype属性を指定したらどうなりますか?推測ですが、ブラウザ側でプラグインを起動する時、contents-typeだけじゃなくて拡張子で判断してるかも知れないなぁなんて思いました。エクスプローラーで普通にローカルのファイルをクリックした時って、拡張子で立ち上げるソフトを判別するじゃないですか。だからもしかしたら・・・なんて思ったんですが。 ま、今回は一問一答のようになってしまいましたが、何か期待通りの動きをしない時には、その原因を一生懸命想像して色々試してみて下さい。試行錯誤した事はなかなか忘れませんし、深く理解する事ができます。

THUBAN
質問者

お礼

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> という具合に指定してみました。 すると、ブラウザに埋め込まれた形の動画画面までは表示されました。 しかし、再生されず。。。再生ボタンを押しても再生されないです。 ん~、、、、残念・・ でも、何か一歩だけ進んだような気がしました。

その他の回答 (11)

回答No.11

<embed>タグは使った事がないので・・・説明を見る限りでは問題が無いようにも見えますが、よくわかりません。 で、動画ファイルを公開ディレクトリに置き、<embed>タグでそのファイルを直接してすれば表示されるのですか?それで表示されなければ<embed>タグの使い方に問題があるので、HTMLのカテゴリで聞かれてはどうでしょうか?直接動画ファイルを指定して表示されるのであれば、原因はなんだろうな。ファイル名にURLエンコードが必要な文字は入ってないですよね?日本語とか変な記号とか。

THUBAN
質問者

お礼

はい、<embed>タグでそのファイルを直接していすれば、動画再生します。 最初、この方法でHTMLに埋め込んでいたので。 動画ファイル自体も半角英数小文字も用いており、2バイトや大文字でのファイル名は用いておりません。 私もこれ以上は、ちょっと不明なのですが、画像イメージファイルで試してみるとか、ちょっといろいろとやってみようと思います。 でも、今回、お教えいただいたことで、PHPの使い方ならびに方法がだいぶわかりましたので、今後にも使えると思っております。 どうも、ありがとうございます。

THUBAN
質問者

補足

お礼書き込みの後、試してみました。 <a href="./movie.php?f=filename">★</a> と、HTMLに記述してみました。 “★”部分をクリックすると、無事に動画再生されました。 ということは、<embed>タグでは、上手く動作しないのかもしれません。 一応、ご報告まで。

回答No.10

$_GET["f"]という事は、そのスクリプトを.php?f=ファイルとリクエストしていますか?

THUBAN
質問者

お礼

失礼しました。 ファイル名を渡していませんでした。 ブラウザで直接、http://localhost/XXXXXXX/movie.php?f=filename とすると、メディアプレイヤが起動し再生されました。 しかし、<embed src="./movie.php?f=filename"></embed>として、 HTMLから呼び出しましたが、何も表示動作しませんでした。 HTML内の指定は間違っておりますでしょうか? ちなみに、これらの方法だと、拡張子前のファイル名は知られてしまう(HTML内に引数として記述するので)が、格納先ディレクトリを知られることはないので、結果として直アクセスなどはできないということで、よろしいでしょうか?

回答No.9

何度も何度もすみません。 もしうまく表示できなけえれば @readfileの@を外して下さい。これで、readfileでエラーが出た時にエラーメッセージが表示されます。

THUBAN
質問者

お礼

どうも、お手数おかけします。 教えていただいた方法を含めて、いろいろやってみましたが、なにをどうやっても変わらずでした。 そこで・・・print $filename;で、中身を表示させてみました。 すると、xxxxx/movie/.mpgとなってブラウザの表示されました。 どうやら、$_GET["f"]で上手く取ってこれてなく空っぽのようです。

回答No.8

必ず"/"からの絶対アドレスにした方が安全だと思います。includeするファイルのあるディレクトリを予め設定する方法もありますが、これだけであればその都度指定しても大した手間ではありませんしね。 Windowsであれば、"c:\"のようにドライブ指定からすれば間違いないでしょう。

回答No.7

あ、あとNo4のお礼の欄にあるソース、$filenameの指定ですが、URLではなくサーバー上の絶対パスです。例えば/home/xxxxx/movie/みたいな感じです。 ついでに言えば、この動画置き場はWEBで公開する必要はありません。webアクセスできなければセキュリティ的にもかなり安全になります。

THUBAN
質問者

お礼

たびたび、ありがとうございます。 $filenameの指定は、ローカル環境ですので、 http://localhost/XXXXXXX/movie/の場合、 "XXXXXXX/movie/"で良いでしょうか?

回答No.6

No4のお礼に書かれたソースですが、落ち着いて見直して頂ければわかると思います。No2の方が提示してくれたサンプルと僕が提示した直接ファイル指定のサンプルがごっちゃになっています。No2の方の提案と僕の提案は別物ですからごっちゃにしないで下さい。 最低限でしたら僕のサンプルだけで動くとは思いますよ。 アクセス制限ですが、一番簡単なのは$_SERER["HTTP_REFERER"]のチェックです。正常なリクエストであれば、<embed>タグが書かれたページのURLが入ってると思います(念のため一度$_SERVER["HTTP_REFERER"]の値をprintで確認してみて下さい)。これ以外のURLがここに入ってたらエラー、のような感じにすれば良いと思います。 それとmpegのコンテンツタイプですが、video/mpegかな、と思います。

THUBAN
質問者

お礼

失礼しました。 以下のコードでよろしいでしょうか? --------------- <?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もローカルでしか開発および動作確認が取れないんです。

回答No.5

補足の補足です。 この方法を応用すると、画像や動画への直リンクを防止する事もできます。例えば前の画面からタイムスタンプを渡してあげて、一定時間経っていたらエラーにするとか、$_SERER["HTTP_REFERER"]をチェックして、自ドメイン以外からのリクエストはエラーにするなどです。 だって、ディレクトリやファイル名を隠したいという理由は、直リンク、直アクセスを避けたいっていう要素もあるんじゃないですか?

THUBAN
質問者

お礼

> 直リンク、直アクセスを避けたい はい、おっしゃるとおりです。 そのようにもしたいです。 そうするにローカルにファイルを安易にダウンロードされないようにしたいと思っています。

回答No.4

LancerVIIさん、フォローどうもでした。いつも思うのですが、質問者の方の理解度がわからないので、どの程度噛み砕いて説明すればいいのかわからないんですよ。 さて、実際の動画ファイルが置いてあるディレクトリがWEBで公開されていなければ、パラメータとしてファイル名を渡してしまうのもアリだと思いますよ。拡張子は固定でしょうから、ベース名だけでいいでしょう。この場合、ユーザーが適当なファイル名を渡してリクエストする場合もありますから、きちんとエラー処理してやる必要はありますが。 $filename = "絶対パス".$_GET["f"].".mov(例えば)"; if (!file_exists($filename)){ エラー処理 exit(); } header("contents-type: うんちゃらかんたら"); @readfile($filename); exit(); 最低限の要素を並べるとこんな感じ?

THUBAN
質問者

お礼

ご回答ありがとうございました。 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)
回答No.3

こんにちは。 下の私の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でレコードがあるかどうかは見ないと駄目でしょうけど)

THUBAN
質問者

お礼

ご回答、ありがとうございます。 > を実行しなければいけません。 そうでしたか、大変失礼しました。 > また呼び出しは動画を表示したいHTML内に > <embed src="./movie.php?mid=0001"></embed> > という形でmovie.phpを呼び出します。 はい、これはそのようにして呼び出しております。 とりあえず、PHPのみで動作させて、その後に動画ファイルがかなり増えるようであれば、DBを使いたいと思います。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 >ここで言うパラメータとは、動画ファイル名、格納先フォルダ名ということでしょうか? これをパラメータにしてしまうと、同じことになってしまいます。 例えば動画に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文等使わずに簡単に処理できます。

THUBAN
質問者

補足

ご回答、ありがとうございます! ちなみに、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はローカルで動作する環境になっておりますが。 何か、おかしいところでもあるでしょうか?

関連するQ&A

  • スマートフォンでWMV埋込動画を再生させたい

    自分のホームページのWMV形式埋込動画をスマホで再生できなくて 困っております。HTML5でタグを記述すればできるという情報を 得ましたが、WMV形式がそもそもストリーミング再生できるのかどうか の情報は得られませんでした。 何か解決策はないものか、ご教授いただけませんでしょうか。

  • アスペクト比16:9の動画をWEBにストリーミングする方法について

    16:9映像をWMVにしてWEBにストリーミング配信したいのですが、 HTMLに埋め込むと16:9の映像になりません。 映像がOBJECTタグで指定した画面サイズの大きさになってしまいます。 PC上のWindowsMediaPlayerで再生すると上下に空白があって16:9になるのですが、HTMLに埋め込みではできないのでしょうか? ずっと調べていますが、できるのかできないのかもわかっていないです。 どなたかご存知の方がいましたらご教授ください。 ■以下HTMLのソースです。 ※映像が画面サイズいっぱいになってしまう。 <OBJECT CLASSID="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95"  ID="MediaPlayer" width="320" height="280"> <PARAM NAME="FileName" VALUE="16_9.wmv"> <EMBED SRC="16_9.wmv" width="320" height="280"></EMBED> </OBJECT>

  • webへの動画埋め込みについて

    現在、下記のタグを使って動画をストリーミング配信していますが、 ウィンドウズメディアプレーヤーが表示された時、再生するまで 画面が真っ黒です。 そこで、静止画を表示したいのですがどのようにしたらよいのか 解りません。ご教授頂けないでしょうか。 <center><OBJECT ID="wmp" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" WIDTH=320 HEIGHT=305> <param name="URL" value="http://xxx.xxx.jp/xxx.wvx"> <param name="uiMode" value="full"> <param name="enableContextMenu" value="false"> <param name="autostart" value="false"></center> <center><embed name="wmp" type="application/x-mplayer2" src="http://xxx.xxx.jp/xxx.wvx" width="320" height="309" autostart="0" showcontrols="1" ShowStatusBar="1" EnableContextmenu="0" > </embed> </object> </center> 尚、静止画は動画の最初の1コマでも他の画像を使用するでも かまいません。 よろしくお願い致しますm(..)m

  • 動画を…

    弊社で下のアドレスのように http://www.p-world.co.jp/kanagawa/georgie.htm EMBEDタグを使って動画を再生しているのですが(ハイパーセブンデイズMAX)再生する動画に関して ひとつのEMBEDタグの中に多数のファイルのURLを入れて、順番に複数再生したり、動画がランダム再生されたりするようなタグはありませんか? たぶんjavaだと思うんですが…私はHTMLはいじっててもjavaは触った事無いです;

    • ベストアンサー
    • HTML
  • PHPで音楽動画を自動再生させたい

    単刀直入をお許しください。 PHPのopendir() とreaddir()関数を使い、ディレクトリー内の複数の音楽動画のファイル名を一つずつHTMLの<embed>あるいは <video>タグのscr パラメーターに渡して再生し、動画が終わるたびに次の動画を再生するプログラムを作りたいと思います。 クリック用のボタンを用意して、一曲終わるごとに次を再生するのは出来ますが、ほおっておいても自動再生するとなると結構難しいように思います。動画の終わりを検知できれば簡単なような気がするのですが、 このために、動画が終わった時点で、その事実を検知するようなJavascript などの関数はありませんでしょうか? 詳しい方がいらっしゃいましたら、教えていただけると嬉しいです。

  • EMBEDタグ

    ストリーミング再生のために、EMBEDタグを使って動画を再生しているのですが、再生する動画に関して ひとつのEMBEDタグの中に多数のファイルのURLを入れて、順番に複数再生したり、動画がランダム再生されたりするようなタグはありませんか?

    • ベストアンサー
    • HTML
  • H.264の動画を携帯でストリーミング再生したいのですが、何をやっても

    H.264の動画を携帯でストリーミング再生したいのですが、何をやっても再生されません。 3gp動画でのストリーミング再生はストリーミングタグで再生できるのですが、画質の綺麗なH.264をできればタグでストリーミング再生させたいです。 ニコニコなどのwebサイト経由で再生するやり方や、ダウンロードして再生するやり方ではなく、H.264をストリーミングで再生するタグを教えてください。 お願いします。

  • HTML5のvideoタグ利用時の動画閲覧について

    LAMP環境を使用しております。 疑似ストリーミングのようなことを行いたいため、 WebサーバーにiPhoneで撮影した動画ファイル(movファイル)のアップロードを行い、 HTML(CGI)に、下記のようにvideoタグ <video src="http://www.xxx/xxxx/xxx.MOV" controls preload="none"/> を記述後、ブラウザでHTML(CGI)にアクセスし、動画を閲覧した時 パソコンでは、画面が途中で止まることなく、スムーズに再生できるのですが iPhoneでは、再生開始からすぐ(1~3秒後くらい)に画面が止まってしまいます。 その後再生が始まっても、またすぐに画面が止まってしまう状況です。 何か解決策はございますでしょうか。

  • ホームページで動画を置きたい

    私の個人ホームページで動画を置きたいのですが、 <EMBED SRC="abc.wmv" WIDTH="320" HEIGHT="285" AUTOSTART="true" REPEAT="true" LOOP="true"> のようにすると、ページを開いたら、なにもしないで見れるので、いいかなぁと思っているのですが、このタグだと、ストリーミング再生か、ダウンロードしてから再生されるかどちらなのですか? また、mp4ではこのタグはつかえますか? ステップサーバーというレンタルサーバーを使用しています。

  • 動画を最も簡単にwebサイトに貼るには(自サーバ内で)

    自身で運営するウェブサイトで動画を公開する必要があり、現在制作中です。 動画ファイル自体は用意してあり、現状はmpeg形式になっています。 (他の形式、たとえばaviやwmvに変換することは出来ています。) ネットで調べたりしつつ、現在は以下のように記述しているのですが、 <embed src="http://動画ファイルへのパス/ファイル名.mpg" playcount="0"> サイトを見る側の環境により、そもそも見られたり見られなかったり、 また見られても画面サイズがまちまちだったりということがわかりました。 希望としては 1.できるだけ見る側の環境に依存せず、多くの人が見られるようにしたい。 2.ページを最初に開いた状態では繰り返し再生されるように、ただし 繰り返し見たくない人のために停止させるボタン等もつけたい。 3.動画ファイルはウェブサイトのHTMLと同じサーバ内に置きたい。 と考えています。3の条件から、動画をyoutube等にアップして、 そこから転載するという方法は不可です。 以上のようなことを満たすために、最も適切な方法はどのようなもの があるのでしょうか。いろいろ調べましたが、どうも適切なものが 見当たらず困っています。詳しい方がいらっしゃいましたら、できれば ソース記述なども含めてお教えいただけませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • HTML