• ベストアンサー

echo 文字列をクリック

下記のようにして <?php // ファイル名一覧を取得 $dir = "./record/"; if (is_dir($dir)){ if ($dh = opendir($dir)){ while (($file = readdir($dh)) !== false){ echo $file ; echo "<br/>\n"; } closedir($dh); } } ?> 結果出力例 . A241002_061054_061108.265 A241002_061024_061038.265 A241002_073012_073026.265 A241002_025516_025530.265 .. のように動画ファイル名一覧を出力させます。 このファイル名をクリックしたら動画を見れるようにすることはできないでしょうか ご教授下さい。

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

  • ベストアンサー
  • 4017B
  • ベストアンサー率73% (1336/1814)
回答No.4

コード例として提示した記述の中に誤りがありました。 誤: echo '<p><a href="', $my_dir, $path, '">', $fname, '</a></p>',"\n"; 正: echo '<p><a href="', $my_dir, $fname, '">', $fname, '</a></p>',"\n"; ~以上、訂正してお詫び申し上げます。変数名の間違いですね。この場合の $path は定義されていない変数なので、このまま実行してもファイルへのリンクが親フォルダの部分で止まってしまい、その次のファイル名が追記されずに空欄になってしまいます。そのため「ファイルが見つかりません」となってしまっているのだと思います。回答前の推敲チェックが不足しておりました。重ねてお詫び申し上げます。 >"*.265" と "*.mp4" の違い 違いますね。 ただ単に拡張子を「名前の変更」で書き換えても、それは日本の国産車にフェラーリのエンブレムを貼り付ける様なもので、別に中身は変わらずそのままの国産車です。なので拡張子が "*.265" のファイルは通常、生の「x265動画形式でエンコードされた動画のみのファイル」を表しており、"*.mp4" のファイルは「動画コンテナのフォーマット形式がMP4規格に則ってコンテナ化された動画と音声などが1つにパッケージされた一種の圧縮ファイル」を表しています。 従って "*.265" のファイルをただ単に "*.mp4" と名前(拡張子)を書き換えただけでは、ファイルの中身(本質)は何も変化しておらず、返って混乱を招く結果となるので。ファイル操作、及びそのファイルの種類や特性に熟知していない人が、ファイル名~特に拡張子を勝手に自己流で書き換える事は厳に避けるべきです。 しかし前述した通り、通常であれば "*.265" のファイルを拡張子を書き換えたくらいでブラウザ上で再生などはできないはずなので…逆にお使いの監視カメラで生成されたその動画ファイル、拡張子の設定が間違っていて、実はx264形式で録画している可能性もありますね。5千円くらいの廉価版監視カメラだと、同じ会社の系列製品で駆動ソフトを使い回している可能性が高いので、実際に書き出しているファイル形式とソフト側での命名規則が合致してないのかも…? 動画ファイルをソフトウェア上で色々と扱って処理作業などを行う場合、兎にも角にもその動画エンコード形式が正確に確定していないと話にならないので。今一度、お使いの監視カメラの説明書などを読み返して、どういった形式で動画ファイルを録画保存しているか再確認して方が良いかと。 あと出来れば、実際にFTP経由で保存されている実際の動画ファイルを、以下の「ファイル解析ソフト」で調べて正確にファイル形式等を把握して置いた方が良いかと思います。 - "MediaInfo": https://mediaarea.net/ja/MediaInfo - "窓の杜 - MediaInfo": https://forest.watch.impress.co.jp/library/software/mediainfo/ - "使い方": https://www.gigafree.net/media/mediainfo.html これは自分も使ってるソフトで、"MediaInfo" は無料のフリーソフトとしては最強クラスのファイル解析ソフトです。すごく軽くて使いやすく、無駄な機能が一切無いので、IT技術職の人だったら必ずインストールしてると言っても過言ではないくらい、使ってる人も多い定番ソフトですので。気が向いたら試してみてください。

round12345
質問者

お礼

ありがとうございます。 mp4 ファイルは単に拡張子を変えただけではなく.265→.mp4 変換バッチファイルで変換したもので試行しております。 さて、訂正しましたが mp4 は正常、.265 はダウンロードされるだけでした。

その他の回答 (3)

  • retorofan
  • ベストアンサー率34% (435/1276)
