FFmpegだけでGoProやPS4の動画を編集してみた このエントリをはてなブックマークに登録

2014年10月17日

ishizimaishizima

動画を編集したい

動画をシェアしやすくなった

最近、Web上で動画をシェアする機会が増えたように感じます。少し前までInstagramやFlickrなど、静止画がメインでした。それが、スマートフォンの性能向上やGoProのようなウェアラブルでタフなカメラの台頭、更に携帯電話網の広帯域化なんかも相まって、撮る・観る双方の環境が整ってきたように思います。
サービス面においても、Vineの登場やInstagramの動画サポートといった、よりカジュアルにシェアできる環境が整っています。

編集は相変わらず面倒

一方で、編集はどうでしょうか。大抵、撮った動画をそのままシェアすることはできません。iMovieは使いやすいですけど、たかだか15秒程度の動画を作るにはオーバースペックで面倒すぎます。PS4の SHAREfactory も同様です。こっちは動画の中から15秒選びたいだけなんだよ、みたいな。かといって、例えばInstagramでデジカメの長尺動画を直接開くとサイズを理由に拒否されました。
ということで、FFmpegを使って動画編集にチャレンジしてみたいと思います。編集って書いてますけど、切り貼りとキャプション合成くらいです。それでいいんです。SNSにポイっとシェアしたいだけですから。

FFmpegのインストール

お使いのOS環境に合わせてインストールしてください。↓はMacのHomebrewで字幕合成用オプション –with-freetype を付けてます。

$ brew install ffmpeg --with-freetype

動画を用意する

サンプルとしてタイトル通りPS4の標準機能で録画した動画とGoProで撮影した動画を用意します。
※GoProは1080p、29.97fpsで撮影、PS4はリネームだけ

$ ls -lh
total 4931680
-rwxr-xr-x  1 ishizima  staff   873M  9  9 19:05 D3RoS.mp4
-rwx------  1 ishizima  staff   1.5G  9  9 18:50 GOPR0107.MP4

はい、大きいですね。日常的に動画を編集する人からすれば小さい部類かもしれませんが、ちょっとシェアしたいだけの素人を威圧するには十分なファイルサイズです。これを編集する場合、iMovieなどではいちいちSSDなりHDDなりにコピーされて苦しいことになりますが、ffmpegなら直接SDカード上から書き出してもよいわけです。

切り出しポイントを把握する

スクリーンショット
動画を再生してどのあたりから見せたいか探しましょう。Macの場合、FinderからQuickLookするなどして切り出し開始のタイミングを決めます。

切り取る

さて、いよいよ加工です。まずは単純に先頭を指定して、VINEに合わせて6秒分切り取ってみます。

$ ffmpeg -i GOPR0107.MP4 -ss 30 -t 6 -vcodec copy -acodec copy test01.mp4

-ss でスタート地点、 -t で尺をそれぞれ秒で指定します。 -ss は今回秒数で指定していますが、 hh:mm:ss 形式も使えます。また、キーフレームから指定したいだとか細かい内容についてはドキュメントを参照してください。

その後 -vcodec と -acodec で映像と音声の圧縮コーデックを指定します。再エンコードを避けたいので copy を指定しましたが、メタデータの major_brand が avc1 から isom になっていたり再エンコードされてるかもしれません。この辺あまり詳しくないのでよく分かってないです。( サンプルが暗い映像ということもあって、肉眼で見比べても差が分かりませんでした… )

なお、HandBrakeで作成した動画を上記の手順で切り取ると失敗することもあるようです。手元の環境にHandBrakeを入れていないので具体的な設定値など確認できていませんが、ご注意ください。

切り取った複数の動画を無劣化で結合する

複数箇所を繋げたい場合です。まず、先ほどの方法で幾つか mp4 ファイルを切り出します。(ここでは仮に test01.mp4、 test02.mp4 の2つとします)

コンテナを変更してから結合

ffmpegではMPEG4コンテナのまま再エンコードなしの結合ができません。
なので、一旦コンテナをストリーム形式に変更して結合し、再度コンテナを戻すという手順を踏みます。

