どうも、つよぽん(@tsuyopon_xyz)です!
今回の記事の内容は、動画編集の「ジャンプカット(別名 : ジェットカット)」をNode.jsを使って自動化する方法を解説します。
目次
この記事を読んでわかるようこと
今回の記事では主に以下の2つを話していきます。
- 今回紹介するジャンプカットツールの効果
- Node.jsを使った動画編集のジャンプカットツールの実装方法
自動ジャンプカット(ジェットカット)前と後の違い
まずは自動ジャンプカットする前の動画の様子から観ていきます。
以下の動画では間を開けるようにしゃべっています。
次に、自動ジャンプカットした動画を観ていきましょう。
以下の動画は先ほどの動画を、今回作成した自動ジャンプカットプログラムを用いて空白部分をカットしたものになります。
それぞれの動画を比較してみると、いい感じにカットできているのがわかるかと思います。
自動ジャンプカット(ジェットカット)のサンプルコード
今回作成したコードは以下のGitHubレポジトリにアップしているので、
「コードを見てみたい!」
という方は、以下リンクからご確認いただけたらと思います。
https://github.com/tsuyopon-xyz/jetcut-tool
ここからは、サンプルコードないの肝となる部分を説明していきます。
Node.jsからffmpegを使う
今回作ったジャンプカットツールはTypeScriptで作成してNode.js上で実行して動かします。
サンプルコードの「package.json」の中を観ていただくとわかりますが、今回のジャンプカットの実現には「fluent-ffmpeg」というライブラリを使っています。
この「fluent-ffmpeg」は「ffmpeg」という「動画や音声を編集できるツール」を内部で利用するので、まずは自分のパソコン「ffmpeg」のインストールをする必要があります。
「fluent-ffmpeg」のGitHubレポジトリの最初の方にも以下のような英文が書かれています。
make sure you have ffmpeg installed on your system (including all necessary encoding libraries like libmp3lame or libx264).
無音の検出にはffmpegの「silencedetect」を使う
サンプルコードで言うと「detectSilenceTime関数(67-107行目)」で無音箇所の検出を行なっています。
その中でも、音声ファイル・動画ファイルの無音の検出にはffmpegの「silencedetect」を使います。
この「silencedetect」を使うことで以下のことがわかります。
- 無音箇所の開始秒数
- 無音箇所の終了秒数
- 無音箇所の期間(何秒間無音だったか)
今回は「Remove the Silent Parts of a Video Using FFmpeg and Python」という記事を参考に「②無音箇所の終了秒数(silenceEnd)」「③無音箇所の期間(silenceDuration)」を使うことにしました。
この2つさえ持っていれば、「②無音箇所の終了秒数(silenceEnd)」から「③無音箇所の期間(silenceDuration)」を引き算して「①無音箇所の開始秒数」を計算で出すことができます。
cutSilence関数で動画のカットとカットした動画の結合を行なっている
前置きとして、
本来であれば「動画のカット部分」「カットした動画の結合部分」はそれぞれ異なる役割となるので、別の関数として用意してあげた方が好ましいですが、「自分しか使わないし、コードのメンテナンスもしないからやっつけ実装で良いや」とサボってしまいました…
(目を瞑ってもらえたら幸いです^^;)
話を戻して、この「cutSilence関数」のforループの中で、先ほどのdetectSilenceTime関数で取得した無音箇所の秒数リストを使って、動画をカットして、複数の動画として書き出しています。
その後、46-60行目あたりで、カットした動画を結合して新たな1つの動画として作成しています。
その結合した動画がまさに最初の方でも共有した以下の動画となります。
さいごに
今回のサンプルコードは1ファイルのみで、約100行くらいのコードとなるので、文章で説明するよりも、サンプルコード(main.ts)を読んだ方が理解が早いかなと思います。
もし「プログラムを使って動画編集を自動化したい」という方がいらっしゃれば、今回の記事が少しでも参考になれば幸いです。