回答No.3

MySQLを使った例を挙げておきます。 【SQL】 CREATE TABLE videos ( id INT AUTO_INCREMENT PRIMARY KEY, filename VARCHAR(255) NOT NULL, filepath VARCHAR(255) NOT NULL ); 【PHP】 <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "your_db_name"; // データベース接続 $conn = new mysqli($servername, $username, $password, $dbname); // 接続確認 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT filename, filepath FROM videos"; $result = $conn->query($sql); if ($result->num_rows > 0) { // データを出力 while($row = $result->fetch_assoc()) { echo '<a href="' . $row["filepath"] . '">' . $row["filename"] . '</a>'; echo "<br/>\n"; } } else { echo "0 results"; } $conn->close(); ?> このファイル名をクリックしたら動画を見れるようにできます。 お好みに合わせてカスタマイズすることもできます!

round12345
質問者

お礼

ありがとうございます。この動画は監視カメラから検知映像として自動保存される動画ですがデータベース利用するのですね 勉強になります。時間がかかるとは思いますが試してみたいと思います。

round12345
質問者

補足

残念なり カメラの機能にDBにアップロードする機能が無いので諦め です。(普通のFTP機能のみでした)

  • 4017B
  • ベストアンサー率73% (1336/1814)
回答No.2

やるんでしたら、こんな感じでしょうか…? <?php $my_dir = '/foo/my-videos/'; //使用者の環境に合わせて最適化. if ( is_dir($my_dir) ) { $my_files = array_diff( scandir($my_dir), array('.','..') ); $my_dir = rtrim( $my_dir, '/' ) .'/'; foreach ($my_files as $fname) { echo '<p><a href="', $my_dir, $path, '">', $fname, '</a></p>',"\n"; } } else { echo '<p>Error: "', $my_dir, '"</p>',"\n",'<p>this is not a directory.</p>',"\n"; } 既に他の方が回答なされてますが。ブラウザ上で再生できる動画ファイルには幾つかの制限があり、またその制限事項なども使用者のブラウザの種類で異なります。なので抽出し生成表示されたリンク先が正しいモノであっても、必ずしも質問者のお使いのブラウザ上で子弟された動画ファイルが正常に再生される事を担保する訳ではありません。 とりあえず質問者自身の普段使いのブラウザで、[Ctrl+N] などで新規の空ウィンドを開き、そこに動画ファイルをマウスで直にドラッグ&ドロップしてみてください。そのブラウザで再生可能な動画形式であれば、それですぐに動画の再生が始まります。何も起きない、或いは音だけして画面(ウィンドウ内)は真っ黒のままだった場合、そのブラウザでは再生に対応していない動画形式となります。 最新のChromeとかでしたら、出回っているほぼ全ての動画コーデックと動画コンテナ形式に対応してますので、ほとんど問題無くどんな動画でもそのまま再生可能ですが…。唯一、HEVC形式、つまり "x265/h265" には非対応です。これは性能の問題では無く、HEVC形式の動画コーデックの著作権に関する問題であり、基本的にはChrome以外のブラウザでも非対応です。 もしも質問者がwebページ上に表示させたリンクをクリックして、そこから直に "Windows Media Player" のような動画再生ソフトを起動実行させようと思っているのであれば、それは不可能です。現在のブラウザでは、ChromeもFireFoxもEdgeも全て、セキュリティ上の禁止項目制限でブラウザから直に他にソフトを起動させたり出来ないようになっています。無理矢理、色々と裏技を使えば出来なくはないですが…まあやらない方が無難です。 P.S. PHPで繰り返し処理させるのであれば、何か明確に目的があってするのでなければ、通常は全て foreach関数 で処理した方が無難かつ高速です。特に foreach は代入された配列の要素が無くなれば自動的に処理を停止させ、次へ移行させますので、初学者ハマりがちな無限ループをシステム的に回避できる利点があります。 また echo関数 はPHPで非常に頻出しますが。その際に文字列指定の括弧は "" では無く '' を用いた方が良いです。何故なら通常、PHPはHTML生成表示と連携させて用いるのが常であるため。この時、HTML内部の記述に "" は頻出記号となるため、これをいちいちエスケープ処理させて記述するのは非常に面倒かつバグの遠因となります。 だったら最初から '' のみで記述するとして置いた方が何か都合が良いです。あと実行処理も '' の方が速くなります。 また上記サンプルコードでは入力された文字列が常に正しく、また中身が空っぽの場合なども想定していないため、かなり不完全なコードです。通常、このような処理を行う場合。単純にファイル一覧を抽出するだけではダメで、そこからさらに1つ1つを解析してフォルダが入れ子になっていないか、想定外のファイル~例えばPDFとかTXTなどと言った別種ファイルを除外する等の処理を追加する事が必須となります。 最終的に何らかのwebページ上で稼働させる場合には、その辺も考慮して二重三重に安全策を掛けて置くのが肝要となります(現状、この程度の処理であれば「空白のページ」が表示されるだけで実害はありませんが…)。