$ ffmpeg -i test01.mp4 -vcodec copy -acodec copy -bsf:v h264_mp4toannexb test01.ts # 再エンコードせずTSに変換
$ ffmpeg -i test02.mp4 -vcodec copy -acodec copy -bsf:v h264_mp4toannexb test02.ts
$ cat test02.ts >> test01.ts # test01.ts の後ろに test02.ts を結合

ts形式にしたのをcatで繋いでるだけですので、ファイルが3つでも4つでも好きなだけくっつけられます。次は結合した test01.ts をMPEG4コンテナに戻します。

$ ffmpeg -i test01.ts -vcodec copy -acodec copy -bsf:a aac_adtstoasc test.mp4 # test.mp4 としてmp4ファイルを出力

これでできあがり。

キャプションを入れる

さて、公開するにあたって字幕など何かしらキャプションを合成したいってこともあるでしょう。SNS上でも再現されるよう、直接動画に埋め込んでみます。

字幕の準備

フォント設定

まずフォントの設定ファイルを作ります。適当なディレクトリに以下の内容で fonts.conf を作成してください。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/System/Library/Fonts</dir>
    <dir>/Library/Fonts</dir>
    <dir>~/Library/Fonts</dir>
</fontconfig>

.confという拡張子ですがXMLですね、これ。次にFONTCONFIG_PATHにfonts.confの場所を指定します。
$ export FONTCONFIG_PATH=/path/to/fonts.conf

字幕情報の準備

ffmpegはASSと呼ばれる形式の字幕データを参照します。従って、ASSファイルを用意しなければなりません。私もよく知らなかったので、ASSの仕組みと書き方 を参考にしました。

[Script Info]
Title: test ass
Synch Point: 2
ScriptType: v4.00+
Collisions: Normal
ScaledBorderAndShadow: No
PlayResX: 1920
PlayResY: 1080
Timer: 3.000
WrapStyle: 0

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,MS Gothic,24,&H00f8ffff,&H0000ffff,&H00000000,&H80000000,-1,-1,0,0,200,200,0,0.00,1,2,3,2,20,20,40,128

[Events]
Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:10.00,Default,,0000,0000,0000,,テスト

字幕を適用する

上記のASSを testsub.ass として保存して、 test_sub.mp4 を出力します。


$ ffmpeg -i test.mp4 -preset slow -crf 18 -filter:v "ass=testsub.ass" -c:a copy -f mp4  test_sub.mp4

結果、こうなりました。
字幕合成結果
見事字幕が合成されています。

PS4の動画も

これまでご紹介した内容は、GoProで撮影したフルHD動画をサンプルにしていました。もちろん、そのようなデジカメだけではなくPS4に標準搭載された録画機能が吐き出すmp4ファイルにも対応可能です。解像度が 1280 x 720 なので、字幕を入れる際はASSファイルに記述する解像度を変えるくらいです。
話がそれるんですが、問題は速いUSB3.0メモリを用意してもPS4からの書き出しがすごく遅いこと。直接PS4からシェアする前提なんだと思いますが……、どうも SHAREfactory に馴染めなかったので。バックグラウンド書き出しなどサポートしてくれると嬉しいんですけどね。

ファイルの受け渡し

スマートフォンアプリでシェアしたい場合に、端末へファイルを渡す方法です。

Android

ケーブル繋いでコピればOKです。

iOS

YosemiteとiOS8であればAirDropが使えるそうですが、そうでなければDropBox経由など工夫が要ります。CIFSやAFPを話せるアプリがあれば、それを利用できるかもしれません。

ということで

ffmpegによる動画の簡易編集、いかがでしたでしょうか。
いちいち編集ソフトを使わなくてもコマンドラインだけある程度のことができちゃいます。スクリプト化するなりして使い勝手を改善すれば十分実用になるんじゃないでしょうか。
ということで、本記事が快適な動画ライフの一助になれば幸いです。

関連記事

クレイについてもっと知りたい方は…

  1. クレイの3つの強みを見てみる。
  2. WEBシステムのことなら何でもご相談ください。

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント

コメントはまだありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


トラックバック

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