📽️

ffmpegで動画を切り抜く

2022/12/30に公開

まえおき

現在まちづくりエージェント SIDE BEACH CITY.では、毎月放送しているSBC.オープンマイクのダイジェスト動画を作成しています。
https://www.tiktok.com/@sbc.yokohama
この動画は基本的に放送したオープンマイクの内容をチェックして、その中からいくつかクリップを作成。
そこからさらに絞り込んだものをいくつかの動画に切り分け、PowerPointで組み合わせて一つの動画に仕上げています。
本当はクリップ機能を使った作業はしなくてもいいんですが、クリップ自体を作るごとにTwitterに共有することで、多少は宣伝効果になるだろうということと、クリップづくりと動画作成を作業分担可能にするためということで、一応別々にしました。
この辺の作業工程についてはまだ試行錯誤中であり、今後変わっていく可能性があります。

PowerPointには実はプレゼンテーションを全て動画として出力するという機能があります。
あらかじめ全てのアニメーションを自動的に動作するようにして、スライドの切り替えも時間をあらかじめ指定しておくことで簡単に動画を作ることができます。

ただこれで切り抜き動画を簡単に作れるかというと、残念ながらそうではなく。
PowerPointのトリム機能を使って範囲指定をした動画を複数使ったスライドを使うと、スライドの画面切り替え機能が汚くなってしまうという問題があります(2022/12/30現在)。

あらかじめカットした動画を使えば良いのでは?

そういうわけで、あらかじめffmpegを使って動画を適切な大きさにカットするというプログラムを作ろうということになりました。
ffmpegはさまざまな動画に対する処理を行えるコマンドラインツールで、再生速度を変更したり、動画をカットしたりといったことが簡単にできます。
https://ffmpeg.org/
ただ、このコマンドはなかなかに複雑。

いろいろなところに記事はありますが、正直全部覚えるというのはとても困難です。なのでよく使う処理は、PowerShellのスクリプトに変えてしまうのが便利です。

さて(ようやく)本題

ffmpegの機能を使って動画をカットするスクリプトを作成しました。
今回の用途だと、あらかじめ一つの動画からいろんな部分を切り抜いて、4個ぐらいの動画を作らなければいけないみたいなケースが結構あるので、一回のコマンドで何個かの動画を作成するようにしてあります。
https://gist.github.com/TakamiChie/ee761c6dd8c7b427914073f1098ed1fc

使いかたは簡単で、これらを頻繁に使うファイルなりモジュールファイルなりに追記、movcutsコマンドに秒数を指定して動画切り抜きを行います。
たとえばmovcuts 20:10,40:10,50:10 -source [filename]というコマンドを実行すると、動画の20秒目から10秒、40名秒目から10秒、50秒目から10秒という3つの動画を作成します。

どうなっているのか?

基本的には参照記事のワンライナーを呼んでるだけなんですが、開始秒数の指定と長さの指定はセットになりますので、一つの文字列として設定できるようにしました。
そして文字列をいくつか配列として書くことで、複数の動画を作成できるようにしてあります。
一回のコマンドで複数の動画ができますので、履歴から少しずつ位置をずらして再生成などという処理がやりやすいという利点があります。
なお参照記事ではcopyオプションを設定しているので速度が速いですが、PowerPointでは残念ながら、これで切り抜いた動画はうまく読み込まれません(一見正常に読み込まれたように見えますが、出力時に再生位置がずれてしまいます)。copyオプションはつけないで使用しましょう。
どちらにしろ10秒程度だったら大して出力に時間もかかりませんしね。

参照記事

Discussion