Communitygithub.com

FFmpeg ビデオエディタ

ffmpeg と fftools.py ヘルパーを使用して、ターミナルからビデオの編集、音声抽出、GIF作成、字幕追加、圧縮、メディアファイルの操作、さらに話者ラベル付きの文字起こし・分析を行います。

FFmpeg ビデオエディタ とは?

このスキルは、ターミナル上で ffmpeg と `fftools.py` ヘルパースクリプトを使用して、ビデオ・音声・画像の編集を包括的に行えるパワフルなツールです。切断、結合、音声抽出、リサイズ、GIF作成、サムネイル抽出、圧縮、再生速度変更、ウォーターマーク追加、字幕焼き込み、アニメーション作成など、多岐にわたるメディア操作を JSON 形式の出力で行います。また、WhisperX と sherpa-onnx を用いた完全オフラインの文字起こし機能も搭載しており、ミーティングやインタビューの録音から話者ラベル付きのタイムスタンプ付きトランスクリプトを生成できます。トランスクリプトは JSON、SRT、TXT 形式で出力され、`--speakers` オプションで話者数を指定することで精度が向上します。さらに、高度な操作のために生の ffmpeg コマンドもサポートしており、ピクチャーインピクチャー、クロスフェード、クロマキー合成など、ヘルパースクリプトの範囲を超えた複雑な処理にも対応します。このスキルは、Claude Code をはじめとする AI エージェント向けに設計されており、ユーザーからの「ビデオを編集」「音声を抽出」「文字起こし」といった指示に対して、適切な ffmpeg コマンドを自動生成・実行します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beveradb/claude-code-config/tree/HEAD/skills/ffmpeg

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

FFmpeg ビデオエディタ は何をしますか?

ffmpeg と fftools.py ヘルパースクリプトを使用して、ターミナルからビデオ、音声、画像を編集します。

CLI ツール

すべての操作はヘルパースクリプトを介して行われます。リポジトリをクローンした場所からの相対パス、または以下の場所にあります。

SCRIPT="~/.claude/skills/ffmpeg/scripts/fftools.py"

すべての出力は JSON です。

コマンドリファレンス

# INFO — ファイル詳細の取得(時間、解像度、コーデック、サイズ)
python3 $SCRIPT info input.mp4

# CUT — セグメントの抽出
python3 $SCRIPT cut input.mp4 output.mp4 --start 00:01:30 --end 00:02:45
python3 $SCRIPT cut input.mp4 output.mp4 --start 00:01:30 --duration 30

# MERGE — 複数のビデオを連結
python3 $SCRIPT merge video1.mp4 video2.mp4 video3.mp4 -o merged.mp4
python3 $SCRIPT merge video1.mp4 video2.mp4 -o merged.mp4 --reencode  # 異なるコーデック

# EXTRACT AUDIO — 音声トラックの抽出
python3 $SCRIPT extract-audio input.mp4 output.mp3
python3 $SCRIPT extract-audio input.mp4 output.opus --bitrate 128k

# SUBTITLES — ビデオに字幕を焼き付け
python3 $SCRIPT subtitles input.mp4 output.mp4 --srt subs.srt

# RESIZE — 解像度の変更
python3 $SCRIPT resize input.mp4 output.mp4 --width 1280 --height 720
python3 $SCRIPT resize input.mp4 output.mp4 --width 1920 --height -1  # 高さ自動

# GIF — ビデオをアニメーションGIFに変換(2パス、高品質)
python3 $SCRIPT gif input.mp4 output.gif --fps 15 --width 480
python3 $SCRIPT gif input.mp4 output.gif --start 00:00:05 --duration 3

# THUMBNAIL — 単一フレームを抽出
python3 $SCRIPT thumbnail input.mp4 thumb.jpg --time 00:00:30

# THUMBNAILS — N個の均等間隔フレームを抽出
python3 $SCRIPT thumbnails input.mp4 --count 10 --output-dir ./thumbs/

# COMPRESS — ファイルサイズを削減
python3 $SCRIPT compress input.mp4 output.mp4 --crf 28 --preset medium
python3 $SCRIPT compress input.mp4 small.mp4 --crf 32 --preset fast  # 積極的

