授業の資料に使う、ショート動画の切り抜きにffmpegを使ってみた
今回の要求の内容としては、
- フォルダ内の動画をまとめて変換
- 冒頭n秒をカットする
- 画面の上下n pxをクロップ
といった内容。
画面録画でUnityの作業動画動画を作ってもらったのだが、
メニューバーや、録画スタートのアニメーションがポイントで入ってしまっており、
それらを除去するためにffmpegを使った次第。
しかし、ひとつのファイルを処理するのではなく、フォルダ内の全てのファイルに処理をかけるということで、forの知識が必要に。
ここが一番手こずったという…
ひとまず参考にした記事は以下の内容。
【各要件参考記事】
カット
https://nico-lab.net/cutting_ffmpeg/
クロップ参考記事
https://w.atwiki.jp/kobapan/pages/173.html
冒頭n秒をカットする
録画スタートのアニメーションをカットするために、
冒頭から数秒をカットして書き出すという処理を最初に手をつけた。
これは、アニメーションをカットしてから作業を始めているという前提があったので、
一括で処理できた&助かった。
for var in `ls *.mp4`
do
ffmpeg -ss 00:00:06.50 -i $var -c copy re$var
done
時間の指定は、整数を渡してもいいのですが、6.5秒的な書き方はできないので、
小数点を使って秒指定をしたければ、hh:mm:ss
で書いてしまうのがベストかなと。
画面の上下n pxをクロップ
作成してもらった動画の上下に、メニューやヘッダーの情報が出てしまっていたので、それらをカットするために以下の処理を施しました。
for var in `ls *.mp4`
do
ffmpeg -i $var -vf crop=1280:645:0:36 re$var
done
書き方としては、左上から36px下がった位置から、1280:645のサイズで切り出してくれという指示になります。
元の画像は1280:720になりますので、ヘッダー分39pxは切り捨てた形になります。
作業時のコツ
指定位置をおおよそ決めてしまい、微調整を作業戻して繰り返すというのが手早かったです。
当たりをつけるためにおおよその数値で繰り返してもいいのですが、結構予想を反する数値になっているので、小さいところから細かく指定していくのが自分にはあってました。
あとは、まとめて複数ファイルでテストしていると時間がかかるので、必ずひとつのファイルでテストするようには気をつけたいところです(開始30分後で気づいた)