結論

ffmpegは「ffmpeg -i 入力 オプション 出力」の形で、動画の変換・圧縮・切り出しを行う無料のコマンドです。MOV→MP4は -c copy なら0.13秒で終わりました。

この記事でわかること

  • 変換・圧縮・GIFなど目的別コマンド10種の早見表
  • CRF 5段階のサイズ・時間・画質(SSIM)の実測表
  • -c copyで映像が0KBになる例など、エラー17種の直し方

2026年10月22日更新|FFmpeg 6.1.1・Ubuntu 24.04 で実行確認

ffmpeg は、入力ファイルを分解し、必要なら「復号→加工→圧縮」をしてから、出力の形式に詰め直します。-c copy はその途中を飛ばすので速く、画質も変わりません。

flowchart TD
    A[入力 MOV] --> B[分解 demux]
    B -->|-c copy| E[詰め直し mux]
    B --> C[復号 decode]
    C --> D[加工と圧縮<br>-vf・-crf]
    D --> E
    E --> F[出力 MP4]

よく使うコマンドは次のとおりです(どれもこの記事で実際に実行しました)。

やりたいこと コマンド 補足
MOV を MP4 に変換(速い) ffmpeg -i in.mov -c copy out.mp4 画質そのまま・再圧縮なし
MOV を MP4 に変換(互換重視) ffmpeg -i in.mov -c:v libx264 -c:a aac out.mp4 H.264 に作り直す
MP4 を圧縮 ffmpeg -i in.mp4 -crf 28 out.mp4 数字を上げるほど小さい
解像度を下げて圧縮 ffmpeg -i in.mp4 -vf scale=-2:720 out.mp4 720p にする
切り出し(正確) ffmpeg -ss 3 -i in.mp4 -t 4 out.mp4 3秒目から4秒間
結合 ffmpeg -f concat -i list.txt -c copy out.mp4 list.txt にファイル名
音声だけ取り出す ffmpeg -i in.mp4 -vn -c:a copy out.m4a MP3 は -c:a libmp3lame
GIF にする ffmpeg -i in.mp4 -vf "fps=10,scale=480:-1" out.gif きれいにするなら palettegen
90度回転 ffmpeg -i in.mp4 -vf transpose=1 out.mp4 1 は時計回り
サムネイル1枚 ffmpeg -ss 5 -i in.mp4 -frames:v 1 out.jpg 5秒目の画像