# SPEED — 再生速度の変更
python3 $SCRIPT speed input.mp4 fast.mp4 --factor 2.0    # 2倍速
python3 $SCRIPT speed input.mp4 slow.mp4 --factor 0.5    # 半分の速度(スローモーション)

# WATERMARK — 画像オーバーレイの追加
python3 $SCRIPT watermark input.mp4 output.mp4 --watermark logo.png --position bottom-right

# TEXT — テキストオーバーレイの焼き付け
python3 $SCRIPT text input.mp4 output.mp4 --text "Chapter 1" --position center --size 72 --border
python3 $SCRIPT text input.mp4 output.mp4 --text "Sale!" --position top-left --start 5 --end 15

# CONVERT — フォーマット変換
python3 $SCRIPT convert input.avi output.mp4
python3 $SCRIPT convert input.mp4 output.webm --video-codec libvpx-vp9

# FRAMES — フレームを画像として抽出
python3 $SCRIPT frames input.mp4 --output-dir ./frames/
python3 $SCRIPT frames input.mp4 --output-dir ./frames/ --every 30  # 30フレームごと

# AUDIO REPLACE — 音声トラックの交換
python3 $SCRIPT audio-replace input.mp4 output.mp4 --audio music.mp3

# VOLUME — 音量レベルの調整
python3 $SCRIPT volume input.mp4 output.mp4 --level 2.0      # 音量2倍
python3 $SCRIPT volume input.mp4 output.mp4 --level 0.5      # 音量半分
python3 $SCRIPT volume input.mp4 output.mp4 --level 10dB     # 10dB増幅

# FADE — フェードイン/アウト効果の追加
python3 $SCRIPT fade input.mp4 output.mp4 --fade-in 2 --fade-out 3

# STABILIZE — 手ぶれ補正(vidstabフィルターが必要)
python3 $SCRIPT stabilize input.mp4 output.mp4 --shakiness 7 --smoothing 15

# TRANSCRIBE — 音声をテキストに変換(話者ラベル付き、オフライン。文字起こしセクション参照)
python3 $SCRIPT transcribe meeting.mp4                       # → meeting.json/.srt/.txt
python3 $SCRIPT transcribe meeting.mp4 --speakers 3          # 話者数を指定
python3 $SCRIPT transcribe meeting.mp4 --no-diarize          # トランスクリプトのみ、話者なし

文字起こしと分析 — ビデオで「言われていること」を理解する

transcribe コマンドを使用して、会議の録音、インタビュー、または任意の音声/ビデオを話者ラベル付きのタイムスタンプ付きトランスクリプトに変換します。これは「何が議論された?」「誰が何を言った?」「この会議を要約して」「Xについて話した場所を見つけて」といった質問に答えるためのツールです。

これは100%ローカルかつオフラインで実行されます — 音声がマシンから出ることはなく、クラウド API は不要です。内部的には、WhisperX (large-v3) を使用して文字起こしと単語レベルのタイムスタンプを生成し、sherpa-onnx を使用して話者ダイアライゼーション(トークンフリー、オープンONNXモデル)を行います。

初回セットアップ(ネットワークは1回のみ必要)

/setup-transcribe スラッシュコマンドを実行するか、直接以下のコマンドを実行します。

bash ~/.claude/skills/ffmpeg/scripts/install-transcribe.sh

デフォルトでは、GitHub リリースから事前ビルド済みバンドルを取得し(高速:モデルゲーティングなし、torchビルドなし)、完全にオフラインでインストールします。それが利用できない場合(リリースがない、またはホイールが一致しないプラットフォーム)は、自動的にスクラッチビルドにフォールバックします。これは、隔離された Python 3.12 仮想環境(uv 経由)とすべてのモデルを作成します。その後、transcribe はネットワークを必要としません。コマンドが仮想環境がないと報告した場合は、これを実行してください。

特定のモードを強制したい場合:

bash install-transcribe.sh --release   # 事前ビルド済みリリースバンドルのみ
bash install-transcribe.sh --build     # スクラッチビルドのみ(HF + PyPI)
HF_TOKEN=hf_xxx bash install-transcribe.sh --build   # --diarizer pyannoteを有効化

エアギャップ環境 / HuggingFaceへのアクセスがない場合? 接続されたマシンで自己完結型バンドルを一度だけビルドし、任意の場所にホストして、HF/PyPI アクセスなしでインストールします。

