FFmpeg だけで、Windows / macOS / Linux のデスクトップ画面を録画できます。OBS をインストールせずに、ちょっとした録画をしたいときに使えます。コマンドは OS ごとに異なります。システム音声も一緒に録音できます。
必要な FFmpeg ビルド
入力デバイスごとに必要なビルドフラグが違います。ffmpeg -devices で利用可能なデバイス一覧を確認できます。
| OS | デバイス | 必要なビルドフラグ | 備考 |
|---|---|---|---|
| Windows | gdigrab |
デフォルトで含まれる | GDI ベース、互換性最優先 |
| Windows | ddagrab |
d3d11va 対応(gyan.dev などの Windows 向けビルドに含まれる) |
DXGI、FFmpeg 6.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 といった行が出力されれば利用可能です。ddagrab はデバイスではなくフィルタなので、この一覧には出ません(ffmpeg -filters で確認します)。
Windows: gdigrab で画面録画
全画面を録画
ffmpeg -f gdigrab -framerate 30 -i desktop -pix_fmt yuv420p output.mp4
-i desktop はデスクトップ全体を表し、モニターが複数あるときは全モニターをまとめて録画します。映像コーデックを指定しない場合、コンテナ(mp4)に応じて libx264 が自動選択されます。-pix_fmt yuv420p を付けないと、libx264 は画面キャプチャ(RGB)に合わせて yuv444p を選び、再生できないプレーヤーが多くなります。
品質と 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 -pix_fmt yuv420p 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 -pix_fmt yuv420p output.mp4
特定ウィンドウだけを録画
ffmpeg -f gdigrab -framerate 30 -i title="無題 - メモ帳" -pix_fmt yuv420p output.mp4
タイトルバーに表示されるウィンドウタイトルを完全一致で指定します(メモ帳ならファイル名が付き、「無題 - メモ帳」のようになります)。タイトルに半角スペースが含まれる場合はクォートで囲んでください。
Windows: ddagrab (DXGI) で高速録画
ddagrab は Windows 8 以降の Desktop Duplication API を使った GPU ベースのキャプチャです。gdigrab と比べて次の利点があります。
- gdigrab より CPU 負荷が低い
- 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。h264_qsv は ddagrab のフレームをそのまま受け取れません) |
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 Vista+ | Windows 8+ | Windows / macOS / Linux |
| CPU 負荷(4K60p) | 高 | 低 | 低(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 -pix_fmt yuv420p -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)で一度実行して、許可のダイアログを出す
- 「システム設定 → プライバシーとセキュリティ → 画面収録とシステムオーディオ録音」(macOS 13 では「画面収録」)でターミナルをオンにする
- ターミナルを一度終了して起動し直す
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 -pix_fmt yuv420p 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 -pix_fmt yuv420p output.mp4
-draw_mouse 0 は -i より 前 に置きます。
Wayland への対応
Wayland セッション(GNOME 40+ や最新の KDE)では x11grab が動きません。FFmpeg は Wayland の画面を直接キャプチャできないので、次のいずれかを選びます。
- Wayland 対応の録画ツール(推奨):
wf-recorder(wlroots 系)やgpu-screen-recorderで録画し、必要なら FFmpeg で後処理します。 - kmsgrab:root 権限か
CAP_SYS_ADMINが必要です。扱いにくいですが使えます。 - X11 セッションに切り替え:ログイン画面で X11 セッションを選択します。
kmsgrab の最小例:
ffmpeg -device /dev/dri/card0 -f kmsgrab -i - -vf "hwdownload,format=bgr0" -c:v libx264 -preset ultrafast -pix_fmt yuv420p 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 対応 |
システム音声を同時録音する
Windows と macOS では、FFmpeg から「スピーカーから出ている音」を直接録音できないことが多いため、仮想オーディオデバイスを 1 つ挟みます(Linux は後述のモニタソースを使います)。
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 -pix_fmt yuv420p -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 -pix_fmt yuv420p -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 -pix_fmt yuv420p -c:a aac -b:a 192k output.mp4
システム音声 + マイクをミックスする
システム音声とマイクの 2 つの音声入力を 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 -pix_fmt yuv420p -c:a aac -b:a 192k output.mp4
Windows / macOS でも同じ amix の書き方が使えます。マイクの音量を下げたい場合は、[2:a]volume=0.5[mic] のように音量調整を入れてください。
ファイルサイズと画質のバランス
画面録画は「同じピクセルが続くシーン」が多いので、一般的な動画より圧縮効率が高くなります。
推奨プリセット
| 用途 | preset | CRF |
|---|---|---|
| リアルタイム録画 | ultrafast |
23 |
| 後処理前提(録画優先) | superfast |
20 |
| 録画後に再エンコード | 録画は ultrafast、後で medium |
24(下のコマンド) |
録画優先の鉄則
録画中はエンコードが実時間に追いつく設定が必要です。短い試し撮りで処理速度とドロップ数、保存動画を確認し、追いつかない場合は ultrafast / superfast や低い解像度・fpsを試してください。medium で録画できるかは端末と入力条件次第です。ログの処理fpsだけでドロップを断定せず、出力も確認します。
録画後に再エンコードして小さくする
ここからは、録画したファイルに対する後処理です。
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=trunc(iw/4)*2:trunc(ih/4)*2" -c:v libx264 -preset medium -crf 23 -c:a copy output.mp4
trunc(iw/4)*2 と trunc(ih/4)*2 は、幅と高さの半分を偶数に切り下げます。1366×768 のような画面では半分の幅が 683 と奇数になり、scale=iw/2:ih/2 のままだと libx264 が width not divisible by 2 で止まるためです。
音声だけ抽出
ffmpeg -i input.mp4 -vn -c:a copy output.m4a
トラブルシューティング
Error opening input file desktop.(Windows)
-f gdigrab の指定漏れです。-f がないと desktop がファイル名として扱われ、No such file or directory で止まります。-i desktop の前に必ず -f gdigrab を付けます。
# 間違い
ffmpeg -i desktop output.mp4
# 正しい
ffmpeg -f gdigrab -framerate 30 -i desktop -pix_fmt yuv420p output.mp4
Permission denied / 黒い画面(macOS)
ターミナルに画面収録の権限がありません。システム設定 → プライバシーとセキュリティ → 画面収録とシステムオーディオ録音(macOS 13 では「画面収録」)でターミナルアプリをオンにし、ターミナルを一度終了してから起動し直してください。
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)に切り替え
音声と映像がズレる
入力デバイスのクロックが揃わないと発生します。-af aresample=async=1000 を追加します。音声を 1 秒あたり最大 1000 サンプルまで伸び縮みさせて、タイムスタンプに合わせます。
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="マイク" -af aresample=async=1000 -c:v libx264 -preset ultrafast -pix_fmt yuv420p -c:a aac output.mp4
長時間録画では -use_wallclock_as_timestamps 1 を入力ごとに付けると安定します。
よくある質問
録画ファイルが巨大になる
-c:v copy で出力していたり、-preset ultrafast で録画したままだったりする可能性があります。libx264 は -crf を省略しても CRF 23 で、ultrafast は処理が軽い代わりにファイルが大きくなります。小さくしたい場合は録画後に -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 の組み合わせは、取り込みもエンコードも GPU で行うので CPU の負荷が下がります。
システム音声とマイクを混ぜて録音したい
仮想オーディオデバイス(VB-CABLE / BlackHole / PulseAudio monitor)でシステム音声を取得し、マイクと一緒に -filter_complex amix=inputs=2 でミックスします。コマンド例は「システム音声を同時録音する」の節にあります。
OBS Studio との違い
OBS は、シーン管理・配信・録画を GUI で行える多機能なツールです。FFmpeg は スクリプト化・無人実行・サーバー側処理 に強く、CI で動画を生成したいときや、複数のマシンに同じ録画設定を配りたいときに向いています。「録画して RTMP に流したい」だけなら FFmpeg だけでもできます(FFmpeg で RTMP 配信する を参照)。
Discord にアップロードできるサイズに収めたい
Discord の上限はプランや時期で変わるので、送信画面で上限を確認してから、録画後に再エンコードします。手順は FFmpeg で動画を Discord 用に圧縮する にまとめてあります。