2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

動画を10MB以下にしたい!(discord添付用の簡単圧縮機)

Last updated at Posted at 2025-12-07

はじまり

突然ですが撮影した動画をさくっと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』、入力は『引数として』を選択して完了です。
スクリーンショット 2025-11-30 16.40.27.png

おわりに

これを使えば、クリック一つで送りたい動画を送れるようになります。
私のようにcmd+shift+5を多用して、ゲームシーンを切り取ってdiscordに貼る人にとっては便利に思えるのではないでしょうか?

AIを使った雑な開発でしたが、想像よりもいいものができて良かったです。
ここまで読んでいただき、ありがとうございました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?