はじまり
突然ですが撮影した動画をさくっとdiscordに上げられたら楽だと思いませんか?
もちろんNitroを買えば解決するのですが、できれば無料で済ませたいですよね。
しかし、よくある動画圧縮サービスを使うとなれば、やれサイトを開くだの、やれアプリを起動させるだのと、複数工程を挟むため面倒に感じてしまいます。
ということでmacのクイックアクション(AutoMator)を使った私なりの解決策をご紹介します。
コード紹介
最初に自作したバージョンでは画質を固定していたので、元が11MBほどの動画でも必要以上に強く圧縮されてしまう問題が発生しました。
そこで最近流行りのchat gpt-5.1に放り込んだところかなり良い改善案が提出されたのでコピペしました。
以下がその改善案のコードです。
ffmpegが必要なので注意してください。
#!/usr/bin/env zsh
#gpt-5.1のコード
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
set -euo pipefail
TARGET_MB=9.5
if [ "$#" -lt 1 ]; then
echo "Finder で動画ファイルを選択してクイックアクションから実行してください。" >&2
exit 1
fi
for INPUT in "$@"; do
echo "==== Processing: $INPUT ===="
if [ ! -f "$INPUT" ]; then
echo " File not found, skipping: $INPUT" >&2
continue
fi
BASENAME="${INPUT%.*}"
OUTPUT="${BASENAME}.discord.mp4"
DURATION="$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 "$INPUT" || true)"
if [ -z "$DURATION" ] || [ "$DURATION" = "N/A" ]; then
echo " Could not get duration from ffprobe, skipping." >&2
continue
fi
DUR_INT=$(awk -v d="$DURATION" 'BEGIN { if (d <= 0) print 0; else print 1 }')
if [ "$DUR_INT" -eq 0 ]; then
echo " Invalid duration (0 or negative), skipping." >&2
continue
fi
TOTAL_BITRATE=$(awk -v size="$TARGET_MB" -v dur="$DURATION" '
BEGIN {
bytes = size * 1024 * 1024;
br = int(bytes * 8 * 0.95 / dur);
if (br < 80000) br = 80000;
print br;
}')
AUDIO_BITRATE=64000
VIDEO_BITRATE=$(( TOTAL_BITRATE - AUDIO_BITRATE ))
if [ "$VIDEO_BITRATE" -lt 50000 ]; then
VIDEO_BITRATE=50000
fi
echo " Duration: ${DURATION}s"
echo " Target total bitrate: ${TOTAL_BITRATE} bps"
echo " Video bitrate: ${VIDEO_BITRATE} bps, Audio: ${AUDIO_BITRATE} bps"
echo " Output: $OUTPUT"
ffmpeg -y -i "$INPUT" \
-c:v libx264 -b:v "${VIDEO_BITRATE}" \
-preset veryfast \
-c:a aac -b:a "${AUDIO_BITRATE}" \
-movflags +faststart \
"$OUTPUT"
ACTUAL_SIZE=$(stat -f "%z" "$OUTPUT" 2>/dev/null || stat -c "%s" "$OUTPUT" 2>/dev/null || echo 0)
echo " Done. Output size: $((ACTUAL_SIZE / 1024 / 1024)) MB"
echo
done
echo "All done."
(関係ないのですが、元のコードにはなかったechoが大量に追加されました。AI系統はみんなログとコメントを残すようになってるのでしょうか?動作にも影響ないので放置してありますが...)
ワークフローが受け取る項目を『ファイルまたはフォルダ』、検索対象を『finder.app』にします。
シェルスクリプトを実行の中に先ほどのコードを放り込んで、シェルを『zsh』、入力は『引数として』を選択して完了です。

おわりに
これを使えば、クリック一つで送りたい動画を送れるようになります。
私のようにcmd+shift+5を多用して、ゲームシーンを切り取ってdiscordに貼る人にとっては便利に思えるのではないでしょうか?
AIを使った雑な開発でしたが、想像よりもいいものができて良かったです。
ここまで読んでいただき、ありがとうございました。