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

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

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

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

Q&A

解決済

1回答

2918閲覧

PHP:shell_exec()の使い方について

keita0236

総合スコア25

PHP

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

0グッド

1クリップ

投稿2017/02/15 13:46

こんばんは。
ffmpegという動画のエンコードを行うアプリケーションをサーバーに組み込んで
mov→mp4に動画をエンコーディングする処理を書いています。
その上で、以下の要件で、動画の変換を行い、サーバーに保存するイメージとなります。

<サーバーリレーション>
・動画を保存しているサーバーとffmpegがインストールされているサーバーが別々のサーバー
A→動画を保存するサーバー
B→ffmpegがインストールされている動画のエンコード処理をするサーバー

<処理フロー>
①ユーザーがmov形式の動画をアップロード
②PHPで構築したウェブアプリケーション上でPOSTされた動画をGETし、curlコマンドで動画をBサーバーに送る。
③Bサーバー上で動画を受け取ったら、それをffmpegでエンコードし
エンコードが終了したら変換されたmp4動画ファイルをAサーバーに保存する

現在、上記フローの②までは処理が実装できているのですが、詰まっているのが③の処理になります。
具体的には、動画の変換処理をffmpegにより行うため、shell_exec()を使用して変換処理を行っているのですが
その変換されたファイルデータの取得方法がわからず困っています。

PHP

1<?php 2//curlで送られてきた動画データと動画ファイル名を取得し、変数に格納する 3//$rawVideo = mov形式の動画、 $rawFileName = mov形式の動画のファイル名 4//以下がffmpegによるmov→mp4の動画エンコーディング処理です。この変換後のデータを取得したいです。 5shell_exec('ffmpeg -i '.$rawVideo.' -vcodec libx264 -vpre default '.$rawFileName.'.mp4'); 6 7//最後は、shell_execでmov→mp4に変換された動画ファイルをAサーバーに渡すため、このように出力させたいです 8echo $encodedVideo; 9 10?>

そもそものshell_exec()の使い方自体あまりわかっておりませんが、リファレンスをみると
返り値が文字列とのことみたいで、このようにメディアデータは返り値として帰ってこないのではないかと思います。
どなたか上記解決する方法をご存じの方いましたら、ぜひご教授頂きたく思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHPではなく ffmpeg の使い方の話ですが、$rawFileName.'.mp4' という名前のMPEG4ファイルができあがっているはずですので、それをサーバーAにFTPなりSCPなりで転送してあげればよいと思います。

もし、shell_exec() でエンコードされたMPEG4のバイナリデータを受け取りたいのであれば、ffmepg の pipe オプションを使ってエンコード結果を標準出力に出力させることで、データを直接受け取ることができます。

php

1shell_exec('ffmpeg -i '.$rawVideo.' -vcodec libx264 -vpre default -movflags frag_keyframe+empty_moov pipe:1');

投稿2017/02/15 14:17

編集2017/02/15 14:19
miyahan

総合スコア3095

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

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

keita0236

2017/02/15 15:20 編集

ご回答頂きありがとうございます。 上記記載されたコードはffmepgのpipeオプションによる方法かと存じます。 標準出力というのがイマイチぴんときていないのですが、特にechoなどを用いずともご記載頂いたコードを実行することで、このスクリプト内ではエンコードされたバイナリデータが出力されるので、そのデータを受け取って処理を続行させればいいという認識でよろしいでしょうか。 一方で、FTPまたはSCPで転送する方法を採用した場合ですが、 下記のコードでできあがった$rawFileName.'.mp4'のデータはどのようにして取得すればよろしいでしょうか?こちらはもしご存知の場合は、で結構です。 shell_exec('ffmpeg -i '.$rawVideo.' -vcodec libx264 -vpre default '.$rawFileName.'.mp4');
miyahan

2017/02/15 15:38

> そのデータを受け取って処理を続行させればいい その通りです。たとえば下記コードを実行すると、$mpeg_data にMPEG4ムービーのバイナリデータが格納されますので、それをファイルに書き込んであげればMPEG4ファイルができあがります。 ```php <?php $mpeg_data = shell_exec('ffmpeg -i original.mov -vcodec libx264 -f mp4 -movflags frag_keyframe+empty_moov pipe:1'); fwrite(fopen('encoded.mp4', 'wb'), $mpeg_data); ``` > `$rawFileName.'.mp4'` のデータはどのようにして取得 さまざまな方法が考えられます。サーバーの仕様や、現在作られているアプリの形態にあわせて検討してください。思いついたアイディアをいくつかあげてみます。 - 処理フロー②と同じ方法で、サーバーA にMPEG4ファイルを受け取るPHPスクリプトを置いて、サーバーBからファイルをサーバーAにアップロード(curlでPOST)する - サーバーA から サーバーBにあるMPEG4ファイルを file_get_contents() で取りに行く - サーバーB で shell_exec() を実行しファイル転送ツール(ftp, scp, rsync等)を起動してファイルをコピーさせる
keita0236

2017/02/16 09:13

ご丁寧にありがとうございます。 上記を参考にさせて頂き、実装していきたいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問