video-concat について
video-concatは、FFmpegで動画を結合するためのスキルです。入力形式の確認から順序や設定の指定、出力の検証までを案内し、エンコードやトランジションを調整したいユーザー向けです。
主な機能
- 01ファイルの長さ・解像度・コーデックの確認
- 02解像度と音声の互換性確認
- 03クリップ順と結合設定の確認
- 04結合方式・画質・音声・トランジションの選択
- 05FFmpegの実行と出力の検証
活用シーン
- 01形式が同じ動画クリップの結合
- 02解像度や音声コーデックが異なるクリップの結合
- 03クリップ間へのトランジション追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infquest/ vibe-ops-plugin --skill video-concatインストール後、Claude Code で/video-concatを入力して読み込まれたか確認します。
詳細
FFmpeg 動画連結ツール
ffmpeg を使用して複数の動画ファイルを 1 つの動画に結合します。
使用方法
ユーザーが動画の結合を希望する場合:$ARGUMENTS
手順
ffmpeg を使用して動画を結合するアシスタントとして、次の手順に従ってください。
手順 1:入力ファイルの取得と分析
ユーザーが入力ファイルのパスを指定していない場合は、結合する動画ファイルの一覧を尋ねてください。
各ファイルについて、存在を確認し、情報を取得してください。
ffprobe -v error -show_entries format=duration,size -show_entries stream=codec_name,width,height,r_frame_rate -of json "$INPUT_FILE"
各ファイルについて、次の情報をユーザーに表示してください。
- ファイル名
- 再生時間
- 解像度
- コーデック
また、すべてのファイルの形式に互換性があるか(コーデック、解像度、フレームレートが同じか)確認してください。
手順 2:互換性の確認
2a. 解像度の互換性
必須:処理を続行する前に、すべての入力ファイルの解像度を必ず確認してください。
すべての入力ファイルの解像度(幅 x 高さ)を比較してください。
-
すべてのファイルの解像度が同じ場合:concat demuxer を使用できることを記録してください。
-
ファイルの解像度が異なる場合:AskUserQuestion ツールを必ず使用して、出力に使用する解像度をユーザーに尋ねてください。次のような選択肢を提示してください。
- 「file1.mp4 の解像度を使用(1920x1080)」
- 「file2.mp4 の解像度を使用(1280x720)」
- 「最高解像度を使用(1920x1080)」
- 「最低解像度を使用(1280x720)」
- 「カスタム解像度」
重要:解像度が異なる場合は、concat demuxer ではなく concat filter 方式を必ず使用し、すべての動画を選択した解像度にスケーリングしてください。
# Scale filter to normalize resolution -filter_complex "\ [0:v]scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2[v0];\ [1:v]scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2[v1];\ [v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]"
これにより、アスペクト比を維持しながら動画をスケーリングし、必要に応じて黒い余白を追加します。
2b. 音声コーデックの互換性
必須:処理を続行する前に、すべての入力ファイルの音声コーデックを必ず確認してください。
すべての入力ファイルの音声コーデック(例:aac、eac3、ac3、mp3、opus)を比較してください。
-
すべてのファイルの音声コーデックが同じ場合:後で使用できるよう、コーデックを記録してください。
-
ファイルの音声コーデックが異なる場合:AskUserQuestion ツールを必ず使用して、出力に使用する音声コーデックをユーザーに尋ねてください。検出したコーデックに応じて、選択肢を提示してください。
- 「file1.mp4 の [codec1] を使用」
- 「file2.mp4 の [codec2] を使用」
- 「AAC に再エンコード(幅広い互換性)」
- 「EAC3 に再エンコード(Dolby Digital Plus)」
質問の例:
"输出视频使用什么音频编码?" or "Which audio codec should be used for output?" Options: - "eac3 (from chapter3_full.mp4)" - Keep Dolby Digital Plus - "aac (from Edinburgh.mp4)" - Keep AAC - "Re-encode to AAC 128k" - Best compatibility - "Re-encode to EAC3 384k" - High quality surround重要:音声コーデックが異なる場合は、選択したコーデックに音声を必ず再エンコードしてください。一般的なコーデックの選択肢:
- AAC:
-c:a aac -b:a 128k(ステレオ)、または-c:a aac -b:a 256k(5.1) - EAC3:
-c:a eac3 -b:a 384k(5.1 サラウンド) - AC3:
-c:a ac3 -b:a 384k(5.1 サラウンド) - コピー:
-c:a copy(すべてのコーデックが一致する場合のみ)
2c. ファイルの結合順序の確認(重要)
必須:処理を続行する前に、結合順序をユーザーに確認するか指定してもらう必要があります。
すべての入力ファイルを分析した後、AskUserQuestion ツールを使用して順序を確認してください。
-
すべてのファイルの詳細を、番号付きリスト形式で表示してください。
检测到以下视频文件: 1. video1.mp4 (时长: 5:30, 分辨率: 1920x1080) 2. video2.mp4 (时长: 3:45, 分辨率: 1920x1080) 3. video3.mp4 (时长: 8:20, 分辨率: 1920x1080) -
AskUserQuestion を使用して、順序の確認または並べ替えをユーザーに依頼してください。
- 質問:「视频拼接顺序を確認してください」または「動画の結合順序を確認してください」
- 次の選択肢を含めてください。
- 「現在の順序で結合:1→2→3(推奨)」-検出された順序を使用
- 「カスタム順序」-ユーザーが順序を指定
- ファイルが 2 つだけの場合は、「順序を逆にする:2→1」も提示
-
ユーザーがカスタム順序を選択した場合は、順序を指定するよう尋ねてください(例:「3, 1, 2」または「video3.mp4, video1.mp4, video2.mp4」)。
重要:ファイル名やユーザーが指定した順序に基づいて、順序を決めつけてはいけません。処理を続行する前に、必ず明示的に確認してください。
ステップ 3:マージ設定をユーザーに確認する
必須:ffmpeg コマンドを実行する前に、必ず AskUserQuestion ツールを使ってユーザーの希望を確認してください。この手順を省略したり、勝手に判断したりしないでください。
AskUserQuestion ツールを使って、ユーザーの希望を確認します。
-
マージ方法:動画をどのようにマージしますか?
- 選択肢:
- 「Concat demuxer(同じコーデック/解像度の場合に推奨)」- 最速で、再エンコードは不要です
- 「Concat filter(コーデック/解像度が異なる場合)」- 再エンコードしますが、異なる形式に対応できます
- 「ファイルの分析結果に基づいて決める」- 最適な方法を自動検出します
- 選択肢:
-
出力品質(再エンコードが必要な場合のみ):
- 選択肢:
- 「ソース品質に合わせる(推奨)」
- 「軽い圧縮(CRF 23)」
- 「中程度の圧縮(CRF 28)」
- 「カスタム設定」
- 選択肢:
-
音声の処理:
- 選択肢:
- 「すべての音声トラックを保持(推奨)」
- 「最初の音声トラックのみ保持」
- 「音声を完全に削除」
- 「音声を再エンコード(AAC 128k)」
- 選択肢:
-
トランジション効果(複数選択):
- 選択肢:
- 「トランジションなし(推奨)」
- 「クリップ間をクロスフェード(1 秒)」
- 「クリップ間で黒にフェード」
- 選択肢:
-
出力形式:
- 選択肢:「入力と同じ(推奨)」、「MP4」、「MKV」、「MOV」
-
出力先:どこに保存しますか?(既定値の候補:merged_output.ext)
ステップ 4:FFmpeg コマンドを作成する
ユーザーの選択に基づいて、ffmpeg コマンドを作成します。
方法 1:Concat Demuxer(同じ形式のファイル - 最速)
すべての入力ファイルを一覧にしたテキストファイルを作成します。
# Create concat list file
cat > /tmp/concat_list.txt << 'EOF'
file '/path/to/video1.mp4'
file '/path/to/video2.mp4'
file '/path/to/video3.mp4'
EOF
# Execute concat
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt -c copy "OUTPUT.mp4"
方法 2:Concat Filter(異なる形式のファイル)
# For 2 files
ffmpeg -i "input1.mp4" -i "input2.mp4" \
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -crf 23 -c:a aac -b:a 128k \
"OUTPUT.mp4"
# For 3 files
ffmpeg -i "input1.mp4" -i "input2.mp4" -i "input3.mp4" \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -crf 23 -c:a aac -b:a 128k \
"OUTPUT.mp4"
方法 3:クロスフェードトランジションを適用する場合
# For 2 files with 1 second crossfade
ffmpeg -i "input1.mp4" -i "input2.mp4" \
-filter_complex "\
[0:v][1:v]xfade=transition=fade:duration=1:offset=DURATION1-1[outv];\
[0:a][1:a]acrossfade=d=1[outa]" \
-map "[outv]" -map "[outa]" \
-c:v libx264 -crf 23 -c:a aac -b:a 128k \
"OUTPUT.mp4"
使用できる xfade トランジション:fade、fadeblack、fadewhite、distance、wipeleft、wiperight、wipeup、wipedown、slideleft、slideright、slideup、slidedown、smoothleft、smoothright、circlecrop、rectcrop、circleclose、circleopen、horzclose、horzopen、vertclose、vertopen、diagbl、diagbr、diagtl、diagtr、hlslice、hrslice、vuslice、vdslice、dissolve、pixelize、radial、hblur、wipetl、wipetr、wipebl、wipebr、squeezeh、squeezev、zoomin
音声オプション
# Keep all audio (default with concat demuxer)
-c:a copy
# Remove audio
-an
# Re-encode audio
-c:a aac -b:a 128k
ステップ 5:実行して結果を報告する
- 実行前に、ffmpeg コマンド全体をユーザーに表示します
- 進行状況を表示しながらコマンドを実行します
- 成功または失敗を報告します
- 出力ファイルのパスとサイズを表示します
ステップ 6:出力を確認する
マージ後、出力を確認します。
ffprobe -v error -show_entries format=duration,size -of json "OUTPUT_FILE"
以下を報告します:
- 出力全体の再生時間(トランジションがある場合はその分を差し引き、入力動画の再生時間の合計と一致するはずです)
- ファイルサイズ
- 警告や問題の有無
やり取りの例
ユーザー:video1.mp4、video2.mp4、video3.mp4 をマージしてください