Macで画面収録したデータを圧縮(軽量化)する

TL;DR

こんなシェルでやってます

#! /bin/zsh

INPUT_FILEPATH=$1
OUTPUT_FILEPATH=$2

CRF=$3
SCALING_FACTOR=$4

if [ $# -ne 4 ]; then
    echo "引数は4つ指定してください(input_path, output_path, crf, scaling_factor)"
fi

ffmpeg -i ${INPUT_FILEPATH} -crf ${CRF} -vf "scale=trunc(iw*${SCALING_FACTOR}/2)*2:trunc(ih*${SCALING_FACTOR}/2)*2" ${OUTPUT_FILEPATH}

呼び出す時は ./scripts/ffmpeg.sh 画面収録xxxx.mov out.mp4 30 0.5 とか。

これは何

Macの標準で付属している画面キャプチャ(Command+Shift+5)はネイティブ解像度、かつH.264ではあるものの圧縮率がかなり低い形式のため、1分尺でも画面全体を収録すると200MBを超える。
開発中のアプリの動作報告やその他キャプチャをした後、Windowsの時はさっと変換するユーティリティツールがあったのだが、Macでは丁度良いものがなかったのでffmpegで変換するスクリプトを運用する。

左:変換後、右:変換前

ハウツー

(homebrewを入れて) brew install ffmpeg でffmpegをインストールした後、冒頭で紹介したシェルを適当なディレクトリ(~/scripts/とか)に配置してコマンドを打つだけ。
画面全体だと解像度が余剰になるため、 SCALING_FACTOR という変数で拡大倍率を指定する(半分の解像度にしたい場合は 0.5 とする)。CRFは30でいい。Slackには何でも添付できるからといってクソ重い画面共有動画を貼り付けるのは地味な嫌がらせと受け止める人も多いので気をつけましょう。

追記

AppleScript(Windowsで言うパワーシェルみたいなやつ)で画面収録を起動出来るらしく、「画面週力を起動」「screenCaptureのプロセスを監視しつつ、その間fswatch等で特定ディレクトリを監視して、新たにmovファイルが書き出されたら自動的に変換」みたいなのを実現できそうなものの、実装がだるそうなのとAppleScriptを既存のショートカットにバインドするのも面倒くさそうなので辞めた。もっとスマートな方法があれば教えて下さい。