FFmpegだけでGoProやPS4の動画を編集してみた ## 動画を編集したい ### 動画をシェアしやすくなった 最近、Web上で動画をシェアする機会が増えてきました。数年前までInstagramも静止画がメインでした。それが、スマートフォンの性能向上やGoProのようなウェアラブルでタフなカメラの台頭、更に携帯電話網の広帯域化なんかも相まって、撮る・観る双方の環境が整ってきたように思います。 サービス面においても、TikTokの登場やInstagramの動画サポートといった、よりカジュアルにシェアできる環境が整っています。 ### 編集は相変わらず面倒 一方で、編集はどうでしょうか。大抵、撮った動画をそのままシェアすることはできません。iMovieは使いやすいですけど、たかだか15秒程度の動画を作るにはオーバースペックで面倒すぎます。PS4の SHAREfactory も同様です。こっちは動画の中から15秒選びたいだけなんだよ、みたいな。 ということで、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カード上から書き出してもよいわけです。 ## 切り出しポイントを把握する ![screenshot.png](https://image.docbase.io/uploads/f42f2a4a-3c96-4bf8-82c1-46117c4b7e1d.png =400x) 動画を再生してどのあたりから見せたいか探しましょう。Macの場合、FinderからQuickLookするなどして切り出し開始のタイミングを決めます。 ## 切り取る さて、いよいよ加工です。まずは単純に先頭を指定して、6秒分切り取ってみます。
$ ffmpeg -i GOPR0107.MP4 -ss 30 -to 6 -vcodec copy -acodec copy test01.mp4
-ss でスタート地点、 -t で尺をそれぞれ秒で指定します。 -ss は今回秒数で指定していますが、 hh:mm:ss 形式も使えます。また、キーフレームから指定したいだとか細かい内容については[ドキュメント](https://trac.ffmpeg.org/wiki/Seeking)を参照してください。 その後 -vcodec と -acodec で映像と音声の圧縮コーデックを指定します。再エンコードを避けたいので copy を指定しました。 なお、[HandBrake](https://handbrake.fr/)で作成した動画を上記の手順で切り取ると失敗することもあるようです。手元の環境に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の仕組みと書き方](http://www.geocities.co.jp/bancodesrt/tool/ass.html) を参考にしました。 ``` [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
結果、こうなりました。 ![sub.jpg](https://image.docbase.io/uploads/3959206d-3c41-404c-b409-be1af48d0638.jpg =400x) 見事字幕が合成されています。 ## PS4の動画も これまでご紹介した内容は、GoProで撮影したフルHD動画をサンプルにしていました。もちろん、そのようなデジカメだけではなくPS4に標準搭載された録画機能が吐き出すmp4ファイルにも対応可能です。解像度が 1280 x 720 なので、字幕を入れる際はASSファイルに記述する解像度を変えるくらいです。 ## ファイルの受け渡し スマートフォンアプリでシェアしたい場合に、端末へファイルを渡す方法です。 ### Android USBケーブルで接続すれば転送できます。 ### iOS MacからであればAirPlay、PCであればGoogleDriveなどのオンラインストレージ経由でいいでしょう。 ## ということで ffmpegによる動画の簡易編集、いかがでしたでしょうか。 いちいち編集ソフトを使わなくてもコマンドラインだけある程度のことができちゃいます。スクリプト化するなりして使い勝手を改善すれば十分実用になるんじゃないでしょうか。 ということで、本記事が快適な動画ライフの一助になれば幸いです。