「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デバイス必要なビルドフラグ備考
Windowsgdigrabデフォルトで含まれるGDI ベース、互換性最優先
Windowsddagrab--enable-libdxva2 系(公式 Windows ビルドに含まれる)DXGI、FFmpeg 5.0+
Windowsdshowデフォルトで含まれる音声・カメラキャプチャ用
macOSavfoundationデフォルトで含まれる(brew install ffmpegmacOS 10.7 以降
Linuxx11grab--enable-libxcbX11 セッションが必要
Linuxpulse--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=6060fps キャプチャ
h264_nvencNVIDIA 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

項目gdigrabddagrabOBS Studio
対応 OSWindows 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 以降、初回実行時に 画面収録の許可ダイアログ が出ます。許可しない場合は黒い動画になります。

  1. ターミナル(または iTerm)で初回実行
  2. 「ターミナルが画面収録を要求しています」のダイアログで「OK」
  3. 「システム設定 → プライバシーとセキュリティ → 画面収録」でターミナルにチェック
  4. ターミナルを再起動

macOS: avfoundation vs QuickTime Player

項目FFmpeg avfoundationQuickTime 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.0DISPLAY 環境変数の値

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 をネイティブには扱えないので、以下のいずれかを選びます。

  1. PipeWire 経由(推奨)wf-recorder(wlroots 系)や gpu-screen-recorder で録画し、必要なら FFmpeg で後処理
  2. kmsgrab — root 権限と CAP_SYS_ADMIN が必要、扱いにくいが可能
  3. Xwayland セッションに切り替え — ログイン画面で X11 セッションを選択

kmsgrab の最小例:

ffmpeg -device /dev/dri/card0 -f kmsgrab -i - -vf "hwdownload,format=bgr0" -c:v libx264 -preset ultrafast output.mp4

Linux キャプチャ手段の比較

手段セッション権限難易度備考
x11grabX11一般ユーザー安定・実績多数
kmsgrabX11/Waylandroot or CAP_SYS_ADMIN低レベル DRM 経由
wf-recorderwlroots Wayland一般ユーザーSway / Hyprland など
gpu-screen-recorderX11/Wayland一般ユーザーNVENC / VAAPI 対応

システム音声を同時録音する

これが画面録画で 最も質問が多いトピック です。OS 標準では「スピーカーから出ている音」を直接録ることができないため、仮想オーディオデバイスを 1 つ挟みます。

Windows: VB-CABLE で取得

  1. VB-CABLE をインストール
  2. Windows のサウンド設定で 再生デバイスを「CABLE Input」 に切り替え
  3. 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 で取得

  1. brew install blackhole-2ch でインストール
  2. Audio MIDI 設定 で「複数出力装置」を作り、スピーカー + BlackHole 2ch を含める
  3. システムの出力先をその複数出力装置に設定
  4. 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] のように明示的に音量調整を入れてください。


ファイルサイズと画質のバランス

スクリーンキャストは「同じピクセルが続くシーン」が多いので、動画よりずっと圧縮効率が高くなります。

推奨プリセット

用途presetCRF想定サイズ(30 分・1080p30)
リアルタイム録画ultrafast23約 800 MB
後処理前提(録画優先)superfast20約 1.2 GB
録画後に再エンコードultrafast + 再エンコード medium CRF 22録画 800 MB → 最終 200 MB

録画優先の鉄則

録画中は 必ず -preset ultrafastsuperfast を使います。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

エンコード負荷が録画フレームレートに追いついていません。以下を順に試します。

  1. -preset ultrafast に変更
  2. -crf を上げる(23 → 28)
  3. 解像度を下げる(4K → 1080p)
  4. ハードウェアエンコーダ(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