「OBS をインストールするほどではないけど、サクッと画面録画したい」「OS 別にコマンドが違うらしいけど、まとまった情報がない」——そんな悩みを解決するのがこの記事です。Windows / macOS / Linux すべてのプラットフォームで FFmpeg だけを使ってデスクトップを録画する方法を、システム音声の同時録音まで含めて 1 ページに集約しました。
動作確認: FFmpeg 8.1(Windows 11 / macOS 14 Sonoma / Ubuntu 24.04 で検証)
この記事でわかること
- OS 別の画面キャプチャ入力デバイス(gdigrab / ddagrab / avfoundation / x11grab)の使い分け
- 全画面・領域指定・マウスカーソル表示など基本テクニック
- システム音声を同時録音する方法(VB-Cable / BlackHole / PulseAudio loopback)
- 録画ファイルが巨大になる原因と CRF / preset の最適値
- 録画後に切り抜き・トリム・再圧縮する後処理コマンド
- よくあるエラー(Permission denied / Could not find video device など)の解決策
必要な FFmpeg ビルド
入力デバイスごとに必要なビルドフラグが違います。ffmpeg -devices で利用可能なデバイス一覧を確認できます。
| OS | デバイス | 必要なビルドフラグ | 備考 |
|---|---|---|---|
| Windows | gdigrab | デフォルトで含まれる | GDI ベース、互換性最優先 |
| Windows | ddagrab | --enable-libdxva2 系(公式 Windows ビルドに含まれる) | DXGI、FFmpeg 5.0+ |
| Windows | dshow | デフォルトで含まれる | 音声・カメラキャプチャ用 |
| macOS | avfoundation | デフォルトで含まれる(brew install ffmpeg) | macOS 10.7 以降 |
| Linux | x11grab | --enable-libxcb | X11 セッションが必要 |
| Linux | pulse | --enable-libpulse | システム音声 / マイクキャプチャ |
確認コマンド:
ffmpeg -devices
gdigrab, avfoundation, x11grab といった行が出力されれば利用可能です。
Windows: gdigrab で画面録画
全画面を録画
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
-i desktop がプライマリディスプレイ全体を表します。映像コーデックを指定しない場合、コンテナ(mp4)に応じて libx264 が自動選択されます。
品質と CPU 負荷を明示する
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p output.mp4
| オプション | 意味 |
|---|---|
-framerate 30 | 入力フレームレート(録画前に必ず指定) |
-preset ultrafast | リアルタイムキャプチャでドロップフレームを防ぐ |
-crf 23 | 画質(数値が小さいほど高画質、推奨 18〜28) |
-pix_fmt yuv420p | プレーヤー互換性のため必須 |
領域指定(部分録画)
ffmpeg -f gdigrab -framerate 30 -offset_x 100 -offset_y 50 -video_size 1280x720 -i desktop output.mp4
-offset_x と -offset_y は左上原点、-video_size は幅×高さです。-video_size は -i より前に置く必要がある 点に注意してください。
マウスカーソルを録画
gdigrab は デフォルトでカーソルを含めます。除外したい場合は -draw_mouse 0 を指定します。
ffmpeg -f gdigrab -framerate 30 -draw_mouse 0 -i desktop output.mp4
特定ウィンドウだけを録画
ffmpeg -f gdigrab -framerate 30 -i title="メモ帳" output.mp4
ウィンドウタイトルを完全一致で指定します。タイトルに半角スペースが含まれる場合はクォートで囲んでください。
Windows: ddagrab (DXGI) で高速録画
ddagrab は Windows 8 以降の Desktop Duplication API を使った GPU ベースのキャプチャです。gdigrab と比べて以下の利点があります。
- 4K@60fps でも CPU 使用率が 5〜10% 程度
- HDR ディスプレイのキャプチャに対応
- ティアリング(画面の裂け)が少ない
基本コマンド(ハードウェアエンコード推奨)
ffmpeg -f lavfi -i ddagrab=output_idx=0:framerate=60 -c:v h264_nvenc -cq 20 -preset p5 output.mp4
| オプション | 意味 |
|---|---|
-f lavfi -i ddagrab=... | filter source として呼び出す(device ではない点に注意) |
output_idx=0 | プライマリディスプレイ(複数モニタ時は 1, 2… ) |
framerate=60 | 60fps キャプチャ |
h264_nvenc | NVIDIA GPU エンコーダ(AMD なら h264_amf、Intel なら h264_qsv) |
CPU エンコードに切り替える
NVENC / AMF が使えない環境では hwdownload でフレームを CPU メモリに移してから libx264 でエンコードします。
ffmpeg -f lavfi -i ddagrab=output_idx=0:framerate=60 -vf "hwdownload,format=bgra,format=yuv420p" -c:v libx264 -preset ultrafast -crf 20 output.mp4
ddagrab の出力は GPU テクスチャのままなので、hwdownload を挟まないと CPU エンコーダが受け付けません。
gdigrab vs ddagrab vs OBS
| 項目 | gdigrab | ddagrab | OBS Studio |
|---|---|---|---|
| 対応 OS | Windows XP+ | Windows 8+ | Windows / macOS / Linux |
| CPU 負荷(4K60p) | 高(30〜50%) | 低(5〜10%) | 低(GPU 利用時) |
| HDR キャプチャ | 不可 | 可 | 可 |
| シーン切替 | 不可 | 不可 | 可 |
| 配信機能 | 別途 RTMP 設定 | 別途 RTMP 設定 | 標準搭載 |
| 学習コスト | 低 | 中 | 中〜高 |
ライブ配信や複雑な合成が必要なら OBS、単発の画面録画なら ddagrab が最速 です。
macOS: avfoundation で画面録画
デバイス一覧を確認
ffmpeg -f avfoundation -list_devices true -i ""
出力例:
[AVFoundation indev] AVFoundation video devices:
[AVFoundation indev] [0] FaceTime HD Camera
[AVFoundation indev] [1] Capture screen 0
[AVFoundation indev] [2] Capture screen 1
[AVFoundation indev] AVFoundation audio devices:
[AVFoundation indev] [0] MacBook Pro Microphone
[AVFoundation indev] [1] BlackHole 2ch
Capture screen 0 がプライマリディスプレイです。
画面のみ録画
ffmpeg -f avfoundation -framerate 30 -i "1" -c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p output.mp4
-i "1" の数字は上のリストで Capture screen 0 に割り当てられたインデックスです(環境により変わります)。
画面 + 内蔵マイクを同時録音
ffmpeg -f avfoundation -framerate 30 -i "1:0" -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k output.mp4
"映像インデックス:音声インデックス" のコロン区切りで指定します。
画面 + Webカメラ(PinP 風)
ffmpeg -f avfoundation -framerate 30 -i "1" -f avfoundation -framerate 30 -i "0" -filter_complex "[1:v]scale=320:-1[pip];[0:v][pip]overlay=W-w-20:H-h-20" -c:v libx264 -preset ultrafast output.mp4
メイン画面の右下に Web カメラ映像をオーバーレイ表示します。
権限の付与(重要)
macOS 10.15 Catalina 以降、初回実行時に 画面収録の許可ダイアログ が出ます。許可しない場合は黒い動画になります。
- ターミナル(または iTerm)で初回実行
- 「ターミナルが画面収録を要求しています」のダイアログで「OK」
- 「システム設定 → プライバシーとセキュリティ → 画面収録」でターミナルにチェック
- ターミナルを再起動
macOS: avfoundation vs QuickTime Player
| 項目 | FFmpeg avfoundation | QuickTime Player |
|---|---|---|
| エンコーダ選択 | 自由(libx264, hevc_videotoolbox 等) | H.264 / HEVC 固定 |
| マイク + システム音声 | 別途 BlackHole などが必要 | 内蔵マイクのみ |
| バッチ処理 | 可能 | 不可 |
| GUI | なし | あり |
| 起動の手軽さ | コマンド | クリックのみ |
Linux: x11grab で画面録画
X11 セッション前提です。Wayland では別途対応が必要(後述)。
ディスプレイの確認
echo $DISPLAY
通常は :0 または :0.0 が返ります。
全画面を録画
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p output.mp4
| オプション | 意味 |
|---|---|
-video_size 1920x1080 | キャプチャ範囲のサイズ(必須) |
-i :0.0 | DISPLAY 環境変数の値 |
xdpyinfo | grep dimensions で正確な解像度を取得できます。
領域指定
ffmpeg -f x11grab -framerate 30 -video_size 1280x720 -i :0.0+100,50 -c:v libx264 -preset ultrafast output.mp4
:0.0+x,y の形式でオフセットを指定します。
マウスカーソルを除外
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -draw_mouse 0 -i :0.0 -c:v libx264 -preset ultrafast output.mp4
-draw_mouse 0 は -i より 前 に置きます。
Wayland への対応
Wayland セッション(GNOME 40+ や最新の KDE)では x11grab が動きません。FFmpeg は Wayland をネイティブには扱えないので、以下のいずれかを選びます。
- PipeWire 経由(推奨) —
wf-recorder(wlroots 系)やgpu-screen-recorderで録画し、必要なら FFmpeg で後処理 - kmsgrab — root 権限と
CAP_SYS_ADMINが必要、扱いにくいが可能 - Xwayland セッションに切り替え — ログイン画面で X11 セッションを選択
kmsgrab の最小例:
ffmpeg -device /dev/dri/card0 -f kmsgrab -i - -vf "hwdownload,format=bgr0" -c:v libx264 -preset ultrafast output.mp4
Linux キャプチャ手段の比較
| 手段 | セッション | 権限 | 難易度 | 備考 |
|---|---|---|---|---|
| x11grab | X11 | 一般ユーザー | 易 | 安定・実績多数 |
| kmsgrab | X11/Wayland | root or CAP_SYS_ADMIN | 難 | 低レベル DRM 経由 |
| wf-recorder | wlroots Wayland | 一般ユーザー | 中 | Sway / Hyprland など |
| gpu-screen-recorder | X11/Wayland | 一般ユーザー | 易 | NVENC / VAAPI 対応 |
システム音声を同時録音する
これが画面録画で 最も質問が多いトピック です。OS 標準では「スピーカーから出ている音」を直接録ることができないため、仮想オーディオデバイスを 1 つ挟みます。
Windows: VB-CABLE で取得
- VB-CABLE をインストール
- Windows のサウンド設定で 再生デバイスを「CABLE Input」 に切り替え
- FFmpeg からは録音デバイスとして「CABLE Output」を指定
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="CABLE Output (VB-Audio Virtual Cable)" -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 192k output.mp4
利用可能な音声デバイス一覧:
ffmpeg -list_devices true -f dshow -i dummy
macOS: BlackHole で取得
brew install blackhole-2chでインストール- Audio MIDI 設定 で「複数出力装置」を作り、スピーカー + BlackHole 2ch を含める
- システムの出力先をその複数出力装置に設定
- FFmpeg では BlackHole を入力に指定
ffmpeg -f avfoundation -framerate 30 -i "1:1" -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 192k output.mp4
"1:1" の 2 つ目の 1 は先ほどの -list_devices で BlackHole に割り当てられたインデックスです。
Linux: PulseAudio loopback で取得
PulseAudio / PipeWire 環境では「モニタソース」が標準で用意されています。
pactl list short sources
alsa_output.pci-XXXX.analog-stereo.monitor のような名前を探します。
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 192k output.mp4
システム音声 + マイクをミックスする
3 つの入力を amix でミックスします(PulseAudio 例)。
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo -filter_complex "[1:a][2:a]amix=inputs=2:duration=longest[a]" -map 0:v -map "[a]" -c:v libx264 -preset ultrafast -c:a aac -b:a 192k output.mp4
Windows / macOS でも同じ amix パターンが使えます。マイクの音量を下げたい場合は [2:a]volume=0.5[mic] のように明示的に音量調整を入れてください。
ファイルサイズと画質のバランス
スクリーンキャストは「同じピクセルが続くシーン」が多いので、動画よりずっと圧縮効率が高くなります。
推奨プリセット
| 用途 | preset | CRF | 想定サイズ(30 分・1080p30) |
|---|---|---|---|
| リアルタイム録画 | ultrafast | 23 | 約 800 MB |
| 後処理前提(録画優先) | superfast | 20 | 約 1.2 GB |
| 録画後に再エンコード | ultrafast + 再エンコード medium CRF 22 | — | 録画 800 MB → 最終 200 MB |
録画優先の鉄則
録画中は 必ず -preset ultrafast か superfast を使います。medium 以上だとエンコードが追いつかず、frame= 120 fps= 18 のようにフレームドロップが発生します。
録画後に再エンコードしてサイズを 1/4 に
ここからは通常の動画ファイルへの後処理なので、Linux/macOS の CI でも検証できます。
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 24 -c:a aac -b:a 128k output.mp4
スクリーンキャスト向け H.265
H.265(HEVC)はテキストやスクロール画面でさらに圧縮率が上がります。
ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 26 -tag:v hvc1 -c:a aac -b:a 128k output.mp4
-tag:v hvc1 を付けると Apple QuickTime / iOS で再生できるようになります。
録画を後処理する
トリミング(不要な前後をカット)
ffmpeg -ss 00:00:05 -to 00:01:30 -i input.mp4 -c copy output.mp4
-ss を -i の前に置くと高速で、ほぼ瞬時に終わります。
特定領域だけ切り抜く(crop)
ffmpeg -i input.mp4 -vf "crop=in_w-200:in_h-100:100:50" output.mp4
crop=幅:高さ:x:y の形式です。in_w / in_h を使うと元の解像度に対する相対指定ができ、サイズ違いでもエラーになりません。固定値で指定する場合は crop=1280:720:100:50 のように書きます。
解像度を半分に(軽量化)
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" -c:v libx264 -preset medium -crf 23 -c:a copy output.mp4
音声だけ抽出
ffmpeg -i input.mp4 -vn -c:a copy output.m4a
トラブルシューティング
Could not find video device with name [desktop](Windows)
-f gdigrab の指定漏れです。-i desktop の前に必ず -f gdigrab を付けます。
# 間違い
ffmpeg -i desktop output.mp4
# 正しい
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
Permission denied / 黒い画面(macOS)
「画面収録」の権限が付与されていません。システム設定 → プライバシーとセキュリティ → 画面収録 からターミナルアプリを有効化し、ターミナルを完全に再起動してください。
Cannot open display :0 / BadAccess (Linux)
X11 セッションでない(Wayland になっている)か、SSH 経由で実行している可能性があります。
echo $XDG_SESSION_TYPE
wayland と返れば Wayland セッションです。X11 セッションでログインし直すか、wf-recorder などの代替手段を使ってください。
フレームドロップ(frame= XXX fps= 5)
エンコード負荷が録画フレームレートに追いついていません。以下を順に試します。
-preset ultrafastに変更-crfを上げる(23 → 28)- 解像度を下げる(4K → 1080p)
- ハードウェアエンコーダ(
h264_nvenc/hevc_videotoolbox)に切り替え
音声と映像がズレる
入力デバイスのクロックが揃わないと発生します。-async 1 または -vsync cfr を追加します。
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="マイク" -vsync cfr -c:v libx264 -preset ultrafast -c:a aac output.mp4
長時間録画では -use_wallclock_as_timestamps 1 を入力ごとに付けると安定します。
よくある質問
録画ファイルが巨大になる
-c:v copy で出力していたり、CRF を指定していない可能性があります。-c:v libx264 -preset ultrafast -crf 23 を必ず指定してください。さらに小さくしたい場合は録画後に -preset medium -crf 24 で再エンコードします。詳しくは 動画圧縮ガイド を参照してください。
マウスカーソルを録画したい
gdigrab と x11grab は デフォルトでカーソルを含めます。除外したい場合は -draw_mouse 0 を -i より前に追加します。avfoundation は -capture_cursor 1 で明示的に有効化します。
60fps で録画できない
入力側の -framerate 60 を指定し、エンコーダ側の負荷も軽くします。ultrafast でも追いつかない場合は GPU エンコーダ(NVENC / VideoToolbox / QSV / VAAPI)に切り替えるのが最も効きます。ddagrab + h264_nvenc なら 4K60p でも余裕です。
システム音声とマイクを混ぜて録音したい
仮想オーディオデバイス(VB-CABLE / BlackHole / PulseAudio monitor)でシステム音声を取得し、マイクと一緒に -filter_complex amix=inputs=2 でミックスします。本記事「システム音声を同時録音する」セクションのコマンドが完成形です。
OBS Studio との違い
OBS は GUI でシーン管理・配信・録画が完結する高機能ツールです。FFmpeg は スクリプト化・無人実行・サーバー側処理 に強く、CI で動画を生成したい・複数マシンに同じ録画設定を配布したい用途で優位です。「録画して RTMP に流したい」だけなら FFmpeg でも完結します(FFmpeg で RTMP 配信する を参照)。
Discord にアップロードできるサイズに収めたい
Discord 無料枠は 25MB 上限なので、録画後に再エンコードします。手順は FFmpeg で動画を Discord 用に圧縮する にまとめてあります。
関連記事
動作確認: ffmpeg 8.1 / Windows 11 23H2 / macOS 14 Sonoma / Ubuntu 24.04 一次ソース: ffmpeg.org/ffmpeg-devices.html#gdigrab / ffmpeg.org/ffmpeg-devices.html#avfoundation / ffmpeg.org/ffmpeg-devices.html#x11grab