確認環境:Ubuntu 24.04.4・FFmpeg 6.1.1(Ubuntu の apt パッケージ 7:6.1.1-3ubuntu5。libx264 core 164・x265 3.5・SVT-AV1 1.7.0)・CPU 2コア。ffmpeg の testsrc2 で作った 1920×1080・30fps・10秒の HEVC(H.265)の MOV(10,321,128 バイト)を元の動画として、変換・圧縮・切り出し・結合などをすべて実行し、サイズ・時間・画質(SSIM・PSNR)を測りました。インストール方法と最新版は FFmpeg 公式のダウンロードページ・gyan.dev・Homebrew、オプションの意味は FFmpeg 公式ドキュメント(ffmpeg・ffmpeg-formats・ffmpeg-filters・ffmpeg-codecs)、iPhone の動画形式は Apple サポート、HEVC のタグは Apple の HLS 仕様で確かめました(確認日 2026年10月22日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ffmpegの使い方|MOV→MP4変換・圧縮・切り出しを実測で解説」

ffmpegとは(できることと料金)

この節では、ffmpeg が何をするソフトで、いくらかかるのかが分かります。

FFmpeg は、動画と音声の変換・圧縮・切り出し・結合・配信などを行うオープンソースのソフトです。公式サイトは「デコード、エンコード、トランスコード、多重化、分離、ストリーミング、フィルター、再生ができる、代表的なマルチメディアのフレームワーク」と説明しています。

項目 内容
料金 無料。LGPL 2.1 以降(GPL の部品を有効にしたビルドは GPL 2 以降)
使い方 画面(GUI)は無く、コマンドで操作する
付いてくるコマンド ffmpeg(変換)・ffprobe(情報を見る)・ffplay(再生)
最新版 9.0.2(2026年9月18日公開。2026年10月22日時点の公式ダウンロードページ)
対応 OS Windows・Mac・Linux

コマンドで操作するので、設定を細かく選べ、同じ処理を何百本でも同じ条件で繰り返せます。

動画ファイルの中身:コンテナとコーデック

ffmpeg のオプションを読むには、「入れ物(コンテナ)」と「中身の圧縮方式(コーデック)」が別物だと知っておくと迷いません。

用語 意味 例
コンテナ 映像・音声・字幕をまとめる入れ物。拡張子で表す MP4・MOV・MKV・WebM
映像コーデック 映像の圧縮方式 H.264・H.265(HEVC)・AV1・VP9
音声コーデック 音声の圧縮方式 AAC・MP3・Opus
ストリーム ファイルの中の1本1本の映像・音声・字幕 Stream #0:0(映像)・#0:1(音声)
ビットレート 1秒あたりのデータ量。大きいほど高画質・大容量 8116 kb/s
フレームレート 1秒あたりのコマ数。一定(CFR)と可変(VFR)がある 30 fps
キーフレーム 1枚で表示できるフレーム。切り出しの位置に関わる 後の「-c copyと再エンコードの違い」

MOV と MP4 は、どちらも中に H.264 や H.265 を入れられる入れ物です。そのため、中身がそのまま MP4 に入るなら、圧縮し直さずに入れ物だけ取り替えられます(後の「MOVをMP4に変換する方法」)。

ffmpegのインストール方法(Windows・Mac・Linux)

この節では、OS ごとの入れ方と、入ったかの確かめ方が分かります。

FFmpeg 公式はソースコードを配布し、実行ファイル(ビルド)は公式ダウンロードページに載っている配布元から入手します。

OS 入れ方 公式ページに載っている配布元
Windows winget install ffmpeg か ZIP を展開して PATH に追加 gyan.dev・BtbN
Mac brew install ffmpeg(Homebrew) evermeet.cx(静的ビルド)
Ubuntu・Debian sudo apt install ffmpeg 各ディストリビューションの公式パッケージ
Fedora・RHEL RPM Fusion を有効にして dnf install ffmpeg RPM Fusion
Linux(最新版が欲しい) 静的ビルドを展開する BtbN(GitHub リリース)

Windows:winget で入れる

gyan.dev のビルドページには、パッケージマネージャーで入れるコマンドが載っています(2026年10月22日時点)。

種類 winget Chocolatey Scoop
full(全部入り) winget install ffmpeg choco install ffmpeg-full scoop install ffmpeg
essentials(よく使う部品だけ) winget install "FFmpeg (Essentials Build)" choco install ffmpeg scoop install ffmpeg-essentials

winget で入れたものは、winget upgrade ffmpeg で更新、winget uninstall ffmpeg で削除、winget list ffmpeg で入っている版を確かめられます。

この記事のコマンドは、どちらでも動きます。winget で入れたあとは、ターミナル(コマンドプロンプト・PowerShell)を開き直すと ffmpeg が使えるようになります。

Windows:ZIP を展開して PATH を通す

パッケージマネージャーを使わない場合の手順です。

1

ZIP をダウンロードする

FFmpeg 公式のダウンロードページから Windows の配布元(gyan.dev など)へ進み、release builds の essentials か full の ZIP を保存します。

版は 9.0.2(2026年10月22日時点)

2

展開して置き場所を決める

展開したフォルダを C:\ffmpeg などに置きます。中の bin フォルダに ffmpeg.exe・ffprobe.exe があります。

日本語や空白を含まない場所が扱いやすい

3

環境変数 PATH に bin を足す

「システム環境変数の編集」→「環境変数」→ ユーザー環境変数の Path →「新規」で C:\ffmpeg\bin を追加します。

exe のあるフォルダを登録する

4

ターミナルを開き直して確かめる

新しいコマンドプロンプトで ffmpeg -version を実行し、版が表示されれば完了です。where ffmpeg で、どの exe が使われるかも分かります。

開いたままの画面には PATH の変更が反映されない

PATH が通っていないと、コマンドプロンプトは次のように表示します。

'ffmpeg' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

PATH の考え方と原因の切り分けは、関連記事「command not foundの直し方|PATHの確認方法と原因別の対処表」で扱っています。

Mac:Homebrew で入れる

Homebrew の ffmpeg は 9.0.2 です(2026年10月22日時点の formulae.brew.sh)。

brew install ffmpeg
ffmpeg -version

Homebrew 自体の使い方は、関連記事「Homebrewの使い方|コマンド一覧とBrewfile・brew bundle」で扱っています。

Linux:apt で入れる

Ubuntu・Debian は公式パッケージで入ります。Ubuntu 24.04 で入る版は 6.1.1 でした。

sudo apt update
sudo apt install ffmpeg

apt の使い方は、関連記事「aptコマンド一覧|updateとupgradeの違い・apt-getとの違い」で扱っています。

入ったかを確かめる

$ ffmpeg -version
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened ... --enable-libx264 ...

configuration: の行に、そのビルドで使える部品が並びます。--enable-libx264(H.264)・--enable-libx265(H.265)・--enable-libmp3lame(MP3)があれば、この記事のコマンドはすべて使えます。使えるエンコーダーは ffmpeg -encoders で一覧できます。

調べたいこと コマンド
版とビルドの設定 ffmpeg -version
使える入れ物(形式) ffmpeg -formats
使えるエンコーダー・デコーダー ffmpeg -encoders・ffmpeg -decoders
使えるフィルター ffmpeg -filters
使える画素の形式 ffmpeg -pix_fmts
エンコーダーのオプション ffmpeg -h encoder=libx264
フィルターのオプション ffmpeg -h filter=scale
どの ffmpeg が使われるか Windows where ffmpeg・Linux/Mac which ffmpeg
$ ffmpeg -hide_banner -encoders | grep -E "libx264 |libx265|aac |libmp3lame"
 V....D libx264              libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
 V....D libx265              libx265 H.265 / HEVC (codec hevc)
 A....D aac                  AAC (Advanced Audio Coding)
 A....D libmp3lame           libmp3lame MP3 (MPEG audio layer 3) (codec mp3)

ffmpegコマンドの基本の書き方

この節では、コマンドの並べ方と、実行したときの表示の読み方が分かります。

公式ドキュメントの書式は次のとおりです。

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

ドキュメントには「オプションは、原則としてその次に書いたファイルに効く」とあります。-i の前に書けば入力に、出力ファイル名の前に書けば出力に効きます。同じ -ss でも、置く場所で動きが変わります(後の「動画を切り出す方法」)。

場所 例 効き方
いちばん前(全体) -y・-hide_banner・-loglevel error コマンド全体に効く
-i の前(入力) -ss 3・-f concat・-framerate 1 入力の読み方を決める
-i の後〜出力の前(出力) -c:v libx264・-crf 23・-vf scale=-2:720 出力の作り方を決める

よく使うオプション一覧

オプション 意味 例
-i 入力ファイル -i in.mov
-c:v・-c:a 映像・音声のコーデック(copy で作り直さない) -c:v libx264 -c:a aac
-c copy 映像も音声も作り直さずにコピー 入れ物の変更・無劣化の切り出し
-crf 画質の目安(小さいほど高画質) -crf 23
-preset 圧縮の速さと効率の釣り合い -preset slow
-b:v・-b:a 映像・音声のビットレート -b:v 2M -b:a 128k
-maxrate・-bufsize ビットレートの上限と、その計算の幅 -maxrate 3M -bufsize 6M
-q:v JPEG などの画質(小さいほど高画質) -q:v 2
-vf 映像フィルター(拡大縮小・回転・字幕など) -vf scale=-2:720
-af 音声フィルター(音量など) -af volume=-6dB
-filter_complex 複数の入力を組み合わせるフィルター 透かし・結合
-ss・-t・-to 開始位置・長さ・終了位置 -ss 3 -t 4
-vn・-an・-sn 映像・音声・字幕を入れない -vn(音声だけにする)
-map 出力に入れるストリームを選ぶ -map 0 -map 1
-r フレームレート -r 30
-s 解像度(-vf scale と同じ目的) -s 1280x720
-f 形式を明示する -f concat・-f segment・-f null
-metadata タイトルなどの情報を書き込む -metadata title="旅行"
-pix_fmt 画素の形式 -pix_fmt yuv420p
-movflags +faststart MP4 の目次を先頭に置く(Web 向け) ―
-shortest いちばん短いストリームで終える 静止画+音声
-y・-n 上書きする・上書きしない -y
-hide_banner 起動時の版情報を出さない ―

実行したときの表示の読み方

HEVC の MOV を、オプションなしで MP4 に変換したときの表示です(要部)。

$ ffmpeg -hide_banner -i input.mov -t 3 out.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':
  Duration: 00:00:10.00, start: 0.000000, bitrate: 8256 kb/s
  Stream #0:0[0x1]: Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 8116 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
  Stream #0:1[0x2]: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x563e5fe0e480] profile High, level 4.0, 4:2:0, 8-bit
[libx264 @ 0x563e5fe0e480] 264 - core 164 r3108 31e19f9 - H.264/MPEG-4 AVC codec - ... rc=crf mbtree=1 crf=23.0 qcomp=0.60 ...
[out#0/mp4 @ 0x563e5fdfdec0] video:2187kB audio:47kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.205868%
frame=   90 fps= 17 q=-1.0 Lsize=    2239kB time=00:00:02.98 bitrate=6142.1kbits/s speed=0.549x
行 読み取れること
Input #0 ... Stream #0:0 Video: hevc 入力の映像は HEVC(H.265)、1920x1080、30fps
Stream mapping: hevc -> h264 (libx264) 映像は H.264 に作り直す。(copy) なら作り直さない
crf=23.0 CRF を指定しないと、libx264 は 23 で圧縮する
video:2187kB audio:47kB 出力の映像と音声の大きさ。video:0kB なら映像が入っていない
speed=0.549x 再生速度の 0.549 倍で処理した(1x より大きいほど速い)

MP4 に出力して何も指定しないと、映像は libx264(CRF 23)、音声は AAC になりました。 途中で止めるときは q を押します。

-c copyと再エンコードの違い

この節では、ffmpeg の操作でいちばん大事な「作り直すか、コピーするか」の違いが分かります。

-c copy(ストリームコピー)

中身を作り直さず、入れ物だけ詰め替える

MOV→MP4 で 0.13 秒・画質は元のまま

フィルター(拡大縮小・回転・字幕の焼き込み)は使えない

切り出し・分割はキーフレームの位置でしか切れない

再エンコード(-c:v libx264 など)

一度復号して、圧縮し直す

同じ変換で 19〜30 秒(CPU 2コア・10秒の動画)

サイズ・解像度・コーデックを自由に変えられる

圧縮し直すたびに画質は少し落ちる

公式ドキュメントは、ストリームコピーを「入力のパケットを、復号・フィルター・エンコードせずにそのまま写すこと」と説明し、「フィルターは復号したフレームに働くので、ストリームコピーでは使えない」としています。

やりたいこと -c copy 再エンコード
MOV→MP4(中身が H.264・H.265) 使える 互換性を上げたいとき
ファイルを小さくする できない 必要
解像度・回転・字幕の焼き込み・GIF できない 必要
秒単位で正確に切り出す キーフレームの位置になる 正確に切れる
同じ形式の動画の結合 使える 形式が違うとき
音声だけ取り出す(AAC→m4a) 使える MP3 にするとき

キーフレームは、前後の画面に頼らずに1枚で表示できるフレームです。圧縮された動画の多くは、キーフレームの間を「前との差分」で記録しています。この記事の元の動画のキーフレームは、10秒の中に2か所(0秒と 8.33 秒)だけでした。

$ ffprobe -v error -select_streams v -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 crf23.mp4
0.000000
8.333333

MOVをMP4に変換する方法

この節では、iPhone などの MOV を MP4 にする2通りのコマンドと、その結果が分かります。

iPhone のカメラは、設定の「フォーマット」が「高効率」だと HEVC(H.265)、「互換性優先」だと H.264 で動画を記録します(Apple サポート)。どちらの中身も MP4 に入るので、まず -c copy を試せます。

# 1. 入れ物だけ変える(速い・画質そのまま)
ffmpeg -i input.mov -c copy output.mp4

# 2. H.264+AAC に作り直す(再生できる機器が多い)
ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4

10秒・1920x1080 の HEVC の MOV(10,321,128 バイト)で、両方を実行した結果です。

方法 時間 出力のサイズ 中身
-c copy 0.13 秒 10,321,073 バイト HEVC(hvc1)・AAC のまま
-c:v libx264 -crf 23 -c:a aac 19〜30 秒 7,594,216 バイト H.264(High)・AAC
0.13秒-c copy の変換時間サイズは元と55バイト違うだけ
150倍以上再エンコードとの時間差再エンコードは19〜30秒かかった
74%H.264 にしたときのサイズCRF 23 で元の約4分の3

どちらを選ぶか

状況 選ぶコマンド
拡張子を MP4 にしたいだけ・画質を落としたくない -c copy
HEVC に対応していない機器・ソフトで再生したい -c:v libx264 -c:a aac
ついでに小さくしたい -c:v libx264 -crf 28(次の節)
-c copy でエラーが出た 再エンコードに切り替える

HEVC を MP4 に入れるときは hvc1 にする

HEVC を MP4 に入れるときのタグ(目印)には hvc1 と hev1 の2種類があります。Apple の HLS の仕様は「hev1 ではなく hvc1 を使う」ことを勧めています。ffmpeg で libx265 から MP4 を作ると、何も指定しなければ hev1 になりました。-tag:v hvc1 で変えられます。

$ ffmpeg -i t5.mp4 -c copy -tag:v hvc1 t5h.mp4
$ ffprobe -v error -select_streams v -show_entries stream=codec_tag_string -of csv=p=0 t5.mp4
hev1
$ ffprobe -v error -select_streams v -show_entries stream=codec_tag_string -of csv=p=0 t5h.mp4
hvc1

iPhone の MOV のように元から hvc1 のものは、-c copy でも hvc1 のまま MP4 に入りました。

MP4を圧縮する方法(CRFとpreset)

この節では、MP4 を小さくするコマンドと、CRF の値ごとのサイズ・時間・画質の実測が分かります。

画質を保ちながら小さくするなら、CRF(Constant Rate Factor)を指定して H.264 で圧縮し直すのが基本です。CRF は「目指す画質」の数字で、小さいほど高画質・大きいほど小さいファイルになります。

ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4

libx264 で CRF を 0〜52 にして試すと、0 は可逆(ロスレス)、52 を指定しても 51 として扱われました。何も指定しないときは 23 です(前の節の crf=23.0)。

CRF ごとの実測(libx264・preset medium)

元の動画(HEVC・10,321,128 バイト)を、CRF だけ変えて圧縮しました。画質の SSIM は「元の動画にどれだけ似ているか」の指標で、1.0 が完全に同じです。PSNR は大きいほど元に近い値です。

CRF サイズ(元との比) 時間 SSIM PSNR
18 14,319,810(139%) 33.6 秒 0.9940 47.6 dB
23(既定) 7,594,105(74%) 18.9 秒 0.9909 44.0 dB
28 3,325,786(32%) 12.9 秒 0.9837 40.3 dB
33 1,782,758(17%) 15.7 秒 0.9772 37.8 dB
40 1,180,289(11%) 10.7 秒 0.9669 35.6 dB

読み取れることです。

  • CRF を 5 上げるたびに、サイズは約半分になりました(23→28 で 7.6MB→3.3MB)。
  • CRF 18 では、元のファイルより 39% 大きくなりました。 元が十分に圧縮された動画だと、低い CRF で圧縮し直すと大きくなります。「圧縮」のつもりで逆効果になる例です。
  • 時間は CPU の混み具合で同じ条件でも 19〜30 秒ほどぶれました。CRF が大きいほど短くなる傾向です。
32%CRF 28 のサイズSSIM 0.984。10.3MB が 3.3MB に
約半分CRF を 5 上げたとき18→23→28→33 でほぼ半分ずつ
139%CRF 18 で逆に増えた元が圧縮済みだと大きくなる

この元の動画は、細かいノイズを全体に加えたテスト映像です。ノイズが多い映像ほど圧縮しにくく、静かな画面の多い動画では同じ CRF でもずっと小さくなります。自分の動画で CRF 23・28 の2つを試し、見比べて決めるのが確実です。

preset:速さと圧縮効率の釣り合い

-preset は、同じ CRF でどれだけ時間をかけて工夫するかを決めます。libx264 の既定は medium です(ffmpeg -h encoder=libx264 の表示 default "medium")。

preset 時間 サイズ SSIM
ultrafast 3.9 秒 19,083,089 0.9934
veryfast 10.1 秒 6,573,346 0.9894
medium(既定) 18.9〜30.1 秒 7,594,105 0.9909
slow 27.4 秒 7,419,792 0.9908

ultrafast は速い代わりに、元の約 1.85 倍の大きさになりました。 preset を変えると同じ CRF でも画質が少し変わるため、サイズだけで比べず、SSIM も合わせて見ます。この動画では、medium と slow は画質がほぼ同じで、slow が 2% 小さくなりました。

解像度を下げて圧縮する

スマホで見る・メールで送るなら、解像度を下げるとサイズが大きく減ります。scale=-2:720 は「高さ 720、幅は縦横比を保って 2 の倍数に」という意味です。

ffmpeg -i input.mp4 -vf scale=-2:720 -c:v libx264 -crf 23 -c:a copy output_720p.mp4
解像度 サイズ 時間
1920x1080(CRF 23) 7,594,105 18.9 秒
1280x720(CRF 23) 1,977,704 8.5 秒

720p にしたことで、同じ CRF 23 でもサイズは 26% になり、時間も半分以下でした。

ビットレートの上限を付ける

CRF だけだと、動きの激しい場面でビットレートが大きく上がります。配信や回線の制限があるときは、-maxrate と -bufsize で上限を付けます。

ffmpeg -i input.mov -c:v libx264 -crf 23 -maxrate 3M -bufsize 6M -c:a copy output.mp4
指定 サイズ 映像の平均ビットレート SSIM
-crf 23 だけ 7,594,105 約 5,937 kb/s 0.9909
-crf 23 -maxrate 3M -bufsize 6M 4,221,911 3,239 kb/s 0.9858

上限に当たる場面だけ画質を下げるので、CRF だけのときより小さくなりました。

10bit の動画は -pix_fmt yuv420p で 8bit にする

10bit の HEVC(HDR の動画など)を libx264 で変換すると、何も指定しなければ 10bit のまま High 10 というプロファイルになりました。H.264 の 10bit は再生できない機器が多いため、-pix_fmt yuv420p で 8bit に揃えます。

# 指定なし
[libx264] profile High 10, level 3.0, 4:2:0, 10-bit
# -pix_fmt yuv420p
[libx264] profile High, level 3.0, 4:2:0, 8-bit

H.264・H.265・AV1 の比べ方

同じ元の動画を、H.265(libx265)と AV1(libsvtav1)でも圧縮しました。

方式 指定 サイズ 時間 SSIM
H.264 -c:v libx264 -crf 23 7,594,105 18.9 秒 0.9909
H.265 -c:v libx265 -crf 24 -tag:v hvc1 7,634,779 24.1 秒 0.9913
H.265 -c:v libx265 -crf 28 -tag:v hvc1(既定) 4,405,432 26.4 秒 0.9875
AV1 -c:v libsvtav1 -crf 35 -preset 8 5,918,446 16.5 秒 0.9908
  • libx265 の CRF の既定は 28 でした(ログの Rate Control / qCompress : CRF-28.0)。libx264 と libx265 では、同じ数字でも画質が違います。
  • このノイズの多いテスト映像では、H.264 の CRF 23 と同じくらいの SSIM で比べると、H.265 はサイズがほぼ同じ、AV1 は 22% 小さくなりました。結果は映像の内容で変わります。

1H.264(libx264)

再生できる機器・ソフト・サイトがいちばん多い。迷ったらこれ。MP4 に -c:a aac と組み合わせる。

2H.265(libx265)

iPhone の「高効率」の形式。Apple 機器向けに MP4 へ入れるときは -tag:v hvc1 を付ける。

3AV1(libsvtav1)

この実測ではいちばん小さかった。CRF の範囲は 0〜63。再生できる環境を先に確かめる。

4-c copy

圧縮し直さないので小さくはならない。入れ物の変更・切り出し・結合を速く行うときに使う。

圧縮する前の確認

ファイルサイズを指定して圧縮する方法(2パス)

この節では、「3MB 以下にしたい」のように上限があるときの圧縮方法が分かります。

CRF は画質を決める方法なので、出来上がりのサイズは決められません。サイズに上限があるときは、ビットレートを計算して、2パス(2回読み込む方式)で圧縮します。

映像のビットレート(kbps) = 目標サイズ(MB) × 8192 ÷ 秒数 − 音声のビットレート(kbps)
例:3MB・10秒・音声128kbps → 3 × 8192 ÷ 10 − 128 = 約 2330 kbps
# Linux・Mac
ffmpeg -y -i input.mov -c:v libx264 -b:v 2330k -pass 1 -an -f null /dev/null
ffmpeg -i input.mov -c:v libx264 -b:v 2330k -pass 2 -c:a aac -b:a 128k output.mp4
rem Windows(コマンドプロンプト)は /dev/null の代わりに NUL
ffmpeg -y -i input.mov -c:v libx264 -b:v 2330k -pass 1 -an -f null NUL
ffmpeg -i input.mov -c:v libx264 -b:v 2330k -pass 2 -c:a aac -b:a 128k output.mp4
方法 サイズ 時間 SSIM
2パス(2330k) 3,113,145 バイト(2.97MB) 34.3 秒 0.9823
1パス(2330k) 3,089,324 バイト 26.6 秒 ―

目標 3MB に対し、2.97MB になりました。 1回目で ffmpeg2pass-0.log と ffmpeg2pass-0.log.mbtree(今回は 2.7MB)が作られるので、終わったら消します。

動画を切り出す方法(-ssの位置とキーフレーム)

この節では、指定した秒から切り出すコマンドと、-c copy で起きる落とし穴が分かります。

# 正確に切る(再エンコード):3秒目から4秒間
ffmpeg -ss 3 -i input.mp4 -t 4 -c:v libx264 -crf 23 -c:a aac clip.mp4

# 速く切る(-c copy):キーフレームの位置からになる
ffmpeg -ss 3 -i input.mp4 -t 4 -c copy clip_copy.mp4

# 終わりの時刻で指定する:1分から2分まで
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c:v libx264 -c:a aac clip.mp4

時刻は 3(秒)・00:01:30・00:01:30.500 のどれでも書けます。-t は長さ、-to は終わりの位置です。ドキュメントには「-to と -t は同時に使えず、-t が優先される」とあります。

キーフレームが 0 秒と 8.33 秒にしかない動画(crf23.mp4)で、3 通りを試した結果です。

コマンド 時間 サイズ 中身
-ss 3 -i 入力 -t 4(再エンコード) 11.9 秒 2,911,858 映像 120 フレーム・4.000 秒
-ss 3 -i 入力 -t 4 -c copy 0.17 秒 5,351,208 映像 212 フレーム(0秒からの分を含む)
-i 入力 -ss 3 -t 4 -c copy 0.08 秒 65,791 映像が入っていない(音声だけ)

3秒目から4秒間を切り出したい

映像が消えたffmpeg -i in.mp4 -ss 3 -t 4 -c copy out.mp4
→
正確に切れたffmpeg -ss 3 -i in.mp4 -t 4 -c:v libx264 -c:a aac out.mp4

-c copy は 3〜7 秒の間にキーフレームが無いと、映像を1枚も書けない

-i の後ろに -ss を置き、-c copy で切り出すと、エラーは出ずに映像の無いファイルができました。 表示には video:0kB とだけ出ます。

$ ffmpeg -hide_banner -y -i crf23.mp4 -ss 3 -t 4 -c copy cut_copy_out.mp4
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
[out#0/mp4 @ 0x55e8984599c0] video:0kB audio:63kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.471809%

ドキュメントの説明は次のとおりです。

  • -ss を -i の前に置くと、入力の中をその位置まで飛ばします。多くの形式では正確には飛べないので、手前の位置に飛び、再エンコードのときはその差を捨てます。ストリームコピーのときは、その差が残ります。
  • -ss を出力の前に置くと、入力を先頭から読み、指定の位置まで捨てます。

-ss を -i の前に置いた -c copy の結果(212 フレーム)は、手前のキーフレーム(0秒)からのデータを含み、再生ソフトには 3 秒目から見せる印(エディットリスト)が付いていました。サイズが再エンコード版の約 1.8 倍なのはこのためです。

目的 選び方
秒単位で正確に・どの再生ソフトでも同じに -ss を -i の前・再エンコード
長い動画からおおまかに速く切る -ss を -i の前・-c copy
-c copy で映像が消えた・先頭が止まる 再エンコードに切り替える

動画を一定の長さで分割する

-f segment で、決めた長さごとのファイルに分けられます。

ffmpeg -i input.mp4 -c copy -f segment -segment_time 3 -reset_timestamps 1 part_%03d.mp4

10秒の動画を 3 秒ずつに分けたつもりが、-c copy では 8.35 秒と 1.67 秒の2つになりました。分割もキーフレームの位置でしかできないためです。3 秒ずつにするには、3 秒ごとにキーフレームを作って再エンコードします。

ffmpeg -i input.mov -c:v libx264 -crf 23 -force_key_frames "expr:gte(t,n_forced*3)" -c:a aac -f segment -segment_time 3 -segment_time_delta 0.05 -reset_timestamps 1 part_%03d.mp4
指定 分かれ方
-c copy -segment_time 3 8.354 秒・1.667 秒
再エンコード+-force_key_frames(delta なし) 6.021 秒・3.000 秒・1.005 秒
再エンコード+-force_key_frames+-segment_time_delta 0.05 3.021 秒・3.000 秒・3.000 秒・1.005 秒

区切る時刻を自分で並べるときは -segment_times を使います。-force_key_frames 2,5 -segment_times 2,5 -segment_time_delta 0.05 で、2.02 秒・3.00 秒・5.005 秒の3つに分かれました。

-segment_time_delta を付けないと最初の区切りがずれました。ドキュメントには、force_key_frames で作ったキーフレームの時刻は丸めの関係で少し手前になることがあり、固定フレームレートなら 1/(2×フレームレート)(30fps なら約 0.017)を指定すると最悪のずれに対応できる、とあります。

動画を結合する方法(concat)

この節では、複数の動画を1本につなぐ2つの方法と、つなげないときの見分け方が分かります。

同じ形式(コーデック・解像度・フレームレート)の動画なら、ファイルの一覧を作って -c copy でつなげます。

# list.txt
file 'a.mp4'
file 'b.mp4'
ffmpeg -f concat -i list.txt -c copy joined.mp4

3 秒の動画 2 本は、0.35 秒で 6.02 秒の1本になりました。

Unsafe file name のエラー

一覧に ./a.mp4 のように . で始まるパスを書くと、次のエラーで止まりました。/ から始まる絶対パスでも同じエラーになりました。

[concat @ 0x5642c8023fc0] Unsafe file name './a.mp4'
[in#0 @ 0x561896f9dec0] Error opening input: Operation not permitted
Error opening input file list_dot.txt.

ドキュメントでは、safe の既定は 1 で、「相対パスで、使える文字だけで、. で始まらない」もの以外を拒みます。./ を外して a.mp4 と書くか、絶対パスを使うなら -safe 0 を -i の前に付けます。

ffmpeg -f concat -safe 0 -i list.txt -c copy joined.mp4

解像度が違う動画を -c copy でつなぐと

ドキュメントには「すべてのファイルは同じストリーム(同じコーデック・同じタイムベースなど)を持つこと」とあります。1280x720 と 1920x1080 の動画を -c copy でつなぐと、エラーは出ずに完成しましたが、ファイルの情報は 1280x720 なのに、中身は前半 90 枚が 1280x720、後半 90 枚が 1920x1080 でした。

$ ffprobe -v error -select_streams v -show_entries frame=width,height -of csv=p=0 mix.mp4 | uniq -c
     90 1280,720
     90 1920,1080

再生ソフトによっては後半の表示が崩れます。形式が違う動画は、concat フィルターで揃えてから再エンコードします。

ffmpeg -i a720.mp4 -i b.mp4 -filter_complex "[0:v]scale=1920:1080,setsar=1[v0];[1:v]setsar=1[v1];[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -crf 23 -c:a aac joined.mp4

こちらは 16.9 秒かかり、180 枚すべてが 1920x1080 になりました。

音声を抽出する・消す・音量を変える方法

この節では、動画から音声だけを取り出す方法と、音を消す・足す・大きさを変える方法が分かります。

やりたいこと コマンド 結果(10秒)
AAC のまま取り出す ffmpeg -i in.mov -vn -c:a copy out.m4a 0.15 秒・163,063 バイト
MP3 にする ffmpeg -i in.mov -vn -c:a libmp3lame -b:a 192k out.mp3 0.21 秒・241,480 バイト
WAV にする ffmpeg -i in.mov -vn -c:a pcm_s16le out.wav 0.07 秒・1,921,102 バイト
音を消す ffmpeg -i in.mp4 -an -c:v copy out.mp4 0.06 秒(映像はコピー)
無音の音声を足す ffmpeg -i in.mp4 -f lavfi -i anullsrc=r=48000:cl=stereo -c:v copy -c:a aac -shortest out.mp4 0.08 秒
音量を 6dB 下げる ffmpeg -i in.m4a -af "volume=-6dB" out.m4a 平均 −24.1dB → −30.1dB
先頭に2秒の黒画面と無音を足す ffmpeg -i in.mp4 -vf tpad=start_duration=2:color=black -af adelay=2s:all=1 out.mp4 3 秒 → 5 秒

-vn は「映像を入れない」という意味です。AAC の音声を -c:a copy で .mp3 に入れようとすると、次のエラーになりました。 MP3 のファイルには MP3 の音声しか入らないためです。

[mp3 @ 0x55cbea969fc0] Invalid audio stream. Exactly one MP3 audio stream is required.
[out#0/mp3 @ 0x55cbea930f00] Could not write header (incorrect codec parameters ?): Invalid argument

音量は volumedetect フィルターで測れます。

$ ffmpeg -i audio.m4a -af volumedetect -f null -
[Parsed_volumedetect_0 @ 0x55a1f3f9d040] mean_volume: -24.1 dB
[Parsed_volumedetect_0 @ 0x55a1f3f9d040] max_volume: -20.8 dB

動画をGIFにする方法

この節では、動画の一部を GIF にするコマンドと、画質とサイズの違いが分かります。

# かんたん
ffmpeg -ss 2 -t 3 -i input.mov -vf "fps=10,scale=480:-1" out.gif

# きれい(その動画に合わせた256色を作って使う)
ffmpeg -ss 2 -t 3 -i input.mov -vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif

GIF は 256 色までしか使えません。palettegen はその動画に合う 256 色を選び、paletteuse はそれを使って変換します。2 秒目から 3 秒間・幅 480・10fps で比べました。

方法 サイズ 時間 PSNR(大きいほど元に近い)
かんたん 305,328 バイト 1.8 秒 28.3 dB
palettegen 1,510,953 バイト 2.6 秒 37.7 dB
palettegen(64色・dither=bayer) 634,337 バイト 1.8 秒 31.1 dB

palettegen は画質がいちばん高く、サイズも約 5 倍になりました。小さくしたいときは fps を下げる・幅を小さくする・palettegen=max_colors=64 で色数を減らすと効きます。

解像度・回転・フレームレート・再生速度を変える方法

この節では、映像の見た目を変える主なフィルターと、その結果が分かります。

やりたいこと コマンド 結果
720p にする -vf scale=-2:720 1920x1080 → 1280x720
時計回りに 90 度回転 -vf transpose=1 1920x1080 → 1080x1920(6.6 秒)
反時計回りに 90 度回転 -vf transpose=2 ―
180 度回転 -vf "hflip,vflip" ―
再エンコードせずに回転の情報だけ付ける ffmpeg -display_rotation -90 -i in.mp4 -c copy out.mp4 0.10 秒
30fps → 24fps -r 24 3 秒で 74 フレーム
2 倍速 -filter_complex "[0:v]setpts=PTS/2[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" 3 秒 → 1.57 秒

transpose の値は、ドキュメントでは 0 が「反時計回り+上下反転」、1 が「時計回り」、2 が「反時計回り」、3 が「時計回り+上下反転」です。

-display_rotation は、ドキュメントでは「反時計回りに何度回して表示するか」の情報を書き込むオプションです。 90 を指定すると transpose=2(反時計回り)と同じ向きになり、時計回りにするには -90 を指定しました(ffmpeg で復号した画像を比べて、transpose=1 と画素の差が 0 でした)。映像そのものは回さないので一瞬で終わりますが、回転の情報を見ない再生ソフトでは横向きのままです。

幅か高さが奇数だとエラーになる

H.264(yuv420p)は、幅と高さが 2 の倍数である必要があります。scale=1281:720 にすると次のエラーで止まりました。

[libx264 @ 0x55b1d9654f40] width not divisible by 2 (1281x720)
[vost#0:0/libx264 @ 0x55b1d9606b80] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.
Conversion failed!

縦横比を保つときは -1 ではなく -2 を使うと、2 の倍数に揃えてくれます(scale=-2:720)。

字幕を入れる方法(焼き込み・切り替え式)

この節では、字幕を映像に描き込む方法と、オン・オフできる字幕として入れる方法が分かります。

方法 コマンド 特徴
焼き込み ffmpeg -i in.mp4 -vf "subtitles=sub.srt" -c:a copy out.mp4 どの再生ソフトでも見える。消せない。再エンコード(7.6 秒)
切り替え式(MP4) ffmpeg -i in.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text out.mp4 オン・オフできる。映像はコピー(0.08 秒)

字幕のフォントと大きさは force_style で指定できます。この記事では日本語フォントの Noto Sans CJK JP を指定し、「こんにちは、字幕のテストです」が画面の下に描かれたことを確かめました。

ffmpeg -i in.mp4 -vf "subtitles=sub.srt:force_style='FontName=Noto Sans CJK JP,FontSize=28'" -c:a copy out.mp4
# sub.srt
1
00:00:00,500 --> 00:00:02,500
こんにちは、字幕のテストです

SRT のまま -c copy で MP4 に入れようとすると、次のエラーになりました。 MP4 の字幕は mov_text 形式にする必要があります。

[mp4 @ 0x55d3c0ce8500] Could not find tag for codec subrip in stream #2, codec not currently supported in container
[out#0/mp4 @ 0x55d3c0c56e00] Could not write header (incorrect codec parameters ?): Invalid argument

サムネイル・静止画を作る方法と、画像から動画を作る方法

この節では、動画から画像を取り出す方法と、画像や音声から動画を作る方法が分かります。

やりたいこと コマンド 結果
5 秒目を1枚 ffmpeg -ss 5 -i in.mov -frames:v 1 -q:v 2 thumb.jpg 1.9 秒・135,674 バイト
1 秒ごとに全部 ffmpeg -i in.mov -vf fps=1 f_%04d.png 10 枚(f_0001.png〜)
一覧画像(5×2) ffmpeg -i in.mov -vf "fps=1,scale=320:-1,tile=5x2" -frames:v 1 tile.jpg 1 枚に 10 コマ
連番画像 → 動画 ffmpeg -framerate 1 -i f_%04d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4 10 枚 → 10 秒
静止画+音声 → 動画 ffmpeg -loop 1 -i thumb.jpg -i audio.m4a -c:v libx264 -tune stillimage -c:a copy -shortest -pix_fmt yuv420p out.mp4 音声と同じ 10.0 秒
透かし(ロゴ)を右下に ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=W-w-20:H-h-20" -c:a copy out.mp4 6.3 秒

%04d は「4 桁の連番」です。-q:v は JPEG の画質で、小さいほど高画質です。-shortest は、ドキュメントでは「いちばん短いストリームが終わったら終える」オプションで、-loop 1 で無限に続く静止画を、音声の長さで止めます。

複数のファイルを一括で変換する方法

この節では、フォルダの中の MOV をまとめて MP4 にするコマンドが分かります。

# Linux・Mac(bash・zsh)
for f in *.mov; do
  ffmpeg -n -i "$f" -c:v libx264 -crf 23 -c:a aac "${f%.*}.mp4"
done
rem Windows コマンドプロンプト(.bat に書くときは %f を %%f にする)
for %f in (*.mov) do ffmpeg -n -i "%f" -c:v libx264 -crf 23 -c:a aac "%~nf.mp4"
# Windows PowerShell
Get-ChildItem *.mov | ForEach-Object { ffmpeg -n -i $_.FullName -c:v libx264 -crf 23 -c:a aac ($_.BaseName + ".mp4") }

bash の版で、clip1.mov と clip2.mov が clip1.mp4・clip2.mp4 になりました。-n を付けると、同じ名前の出力が既にあるときは飛ばすので、途中で止めてやり直すときに便利です。ループの書き方は、関連記事「シェルスクリプトのfor・whileループ|ファイルを1行ずつ読む書き方」で扱っています。PowerShell の書き方は、関連記事「PowerShellコマンド一覧|用途別50選とbash対応表・実行例付き」で扱っています。

プログラムから ffmpeg を呼ぶときは、Python なら subprocess で同じ引数を配列で渡します。関連記事「Python subprocessの使い方|run・Popenの違いと例外処理の実例」で扱っています。

ffprobeで動画の情報を見る方法

この節では、変換の前に動画のコーデック・解像度・長さを確かめる方法が分かります。

ffprobe は ffmpeg と一緒に入る、情報を見るためのコマンドです。

$ ffprobe -v error -show_entries format=duration,size,bit_rate:stream=codec_type,codec_name,width,height,r_frame_rate,sample_rate -of json input.mov
{
    "streams": [
        { "codec_name": "hevc", "codec_type": "video", "width": 1920, "height": 1080, "r_frame_rate": "30/1" },
        { "codec_name": "aac", "codec_type": "audio", "sample_rate": "48000", "r_frame_rate": "0/0" }
    ],
    "format": { "duration": "10.000000", "size": "10321128", "bit_rate": "8256902" }
}

(programs の空の配列を省き、各ストリームを1行にまとめています。)

見たいもの コマンド
ざっと全部 ffprobe input.mov
映像のコーデックと解像度だけ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height -of csv=p=0 input.mov → hevc,1920,1080
キーフレームの位置 ffprobe -v error -select_streams v -skip_frame nokey -show_entries frame=pts_time -of csv=p=0 input.mp4
回転の情報 ffprobe -v error -select_streams v -show_entries stream_side_data=rotation -of csv=p=0 input.mp4

Web公開用に変換する方法(faststart・HLS)

この節では、Web ページで動画をすぐ再生させるための設定が分かります。

MP4 には「目次(moov)」があり、ffmpeg は既定でファイルの最後に書きます。ブラウザは目次を読むまで再生を始められないため、Web に置く MP4 は -movflags +faststart で目次を先頭に移します。

ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4

ファイルの中の並びを Python で調べた結果です。

crf23.mp4 ftyp@0(32) free@32(8) mdat@40(7581787) moov@7581827(12278)
fs.mp4    ftyp@0(32) moov@32(12278) free@12310(8) mdat@12318(7581787)

moov(目次)が 7,581,827 バイト目から 32 バイト目に移りました。ドキュメントには「2回目の処理で目次をファイルの先頭に移す。時間がかかることがあり、分割形式の出力などでは使えないので、既定では有効にしていない」とあります。

HLS(m3u8)に分ける・MP4 に戻す

HLS は、動画を短いファイル(.ts)に分け、一覧(.m3u8)で順に再生する配信の形式です。自分の動画を HLS にする・HLS を1本の MP4 に戻すコマンドです。

ffmpeg -i input.mp4 -c copy -f hls -hls_time 4 -hls_playlist_type vod hls/index.m3u8
ffmpeg -i hls/index.m3u8 -c copy output.mp4
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:8.333333,
index0.ts
#EXTINF:1.666667,
index1.ts
#EXT-X-ENDLIST

-hls_time 4 でも、-c copy ではキーフレームの位置(8.33 秒)で分かれました。MP4 に戻すと 0.14 秒で 10.03 秒の1本になりました。

RTMP で配信サーバーに送る

ライブ配信のサーバーへ送るときは、-re(再生と同じ速さで読む)を付けて FLV 形式で RTMP の URL に送ります。配信サービスの URL とキーは、各サービスの管理画面に出ます。

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 3M -maxrate 3M -bufsize 6M -g 60 -c:a aac -b:a 128k -f flv rtmp://サーバー/アプリ名/ストリームキー

手元で受け手の ffmpeg(ffmpeg -listen 1 -i rtmp://127.0.0.1:27801/live/test -c copy recv.flv)を立てて 3 秒の動画を送ると、送信に 3.00 秒かかり(-re で実時間になる)、受け手に H.264・AAC の 3.08 秒の FLV が残りました。-g 60 は 60 フレームごと(30fps なら 2 秒ごと)にキーフレームを入れる指定です。同じ動画を繰り返し送るときは、-stream_loop -1 を -i の前に付けます(ドキュメントでは −1 で無限に繰り返す)。

処理を速くする方法(preset・GPU)

この節では、変換に時間がかかるときに選べる手段が分かります。

手段 効果(この記事の実測) 注意
-c copy で済ませる 0.13 秒(再エンコードは 19〜30 秒) 圧縮・加工はできない
解像度を下げる 720p で 8.5 秒(1080p は 18.9 秒) 画質も下がる
-preset veryfast 10.1 秒(medium は 18.9〜30.1 秒) 同じ CRF でも画質が少し変わる
GPU のエンコーダー ― パソコンの GPU と、ビルドの対応が必要

GPU のエンコーダーは名前が分かれています。この記事のビルドには h264_nvenc(NVIDIA)・h264_qsv(Intel)・h264_vaapi などがありました。ただし、GPU が無い環境で h264_nvenc を使うと次のエラーになりました。

[h264_nvenc @ 0x55ceb46ba700] Cannot load libcuda.so.1
[vost#0:0/h264_nvenc @ 0x55ceb46ba340] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.

h264_nvenc は CRF ではなく -cq(0〜51)で画質を指定し、preset は p1(最速)〜p7(最高画質)、既定は p4 です(ffmpeg -h encoder=h264_nvenc の表示)。使えるかは ffmpeg -encoders で確かめます。

ffmpegのよくあるエラーと直し方

この節では、ffmpeg でよく出るエラーの原文と、原因・直し方が分かります。 Windows の PATH のメッセージと Non-monotonic DTS(ffmpeg 6.1.1 の実行ファイルにある文言)を除き、この記事で実際に出たものです。

エラー(原文) 原因 直し方
'ffmpeg' は、内部コマンドまたは外部コマンド、…認識されていません。 PATH に ffmpeg の bin が無い PATH に追加し、ターミナルを開き直す
Error opening input: No such file or directory 入力ファイルが無い・名前やフォルダが違う cd でフォルダに移るか、パスを " で囲んで書く
At least one output file must be specified 出力ファイル名を書いていない 最後に出力ファイル名を書く
Output file does not contain any stream -i を書き忘れた、または -vn -an で全部消した -i 入力 を確かめる
File 'out.mp4' already exists. Overwrite? [y/N] 出力が既にある -y で上書き、-n で飛ばす
FFmpeg cannot edit existing files in-place. 入力と出力が同じファイル名 別の名前で出力する
Unknown encoder 'libfdk_aac'('libx264' なども同じ形) そのビルドに無いエンコーダー -c:a aac など、ffmpeg -encoders にあるものを使う
Non-monotonic DTS in output stream 0:0; previous: …, current: …; タイムスタンプが前後している(結合した動画など) 再エンコードして作り直す
Unrecognized option 'crf23'. オプションと値の間の空白が無い -crf 23 と書く
Invalid duration for option t: abc 時間の書き方が違う -t 4・-t 00:00:04
width not divisible by 2 (1281x720) 幅か高さが奇数 scale=-2:720 のように -2 を使う
moov atom not found 途中で止まった・壊れた MP4 元のファイルから作り直す
Unsafe file name './a.mp4' concat の一覧に ./ や絶対パス ./ を外すか -safe 0 を付ける
Could not find tag for codec subrip … SRT のまま MP4 に入れた -c:s mov_text にする
Exactly one MP3 audio stream is required. AAC をコピーで .mp3 に入れた -c:a libmp3lame にする
Cannot load libcuda.so.1 NVIDIA の GPU・ドライバーが無い libx264 に戻す
エラー無しで video:0kB -c copy の切り出しにキーフレームが無い -ss を -i の前へ・再エンコード

moov atom not found は、7.6MB の MP4 の先頭 3MB だけを切り取ったファイルで出ました。ffmpeg が書き込み中に止まった MP4 は、最後にある目次(moov)が無いので、この状態になります。

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x565041f13fc0] moov atom not found
[in#0 @ 0x55e586ca9ec0] Error opening input: Invalid data found when processing input

ファイル名に空白や日本語があるときは、" で囲みます(ffmpeg -i "旅行 動画.mov" out.mp4)。

よくある質問

Q. ffmpeg とは何ですか?無料ですか? A. 動画と音声の変換・圧縮・切り出し・結合などを行うオープンソースのソフトで、無料です。ライセンスは LGPL 2.1 以降で、GPL の部品を有効にしたビルドは GPL になります。「ffmpegとは(できることと料金)」の節に概要があります。

Q. ffmpeg のインストール方法は? A. Windows は winget install ffmpeg、Mac は brew install ffmpeg、Ubuntu は sudo apt install ffmpeg です。ZIP で入れたときは bin フォルダを PATH に足し、ffmpeg -version で確かめます。

Q. MOV を MP4 に変換すると画質は落ちますか? A. ffmpeg -i in.mov -c copy out.mp4 なら作り直さないので落ちません。実測では 0.13 秒で終わりました。H.264 に作り直す(-c:v libx264)と、CRF に応じて少し落ちます。

Q. MP4 を画質を落とさずに圧縮できますか? A. 圧縮し直すと、画質は必ず少し落ちます。目で見て差が分かりにくい範囲で小さくするなら、-crf 23〜28 を試します。実測では CRF 28 で 32% のサイズ・SSIM 0.984 でした。

Q. CRF はいくつにすればいいですか? A. libx264 の既定は 23 で、5 上げるとサイズはほぼ半分になりました。元が圧縮済みの動画に 18 などの小さい値を使うと、元より大きくなることがあります(実測で 139%)。

Q. ffmpeg で決まったサイズ以下にするには? A. 「目標 MB × 8192 ÷ 秒数 − 音声 kbps」で映像のビットレートを出し、2パスで圧縮します。3MB を目標にして 2.97MB になりました。

Q. 切り出した動画の最初が止まる・映像が無いのはなぜ? A. -c copy はキーフレームの位置でしか切れないためです。-ss を -i の前に置き、-c:v libx264 -c:a aac で再エンコードすると正確に切れます。

Q. 結合した動画がおかしくなります。 A. concat の -c copy は、全部の動画が同じコーデック・解像度・フレームレートであることが前提です。違う場合は concat フィルターで揃えて再エンコードします。

Q. 変換中に止めるには?表示を減らすには? A. q を押すと止まります。起動時の版情報は -hide_banner、途中の表示は -loglevel error で減らせます。

Q. GUI(画面)で使えますか? A. ffmpeg 自体には画面が無く、コマンドで操作します。よく使う操作は、この記事の早見表のコマンドをコピーしてファイル名だけ変えれば使えます。

まとめ

  • ffmpeg の基本は ffmpeg -i 入力 オプション 出力。オプションは次に書いたファイルに効く。
  • MOV→MP4 は -c copy なら 0.13 秒・画質そのまま。互換性を上げるなら -c:v libx264 -c:a aac。
  • 圧縮は -crf。libx264 の既定は 23、5 上げるとサイズはほぼ半分。CRF 18 では元より大きくなった。
  • サイズの上限があるときは、ビットレートを計算して2パス。
  • -c copy の切り出し・分割はキーフレームの位置になる。-i の後ろの -ss では映像が 0KB になった。
  • 結合は concat。形式が違う動画は concat フィルターで揃える。
  • エラーの原文(width not divisible by 2・Unsafe file name など)から、原因と直し方を表で引ける。

参考・出典

確認日はいずれも 2026年10月22日です。

  • FFmpeg「Download FFmpeg」:https://ffmpeg.org/download.html
  • FFmpeg「About FFmpeg」:https://ffmpeg.org/about.html
  • FFmpeg「License and Legal Considerations」:https://ffmpeg.org/legal.html
  • FFmpeg「ffmpeg Documentation」:https://ffmpeg.org/ffmpeg.html
  • FFmpeg「FFmpeg Formats Documentation」:https://ffmpeg.org/ffmpeg-formats.html
  • FFmpeg「FFmpeg Filters Documentation」:https://ffmpeg.org/ffmpeg-filters.html
  • FFmpeg「FFmpeg Codecs Documentation」:https://ffmpeg.org/ffmpeg-codecs.html
  • FFmpeg「ffprobe Documentation」:https://ffmpeg.org/ffprobe.html
  • gyan.dev「FFmpeg Builds」:https://www.gyan.dev/ffmpeg/builds/
  • Homebrew Formulae「ffmpeg」:https://formulae.brew.sh/formula/ffmpeg
  • Apple サポート「Using HEIF or HEVC media on Apple devices」:https://support.apple.com/en-us/116944
  • Apple Developer「HLS Authoring Specification for Apple Devices」:https://developer.apple.com/documentation/http-live-streaming/hls-authoring-specification-for-apple-devices

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ffmpegの使い方|MOV→MP4変換・圧縮・切り出しを実測で解説」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?