前回は、Windows Media Encoderを使用してストリーミング配信を行いました。
今回は、ffmpegを使用した動画編集についてご紹介します。
前回まで、3回に分けてストリーミング配信に触れてきたのは
ある目的のために動画ストリーミングとはどういうものかということを事前に把握するためのものでした。
ある目的というのは、”スマートフォンで撮影している動画をOculusを使用してライブ視聴する”になります。
これまでの調査から、ライブ配信には大きく分けて下記の工程が必要だということがわかりました。
1.動画撮影
2.リアルタイムエンコード
3.ストリーミングサーバーによる動画配信
4.ストリーミング再生に対応した動画プレイヤーでの再生
上記工程をツールを使用して行っていたのが前回までの記事で、工程とツールでの処理を当てはめると次のようになります。
「PCに取り付けたカメラで動画を撮影し、Windows Media Encoderで同時にリアルタイムエンコードも行いながらサーバー(xampp)に保存。保存した動画をxmoovStreamでストリーミング配信を行い、組み込まれているプレイヤーで再生する」
これらをスマートフォンを使用して行う場合、1,2の工程に変更を加える必要があります。
Windows Media EncoderはWindows PC用のツールであり、android/iOSでは使用することが出来ないためです。
ほとんどのスマートフォンにはカメラが標準搭載されているため、動画撮影に関しては問題有りません。
次にリアルタイムエンコードで、エンコード処理とサーバーへのアップロードを行う機能を、スマートフォン上で動作する形で作成することも可能ですが、
動画のエンコードには大きな負荷がかかるため、スマートフォンのスペックでは処理遅延が発生する可能性があり、あまり現実的ではないと考えました。
その為、今回はスマートフォンでフレーム毎の画像を保存し、それらをアップロードした後、サーバー上で動画を生成する方法で
スマートフォン→サーバーの動画転送を行いたいと思います。
上記方法から、スマートフォンでのライブ配信時の工程は
これまで作成していたものから下記のように変更となります。
1.スマートフォンのカメラを通したプレビューをフレーム単位で画像保存
2.保存したフレーム画像をサーバーにアップロード
3.アップロードされたフレーム画像から、サーバー上で動画を作成
4.ストリーミングサーバーによる動画配信
5.ストリーミング再生に対応した動画プレイヤーでの再生
目的を達成するために、必要な作業が大分まとまってきました。
アップロード処理を作成するのも良いですが、受け取り口がないと確認もできないため
今回はこの中の内、3を先に作成しようと思います。
必要なものは、サーバー環境とffmpegというツールです。
ffmpegはとても有名なツールなので、インストール方法は省略します。
サーバー環境は、Linuxを使用しました。
※xamppでも可能です
簡単なアップロード用のファイルを作成します。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>upload test</title> </head> <body> <form action="http://localhost/snakey/index.php" method="post" enctype="multipart/form-data"> <input type="file" name="postfile"><br> <input type="submit" value="送信"> </form> </body> </html>
<?php if (is_uploaded_file($_FILES["postfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["postfile"]["tmp_name"], "/var/www/html/snakey/uploads/" . $_FILES["postfile"]["name"])) { echo "File uploaded successfully"; } } ?>
これらのファイルをサーバーの公開ディレクトリに置き、index.htmlにアクセスすると、ファイルのアップロード確認が行えます。
実際には、php側はもっと詳細な判定処理を入れる必要がありますが、今回の場合は、スマホでのライブ配信という目的を達成するためなので、必ずファイルが添付されてきていること前提としてこのまま進めます。
次にアップロードされた画像での動画作成です。
アップロードのたびにエンコード処理を実行していては、かなりの負荷がかかってしまうため、
実際にどのタイミングで行うかはまだわかっていませんが、画像アップロード終了後、何らかの条件を満たした場合にエンコード処理を実行することになるのではと考えています。
ffmpegはコマンドを使用して各種処理を実行するため、動画生成処理はphpから実行することにします。
//exec関数を使用すると、引数で渡したコマンドをphpから実行することが出来ます。 exec('ffmpeg -r 15 -i /var/www/html/uploads/%02d.png /var/www/html/uploads/video.mp4');
ffmpegのコマンドは調べるとすぐに出てくるため、詳しい説明は省略しますが、
上記コマンドは、/var/www/html/uploads直下にある2桁の連番画像を使用して、同ディレクトリにvideo.mp4という動画ファイルを生成しています。
-r 15 と指定をしているため、フレームレートは15fpsです。
“画像アップロード終了後、何らかの条件を満たした場合”について
仮に画像が15枚アップロードされるたびに動画生成を行う場合は、下記のようになるのかなと一人で妄想しています。
<?php //アップロード画像の保存処理 //実際はもっと詳細な判定を行う必要がある if (is_uploaded_file($_FILES["postfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["postfile"]["tmp_name"], "/var/www/html/snakey/uploads/" . $_FILES["postfile"]["name"])) { echo "File uploaded successfully"; } } //何かしらの条件(仮に15枚アップロード毎) $num = intval(str_replace($_FILES["postfile"]["name"], ".png", "")); if (num == 15) { //動画生成 exec('ffmpeg -r 15 -i /var/www/html/uploads/%02d.png /var/www/html/uploads/video.mp4'); } ?>
このような条件は、実際の処理速度とかを加味して行うチューニングの部分かなと思っているので、今は深く考えないようにします。
今後の作業の中で、今回の内容が全然使えなくなる可能性も大いにあり得るため、今は、目的を達成するために必要な工程を順番に終わらせることが重要ですね。
スマホでのフレームアップロード処理をどう行うかも全然検討が付いておらず、まだまだ問題は山済みですが、ライブ配信達成のために引き続きいろいろなことを試してみようと思います。
以上で、ffmpegを使用した動画編集の紹介は終了となります。
最後までご覧いただきありがとうございました。
■今回使用した画像
■出来上がった動画
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。