FFmpegは、映像・音声をコマンドで変換・抽出・切り出しするツールです。形式だけを替える操作と、映像の画質・大きさを変える操作では指定が異なります。最初に目的を選び、元ファイルを残した別名の出力で試します。
| 目的 | 方法と確認点 |
|---|---|
| 形式だけ替える | -c copyで再多重化。出力の形式が入力コーデックに対応するか確認 |
| 時間を切り出す | -ssと-t。コピーは開始がキーフレームに左右される |
| 音声だけ取り出す | -mapで必要な音声を選ぶ。AACコピーとMP3変換を区別 |
| 容量を減らす | 解像度とlibx264のCRFを調整。容量・画質の両方を確認 |
| 短いGIFや画像にする | fps・scale・パレット、または1フレームを抽出 |
| 複数動画をつなぐ | 共通設定の入力をリストで結合。詳細は結合記事へ |
9月29日の1280×720・12秒・30fpsの旧測定と10月2日の確認記録を保持し、今回の640×360入力の結果は後半へ分けています。2026年10月3日の使用版はWindows 11 Pro・FFmpeg 9.0.2(gyan.dev full build)。実際の撮影素材の画質・速度やGUIの動作を比較した結果ではありません。
WindowsでFFmpegを準備する
ffmpeg -version
ffprobe -versionすでに版が表示されれば追加インストールは不要です。未導入なら公式ダウンロードページに掲載されたWindowsビルドを選ぶか、WinGetで次のIDを指定します。WinGetの–idと、完全一致の-eを使う書式はMicrosoftのinstall説明で確認できます。
winget install --id Gyan.FFmpeg -e導入後はPowerShellを開き直して版を確認します。見つからない場合は、実際のffmpeg.exeの場所とPATHを確認します。展開版を使う場合も既存PATH全体を置き換えず、binの項目を追加します。
入力・出力と選ぶトラックを確認する
既存の動画を使う場合は、sample.mp4をその入力名に置き換えます。練習入力を使う場合は、次の節の生成コマンドで作ってから情報を確認します。
ffprobe -v error -show_entries stream=index,codec_type,codec_name,width,height,sample_rate,channels:format=duration -of compact "sample.mp4"ffmpegは入力を-iで指定し、その出力へ適用する設定の後に出力名を書きます。以下の映像処理は-map 0:v:0で最初の映像、-map “0:a:0?”で存在する最初の音声を選びます。?は音声がない入力でもその選択だけを省略する指定です。追加の音声・字幕・添付をすべて保持する例ではありません。必要なトラックをffprobeで選んでから処理します。
libx264・yuv420pの例は8bit SDRの再生用コピーです。HDR・10bit・透過・色の保持には別の形式や設定が必要になります。-c copyでも出力の入れ物とコーデックの対応は確認してください。拡張子だけ変えて、同じ内容を入れられるとは限りません。
同じ入力でコマンドを試す
以下のコマンド例は、動画と出力先を置く作業フォルダーで PowerShell を開いて実行します。
元動画は別名で保管し、出力ファイル名が既存ファイルと重ならないようにしてください。
以下は-nで既存出力への上書きを止めます。停止したら出力を別の未使用の名前に変えます。入力と出力に同じファイルを指定しません。
個人の動画を使わずに試すなら、次のコマンドで12秒・640×360・30fps・AAC音声つきの sample.mp4 を生成できます。
ffmpeg -n -f lavfi -i "testsrc2=size=640x360:rate=30:duration=12" -f lavfi -i "sine=frequency=440:sample_rate=48000:duration=12" -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a aac -shortest sample.mp4下の既存の容量表は、9月29日に使った1280×720の入力での結果です。
この640×360の入力では同じファイルサイズにはなりません。
形式を変える(中身はそのまま)
ffmpeg -n -i sample.mp4 -map 0:v:0 -map "0:a:0?" -c copy remux.mkv-c copy は、映像と音声を作り直さずに、入れ物(コンテナ)だけを替えます。
2026年9月29日の1280×720の入力では、4,809,665 → 4,802,823バイトでした。再エンコード時間は省けますが、所要時間は入力の大きさや保存先で変わります。
切り出す
ffmpeg -n -ss 3 -i sample.mp4 -t 4 -map 0:v:0 -map "0:a:0?" -c copy cut_copy.mp4ffmpeg -n -ss 3 -i sample.mp4 -t 4 -map 0:v:0 -map "0:a:0?" -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a aac cut_enc.mp4上の例は入力の3秒付近から4秒分を指定します。-ssは開始、-tは出力する長さです。次の表は9月29日の旧入力で3〜7秒を比較した既存結果です。
| 方法 | 旧入力の結果 |
|---|---|
| -c copy | 4.1秒/2,844,078バイト/記録212コマ(表示122コマ) |
| 再エンコード | 4.0秒/1,537,303バイト/120コマ |
練習用の動画のキーフレーム(単独で表示できるコマ)は、0秒と8.33秒にしかありませんでした。
-c copy では、3秒から切り出しても、0秒のキーフレームから中身が入り、見えないコマが90コマ分ふくまれました。
フレーム単位の開始位置が必要なら再エンコードを検討します。入力の-ssで再エンコードすると、既定のaccurate_seekで指定開始までの余分な区間をデコードして捨てます。コピーでは余分な区間が残るため、開始・末尾を確認します。
音声だけを取り出す
ffmpeg -n -i sample.mp4 -map 0:a:0 -vn -c:a copy audio.m4affmpeg -n -i sample.mp4 -map 0:a:0 -vn -c:a libmp3lame -q:a 2 audio.mp3-vn は映像を入れない指定です。
元の音声が AAC なら、-c:a copy で .m4a にすると、音を作り直さずに取り出せます。
libmp3lameへ変換する例では-q:aの小さい値ほど高品質側の設定です。元の音声より情報が増える処理ではなく、MP3に必要な場合だけ変換します。音声抽出では最初の音声を指定しているため、音声がない入力なら停止します。
小さくする・軽くする
解像度を下げる
ffmpeg -n -i sample.mp4 -map 0:v:0 -map "0:a:0?" -vf scale=-2:480 -c:v libx264 -crf 23 -c:a copy small480.mp4scale=-2:480 は、高さを480にして、幅は縦横比に合わせて自動で決める(2の倍数にする)指定です。
旧1280×720の入力では854×480になりました。上で生成した640×360を高さ480にすると拡大です。縮小したい場合は元の高さより小さい値を選び、今回の確認では高さ240(426×240)を使用しました。
画質(CRF)を変える
ffmpeg -n -i sample.mp4 -map 0:v:0 -map "0:a:0?" -c:v libx264 -pix_fmt yuv420p -crf 28 -preset medium -c:a copy crf28.mp4| -crf | 大きさ |
|---|---|
| 18 | 6,514,534 バイト |
| 23(初期値) | 4,599,497 バイト |
| 28 | 2,318,130 バイト |
libx264のCRFは、同じ入力・設定なら大きい値ほど低品質側になります。出力容量の削減率は固定ではなく、入力形式・内容・ほかの設定でも変わります。ほかのエンコーダーへ同じ値の意味をそのまま当てはめません。
表の結果では、18→23で約29%、23→28で約50%小さくなり、同じ割合ではありませんでした。
GIFにする
ffmpeg -n -ss 0 -t 3 -i sample.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,split[a][b];[a]palettegen[p];[b][p]paletteuse" anim.gifGIF は256色までしか使えないので、palettegen で動画に合った色の表を作り、paletteuse でその色を使います。
パレットを作らない指定(fps=10,scale=480:-1 だけ)と比べると、大きさは次のとおりでした。
| 方法 | 大きさ(3秒・10fps・幅480) |
|---|---|
| パレットを作る | 499,141 バイト |
| パレットを作らない | 259,444 バイト |
この旧入力ではパレットを作る方法のほうが大きい結果でした。パレットは色の割り当てを決めるもので、作成すれば必ず小さくなる指定ではありません。容量の数字だけで見た目の優劣は判定できません。
fps と幅を下げると、GIF は小さくなります。
つなぐ
# list.txt の中身
file 'cut_enc.mp4'
file 'cut_enc.mp4'ffmpeg -n -f concat -i list.txt -map 0:v:0 -map "0:a:0?" -c copy joined.mp4つなぐファイルを list.txt に書き、concat で読み込みます。
4秒の動画を2つつないで、約8秒になりました。
-c copy でつなぐときは、解像度やコーデックなどがそろっている必要があります。
AVI・MP4の結合前に確認する条件とリストの作り方は、ffmpegでAVIとMP4を結合する方法で紹介しています。
音を消す
ffmpeg -n -i sample.mp4 -map 0:v:0 -an -c:v copy mute.mp4-an は音声を入れない指定で、できたファイルには映像のトラックだけが残りました。
1コマを画像にする(サムネイル)
ffmpeg -n -ss 5 -i sample.mp4 -map 0:v:0 -frames:v 1 thumb.jpg5秒の位置の1コマを JPEG で書き出しました。
字幕を入れる
字幕の焼き込みと埋め込みは、ffmpegで字幕を焼き込む・埋め込む方法で紹介しています。
出力を確認する・元に戻す
ffprobe -v error -count_frames -show_entries stream=index,codec_type,codec_name,width,height,nb_frames,nb_read_frames,duration:format=duration -of compact cut_enc.mp4旧入力による2026年10月2日の既存記録では、再エンコードした切り出しは、映像が120コマ・4.000秒でした。
同じ入力の -c copy の切り出しは、記録上212コマ・4.100秒となり、再エンコード版と一致しませんでした。
GIF の例は30コマ、結合の例は240コマ・8.000秒、音声削除の例は音声トラックがないことを確認しました。
変換後の冒頭・末尾・切れ目も再生して確認し、不要な練習用出力だけを削除すれば作業前に戻せます。
Error opening input が出たら入力名と作業フォルダー、Unknown encoder が出たら使用しているビルドの対応コーデックを確認します。
よく使う指定
| 指定 | 意味 |
|---|---|
| -i ファイル | 入力 |
| -c copy | 作り直さずに写す |
| -c:v / -c:a / -c:s | 映像・音声・字幕のコーデックを決める |
| -ss / -to / -t | 開始位置・終わりの位置・長さ |
| -vn / -an | 映像を入れない・音声を入れない |
| -vf | 映像のフィルター(縮小・字幕など) |
| -crf | 使用エンコーダーの品質設定。libx264では小さい値ほど高品質側 |
| -n | 既存の出力に上書きせず停止 |
2026年10月3日の同じ練習入力での確認
上の生成コマンドで12秒・640×360・30fps、H.264 CRF23、AAC 48kHzモノラルの入力を作りました。Windows 11 Pro build26200、Ryzen 5 7530U・RAM約16GB、FFmpeg9.0.2で実行し、入力のSHA-256が処理前後で変わらないことを確認しました。
| 処理 | 今回の結果 |
|---|---|
| MP4→MKVへコピー | 1,311,701→1,304,750バイト。デコードした全映像とPCM音声が元と一致 |
| 3秒から4秒をコピーで切り出す | 映像4.100秒・122表示フレーム、音声4.018667秒 |
| 同じ区間を再エンコード | 映像4.000秒・120フレーム、音声4.000秒 |
| AACをM4Aへ抽出/音声削除 | 抽出PCMが元と一致。音声削除後の映像も元と一致 |
| 高さ240へ縮小/CRF28 | 426×240は526,014バイト。CRF28は732,348バイト。画質の主観比較は未実施 |
| GIF/JPEG | GIFは480×270・30フレーム・3秒。5秒地点のJPEGを生成 |
コピーの切り出しでは、コンテナに入ったフレーム数とデコーダーが表示するフレーム数が異なる場合があります。今回の122は-count_framesによるnb_read_framesです。旧表の212はコンテナ側の記録を含む値なので、同じ項目として比較しません。
止まった・出力が期待と違うとき
| 症状 | 確認する項目 |
|---|---|
| コマンドが見つからない | 導入後に開き直したPowerShellと実行ファイルの場所 |
| Error opening input | 入力名・作業フォルダー。空白を含むパスを引用符で囲む |
| Unknown encoder/No such filter | 実行したビルドのエンコーダーやフィルターの有無 |
| copyで出力形式に入れられない | コーデックとコンテナ。互換性が必要なら再エンコードを検討 |
| 音声や字幕が減った | -mapと出力トラック一覧。最初の音声だけを選ぶ例か確認 |
| -nで止まった/結合出力が短い | 出力名とログ、必要なファイル、期待した長さと末尾。終了コードだけで完成扱いにしない |
今回の9.0.2では、既存出力を-nで拒否した場合にも終了コード0を返しました。元ファイルは不変でしたが、終了コードだけでは新しい出力の作成を確認できません。出力名・更新・長さ・トラックとログを確認してから、冒頭・末尾・音声を再生します。
結合条件はFFmpegでAVI・MP4を結合、fpsの調整はVFRをCFRへ変換、字幕はSRTを焼き込む・埋め込む、関連する編集手順は動画編集の一覧へ進んでください。公式資料確認:2026年10月3日。入力指定・ストリーム選択・シーク、scale・fps・パレット、ffprobeの出力項目。
