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

  1. ターミナル(または iTerm)で一度実行して、許可のダイアログを出す
  2. 「システム設定 → プライバシーとセキュリティ → 画面収録とシステムオーディオ録音」(macOS 13 では「画面収録」)でターミナルをオンにする
  3. ターミナルを一度終了して起動し直す

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 の画面を直接キャプチャできないので、次のいずれかを選びます。

  1. Wayland 対応の録画ツール(推奨):wf-recorder(wlroots 系)や gpu-screen-recorder で録画し、必要なら FFmpeg で後処理します。
  2. kmsgrab:root 権限か CAP_SYS_ADMIN が必要です。扱いにくいですが使えます。
  3. 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 で取得

  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 -pix_fmt yuv420p -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 -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)

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

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

関連記事