# install-transcribe.sh がすでに実行されているマシンで:
bash ~/.claude/skills/ffmpeg/scripts/make-bundle.sh ffmpeg-transcribe-bundle.tar.gz

このバンドルには、すべてのコード、モデル、モデルキャッシュ、Python ホイールがパッケージ化されます。2GB を超える場合は、自動的に <name>.part-aa、<name>.part-ab、…(各2GB未満)に分割され、ホスティング/アップロードの制限に適合します。次に、ターゲットマシン(uv、ffmpeg、python3.12 のみ必要)で以下のコマンドを実行します。

# 単一ファイルバンドル:
bash install-transcribe.sh --bundle https://your.server/ffmpeg-transcribe-bundle.tar.gz

# 分割バンドル — パーツを順番に渡します(自動的に連結されます):
bash install-transcribe.sh --bundle \
  https://your.server/ffmpeg-transcribe-bundle.tar.gz.part-aa \
  https://your.server/ffmpeg-transcribe-bundle.tar.gz.part-ab

(手動で再構築する場合:cat ffmpeg-transcribe-bundle.tar.gz.part-* > ffmpeg-transcribe-bundle.tar.gz)

使用法

# 完全なトランスクリプト + 話者ラベル(meeting.json、meeting.srt、meeting.txt を書き込みます)
python3 $SCRIPT transcribe meeting.mp4

# オプション
python3 $SCRIPT transcribe interview.mp4 --speakers 2          # 既知の話者数 → 精度向上
python3 $SCRIPT transcribe call.m4a --language en             # 言語を強制(自動検出をスキップ)
python3 $SCRIPT transcribe lecture.mp4 --format txt           # .txt のみ書き込み
python3 $SCRIPT transcribe long.mp4 --model medium            # より高速、精度は低め
python3 $SCRIPT transcribe q4.mp4 --diarizer pyannote         # 高品質なダイアライザー(HFトークンが必要)
python3 $SCRIPT transcribe notes.mp4 --no-diarize            # トランスクリプトのみ、話者分離なし
python3 $SCRIPT transcribe raw.wav -o ./out/session          # カスタム出力ベースパス

出力フォーマット

  • .txt — 人間が読みやすく、話者のターンごとにグループ化。内容を理解するためにこれを読んでください:[00:03:12] SPEAKER_01: ...
  • .srt — 話者タグ付きの字幕。ビデオに焼き付け直す場合に使用(subtitles コマンド)
  • .json — 完全な構造化データ:すべてのセグメントと単語に開始/終了時間と話者が含まれ、プログラムによる分析(検索、タイムライン、タイムスタンプ付き引用)に最適

会議分析ワークフロー

# 1. 話者ラベル付きで文字起こし
python3 $SCRIPT transcribe meeting.mp4

# 2. トランスクリプトを読んで内容を分析
#    (meeting.txt を Read ツールで使用するか、timestamps のために meeting.json を解析)

# 3. ここから要約、アクション項目の抽出、誰が何を言ったかの特定、
#    または特定の瞬間にジャンプ:JSON タイムスタンプを cut/thumbnail と組み合わせる
python3 $SCRIPT cut meeting.mp4 clip.mp4 --start 00:12:30 --end 00:14:00

注意:

  • 文字起こしは CPU で実行されます(CTranslate2 は Apple Silicon で GPU パスがありません)。そのため、large-v3 はおおよそ実時間の 1~2 倍です。1時間の会議は約 30~60 分で処理されます — バックグラウンドで実行しても問題ありません。速度を上げるには --model medium または distil-large-v3 を使用してください。
  • --speakers N を指定する(話者数がわかっている場合)と、ダイアライゼーションが顕著に改善されます。

標準ワークフロー

ステップ1 — 入力の分析

常にファイル情報の取得から始めます。

python3 $SCRIPT info input.mp4

これにより、時間、解像度、コーデック、ファイルサイズがわかります。これを使用して、出力設定について適切な判断を下します。

ステップ2 — 操作の実行

適切なコマンドを使用します。複雑な編集の場合は、複数の操作を連鎖させます — ある操作の出力を次の操作の入力として使用します。

ステップ3 — 結果の確認

