🍿
Macで動画ファイルを右クリック→2倍速に変換する(ffmpeg と Automatorを使って)
「画面を収録」で出来た.movファイルをシェアするために、小さく・速くしたい。しかも1クリックで。
という願いを叶えるべく一念発起した覚書きです。
結果はこんな感じ
Unsplashのアプリを紹介するようすを画面収録した動画、
アフターとビフォー。
用意するもの
- ffmpeg(homebrewでMacにインストール)
- Automator(Macのどこかに入ってます)
- 適当な.movファイル(動画ならなんでも)
ffmpegのインストール
homebrewでやるのが簡単でした。
Automatorの内容
こんな感じです。
- Automatorでクイックアクションを作成。
- 変数(テキスト)を2つ用意。スクショ内では
movieName
とmoviePath
を用意。 - 以下のアクションを
movieName
とmoviePath
用にそれぞれ追加。 選択されたファイル項目を取得
変数の値を取得
シェルスクリプトを実行
変数の値を設定
- これらの変数の値を最後のシェルスクリプトに突っ込む。
- シェルスクリプトでffmpegを走らせる。(サンプルコードは下を見てね)
- 処理に少し時間がかかるので終了を知らせる通知音のシェルスクリプトもおまけで。
Automatorのシェルスクリプト
パスを取り出す
echo $1
ファイル名を取り出す
basename "$@"
変数使って動画の処理
- PATHはhomebrewをインストールしてるディレクトリにパスを通しています。
-
echo
は開発時の確認用です🤤この時$1
で ファイル名、$2
でパスが呼ばれてます。 -
-filter:v
は動画用のフィルター。いろんなオプション指定しています。setpts
で動画を1.25倍速、scale
で1280px幅に縮小。minterpolate
でなんかええ感じに滑らかにしてるっぽいです()。 -
-filter:a
は音声用のフィルター。atempo
オプションで1.25倍速にしています。 -
-y
で同じファイル名があったら上書き。
PATH="$PATH:/opt/homebrew/bin"
echo $1 ----- $2
ffmpeg -i "$2" -r 16 -filter:v "setpts=0.8*PTS,scale=1280:-2,minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" -filter:a "atempo=1.25" -y "$1.mp4"
通知音を鳴らす
シェルスクリプト内に以下を書けばOKです。AppleScriptだともっと色々出来そう。アラートとか。
音は他にもあるので見てみてください。
afplay /System/Library/Sounds/Glass.aiff
おまけ: 変数使って動画の処理(gifアニメにする)
ファイル名やパスはよしなに。
なお webp や apng という選択肢もありましたが、両方ともSlackやローカルでプレビューされないのと、apngについてはめちゃ重いので諦めました🥺
環境さえ合えばwebpアニメが最高でした。
しかしながらここは伝統と格式のgifアニメで行きます。
シンプルな設定の場合
scale
で 1/3サイズを指定→3.5MB。
scale
で 1/4サイズを指定→14.5MB。
…あれ??🤔
どうも小さければ良いってもんじゃ無いようです。奥が深い〜
ffmpeg -i /Users/bissy/input.mov -filter:v "setpts=0.5*PTS,fps=10,scale=iw/4:-1" -y output-simple.gif
ちょっと重いけどいい感じ
scale
で 1/4サイズを指定→2.8MB。
palettegen
を使うことで色が最適化されて見やすくなります!
Zennは3MBより大きいファイルはアップできないんですが、2.8MBになったのでアップしてみました👏
「ここをこうするとこんなエラーが出るんですが〜」という連絡にはこれで十分ですね。
ffmpeg -i /Users/bissy/input.mov -filter_complex "[0:v]setpts=0.5*PTS,fps=10,scale=iw/4:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse=dither=none" -y output.gif
────
ではみなさん良きMacライフを〜👋
参考資料
みなさまありがとうございました🙇♀️🫶
Automator/シェルスクリプトについて
Automatorには比較的慣れてたものの、シェルスクリプトは初めてで変数の取り扱いがよくわからなかったのでとても勉強になりました。
- Automatorを使って、PDFをpngに変換してPDFファイルと同名のディレクトリに置く
- シェルスクリプトの特殊変数
*の違い@と - ターミナルで処理が終わった際に通知や音を鳴らす
- Shell Script Basics(Apple公式)
Discussion