- 技術 💻
ffmpegの使い方|MOV→MP4変換・圧縮・切り出しを実測で解説
結論
ffmpegは「ffmpeg -i 入力 オプション 出力」の形で、動画の変換・圧縮・切り出しを行う無料のコマンドです。MOV→MP4は -c copy なら0.13秒で終わりました。
この記事でわかること
- 変換・圧縮・GIFなど目的別コマンド10種の早見表
- CRF 5段階のサイズ・時間・画質(SSIM)の実測表
- -c copyで映像が0KBになる例など、エラー17種の直し方
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 を通す
パッケージマネージャーを使わない場合の手順です。
ZIP をダウンロードする
FFmpeg 公式のダウンロードページから Windows の配布元(gyan.dev など)へ進み、release builds の essentials か full の ZIP を保存します。
展開して置き場所を決める
展開したフォルダを C:\ffmpeg などに置きます。中の bin フォルダに ffmpeg.exe・ffprobe.exe があります。
環境変数 PATH に bin を足す
「システム環境変数の編集」→「環境変数」→ ユーザー環境変数の Path →「新規」で C:\ffmpeg\bin を追加します。
ターミナルを開き直して確かめる
新しいコマンドプロンプトで ffmpeg -version を実行し、版が表示されれば完了です。where ffmpeg で、どの exe が使われるかも分かります。
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 |
どちらを選ぶか
| 状況 | 選ぶコマンド |
|---|---|
| 拡張子を 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 が大きいほど短くなる傾向です。
この元の動画は、細かいノイズを全体に加えたテスト映像です。ノイズが多い映像ほど圧縮しにくく、静かな画面の多い動画では同じ 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
圧縮し直さないので小さくはならない。入れ物の変更・切り出し・結合を速く行うときに使う。
圧縮する前の確認
-t 10)で CRF を2つ試し、見比べたファイルサイズを指定して圧縮する方法(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.mp4ffmpeg -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期連続の黒字決算。