任意の操作の後、出力をチェックして動作を確認します。

python3 $SCRIPT info output.mp4

ステップ4 — 結果の表示

Read ツールを使用して画像(サムネイル、フレーム)を表示します。ビデオの場合は、出力パスとファイルサイズをユーザーに伝えます。

生の ffmpeg — 高度な操作向け

ヘルパースクリプトでカバーされないユースケースでは、ffmpeg を直接使用します。

# ピクチャーインピクチャー
ffmpeg -y -i main.mp4 -i overlay.mp4 \
  -filter_complex "[1:v]scale=320:-1[pip];[0:v][pip]overlay=W-w-10:H-h-10" \
  -c:v libx264 -c:a copy output.mp4

# サイドバイサイド比較
ffmpeg -y -i left.mp4 -i right.mp4 \
  -filter_complex "[0:v]pad=iw*2:ih[bg];[bg][1:v]overlay=W/2:0" \
  -c:v libx264 output.mp4

# グリッド/モザイク(2x2)
ffmpeg -y -i a.mp4 -i b.mp4 -i c.mp4 -i d.mp4 \
  -filter_complex "[0:v]scale=640:360[v0];[1:v]scale=640:360[v1];
    [2:v]scale=640:360[v2];[3:v]scale=640:360[v3];
    [v0][v1]hstack[top];[v2][v3]hstack[bot];[top][bot]vstack" \
  -c:v libx264 grid.mp4

# ビデオの逆再生
ffmpeg -y -i input.mp4 -vf reverse -af areverse reversed.mp4

# 特定のオーディオチャンネルの抽出
ffmpeg -y -i input.mp4 -af "pan=mono|c0=FL" left_channel.wav

# ノイズ低減
ffmpeg -y -i input.mp4 -af "afftdn=nf=-25" denoised.mp4

# カラー補正(明るさ、コントラスト、彩度)
ffmpeg -y -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2:saturation=1.3" corrected.mp4

# クロマキー(グリーンスクリーン除去)
ffmpeg -y -i greenscreen.mp4 -i background.mp4 \
  -filter_complex "[0:v]chromakey=0x00FF00:0.3:0.1[fg];[1:v][fg]overlay" \
  -c:v libx264 composited.mp4

# 画像シーケンスからのタイムラプス
ffmpeg -y -framerate 30 -i frame_%04d.jpg -c:v libx264 -pix_fmt yuv420p timelapse.mp4

# 単一画像 + 音声からのビデオ
ffmpeg -y -loop 1 -i cover.jpg -i audio.mp3 -c:v libx264 -tune stillimage \
  -c:a aac -shortest output.mp4

# 2つのビデオ間のクロスフェード(1秒)
ffmpeg -y -i first.mp4 -i second.mp4 \
  -filter_complex "xfade=transition=fade:duration=1:offset=FIRST_DURATION_MINUS_1" \
  -c:v libx264 crossfade.mp4

CRF 品質ガイド

CRF品質使用例
18視覚的にロスレスアーカイブ、プロ編集
23高品質ffmpeg デフォルト、ほとんどの用途に最適
28良好な品質共有用として推奨、小さなファイル
32許容可能ソーシャルメディア、積極的な圧縮
38+低品質プレビュー、サムネイル

CRF が低いほどファイルサイズが大きく、品質が高くなります。+6 ごとにファイルサイズが約半分になります。

フォーマットクイックリファレンス

コンテナビデオコーデックオーディオコーデック使用例
.mp4H.264 (libx264)AACユニバーサル互換性
.webmVP9 (libvpx-vp9)OpusWeb、小さなファイル
.mkvH.265 (libx265)Opus最大圧縮
.movProResPCMプロフェッショナル編集
.gif——アニメーション、音声なし

エラーハンドリング

  • "No such file" — 入力パスを確認し、絶対パスを使用してください
  • "Unknown encoder" — コーデックがコンパイルされていません。ffmpeg -encoders を確認
  • "Permission denied" — 出力パスに書き込み権限がありません
  • "Avi header too large" — 入力が破損しています。入力の前に -fflags +genpts を試す
  • Timeout — ビデオが非常に長いです。タイムアウトを増やすか、--preset ultrafast を使用
  • Out of memory — 最初に解像度を下げてから処理してください

関連スキル