round12345
質問者

お礼

ありがとうございます。監視カメラからの検知映像を一定期間保存して自分が簡単に確認できるようにしたく質問した所存なので一般公開はしません。 また、構文の注意点等教えて頂きありがとうございます。結果は後程、気長になるとは思いますが。。。。

round12345
質問者

補足

試行してみました。chrome の空ウインドで .265 をドロップしても変化無しなので .mp4 でやったら開きました。 それではと、ご提示のスプリクトをmp4 デレクトリで試行してみるとリンク下線が出てクリック出来ましたが ファイルが見つかりません になってしまいました。 .265 と .mp4 では違うのでしょうか?? 難しいですね

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

ファイル名の部分をクリックできるようにするには、while文のところを下記のように変更して、<a href=...></a>タグをつけます。試していないので書き間違いがあるかもしれません。 while (($file = readdir($dh)) !== false){ echo "<a href=\"{$dir}/{$file}\">{$file}</a>"; echo "<br/>\n"; } ただし、クリックしても動画を開いて見られるかどうかは別問題です。 拡張子が.265になっているのでH.265形式の動画ファイルではないかと推測しますが、そのままではウェブブラウザーで開けない可能性があります。その場合は、ウェブブラウザーが対応している形式に動画ファイルを事前に変換しておく必要があります。

round12345
質問者

お礼

ありがとうございます。 試行してみます。この動画は監視カメラからサーバーにFTPされた検知映像なので自分のPCにダウンロードしエクスプローラから確認しているのですが手間を省きたいと思った所存です。試行してみます。

round12345
質問者

補足

試行してみました。chrome で .265 の場合は クリックしてもダウンロードするだけでした。そこで、バッチファイルで .mp4 変換して以下にて試行。 <?php // ファイル名一覧から動画を見る // ファイルの有無を知る $dir = './record/'; // 結果を入れる為の配列 $result = array(); // linuxコマンド $command = "find " . $dir . " -name '*.mp4' | wc -l"; // コマンド実行 exec($command, $result); echo 'ファイルの数は '.$result[0].'個あります。'; echo "<br/>\n"; // 数を代入 $ph = $result[0]; if ($ph > 0) { goto koko; // ファイルが有ったら koko: に移動 } else { echo "<br/>\n"; echo ' 終了します。'; exit; // ファイルが無かったら終了 } koko: if (is_dir($dir)){ if ($dh = opendir($dir)){ while (($file = readdir($dh)) !== false){ echo "<a href=\"{$dir}/{$file}\">{$file}</a>"; echo "<br/>\n"; } closedir($dh); } } ?> 試行結果 ファイルの数は 18個あります。A241020_074632_074646.mp4 A240916_061711_061725.mp4 . A241020_075252_075306.mp4 A240916_061631_061645.mp4 A241002_061054_061108.mp4 A241002_061024_061038.mp4 A241020_074607_074621.mp4 A241020_074757_074811.mp4 A240916_014228_014242.mp4 A241020_075210_075224.mp4 A241020_074851_074905.mp4 A241002_025516_025530.mp4 A241020_074907_074921.mp4 A241002_073012_073026.mp4 A240916_044528_044542.mp4 A240916_045036_045050.mp4 .. A241020_074654_074708.mp4 A241020_015102_015116.mp4 このように出力されクリックで動画開始出来ました。 .265 は非対応のようですね。

関連するQ&A