ffmpegを使ってデスクトップ画面の録画・録音をする

ffmpeg

UbuntuLinux Mint で、[Ctrl] + [Alt] + [Shift] + [R] を押せばスクリーンキャスト(デスクトップ画面の録画と録音)ができるという記事をネット上でちらほら見たのですが、残念ながら自分の環境では [Ctrl] + [Alt] + [Shift] + [R] を押しても何も起こらないので、フリーでオープンソースのエンコーダーである ffmpeg でデスクトップ画面の録画と録音をしてみたいと思います。

環境は Linux Mint 22 “Wilma” MATE Edition です。また、今回使用しているPCは AMD Ryzen 9 7900X (12コア / 24スレッド) を搭載したサブPC1 (自作PC)です。

自作PCの詳しいスペックについては About をご覧ください。

下準備

ffmpeg のインストール

まず最初に、ffmpegがインストールされているか確認します。

$ which ffmpeg

ffmpegがインストールされていなければ、以下のコマンドでインストールします。

$ sudo apt -y install ffmpeg

ffmpegをソースコードからコンパイルしても良いですが、かなり時間と手間がかかりそれなりの知識も必要になるので、中級者や上級者向けです。2年ほど前、ソースコードからffmpegをコンパイル方法を書いたので、興味のある方はどうぞ。

デスクトップの録画や録音をする

[Ctrl] + [Alt] + [T] で端末(ターミナル)を開き、後述するffmpeg設定を [Ctrl] + [Shift] + [V] で端末にコピペして実行すれば、デスクトップ画面の録画ができます。

デスクトップ画面の録画や録音を停止させるには、端末でキーボードの [Q] キーをタイプすれば終了します。

デスクトップ画面の録画や録音をするffmpeg設定

画面の録画などは低圧縮で録画して、後から高圧縮にエンコードするのが基本なのですが、自分の場合は面倒なので最初からある程度圧縮する設定にしています。

もしエンコード負荷が高すぎて画面の録画が追いつかない場合やうまく録画できない場合は、オプションやパラメーターをいじってください。

デスクトップ画面の録画 (音声なし)

MP4 (H.264) 形式でデスクトップの画面を録画

$ ffmpeg -threads 0 -y -f x11grab -probesize 50M -i :0.0 -c:v libx264 -s 1920x1080 -aspect 16:9 -r 60 -qp 15 -preset fast -an ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".mp4
-c:v libx264動画形式を指定
H.264
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画のアスペクト比
16:9
-r 60フレームレートを指定
60fps
-qp 15動画の品質指定
15
-preset fastエンコードのプリセット設定を指定
fast
-an音声を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.mp4録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.mp4」という名前で動画を出力

WebM (VP8) 形式でデスクトップ画面を録画

$ ffmpeg -threads 0 -y -f x11grab -s 1920x1080 -r 60 -probesize 50M -thread_queue_size 8192 -i :0.0 -c:v libvpx -aspect 16:9 -cpu-used 5 -b:v 4096k -an ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".webm
-c:v libvpx動画形式を指定
VP8
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画のアスペクト比
16:9
-r 60フレームレートを指定
60fps
-b:v 4096k動画のビットレートを指定
4096kbps
-an音声を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.webm録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.webm」という名前で動画を出力

デスクトップ画面の録音 (映像なし)

WAV形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -f alsa -i default -vn -c:a pcm_s16le -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".wav
-c:a pcm_s16le音声形式を指定
16bitリニアPCM
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.wav録音した音声の出力先
Desktopディレクトリに「OutputFile_現在の日時.wav」という名前で音声を出力

FLAC形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -f alsa -i default -vn -c:a flac -ac 2 -ar 44100 -compression_level 3 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".flac
-c:a flac音声形式を指定
FLAC
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
-compression_level 3FLACの圧縮レベル指定
3
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.flac録音した音声の出力先
Desktopディレクトリに「OutputFile_現在の日時.flac」という名前で音声を出力

-compression_level は、圧縮レベルを指定するためのオプションです。指定範囲は 0~12 で数字が大きいほど圧縮率を重視し、数字が小さいほどエンコード速度を重視します。

録音ではエンコード速度が重要なので基本的に小さい値を指定します。

MP3形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -f alsa -i default -vn -c:a libmp3lame -b:a 320k -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".mp3
-c:a libmp3lame音声形式を指定
MP3
-b:a 320k音声のビットレートを指定
320kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.mp3録音した音声の出力先
Desktopディレクトリに「OutputFile_現在の日時.mp3」という名前で音声を出力

AAC形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -f alsa -i default -vn -c:a aac -b:a 320k -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".m4a
-c:a aac音声形式を指定
AAC
-b:a 320k音声のビットレートを指定
320kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.m4a録音した音声の出力先
Desktopディレクトリに「OutputFile_現在の日時.m4a」という名前で音声を出力

Ogg Vorbis形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -f alsa -i default -vn -c:a libvorbis -b:a 128k -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".ogg
-c:a libvorbis音声形式を指定
Ogg Vorbis
-b:a 128k音声のビットレートを指定
128kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.ogg録音した音声の出力先
Desktopディレクトリに「OutputFile_現在の日時.ogg」という名前で音声を出力

Opus形式でデスクトップの音声を録音

$ ffmpeg -threads 0 -y -vn -f alsa -i default -c:a libopus -b:a 128k -ac 2 -ar 48000 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".webm
-c:a libopus音声形式を指定
Opus
-b:a 128k音声のビットレートを指定
128kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 48000サンプリング周波数
48kHz / 48,000Hz
-vn動画を出力しない
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.opus録音した音声の出力先
Desktopディレクトリに OutputFile.webm という名前で動画を出力

デスクトップ画面の録画と録音 (映像+音声)

MP4 (H.264+AAC) 形式で録画と録音をする

$ ffmpeg -threads 0 -y -f x11grab -s 1920x1080 -r 60 -probesize 50M -thread_queue_size 8192 -i :0.0 -f alsa -i default -c:v libx264 -aspect 16:9 -qp 15 -preset ultrafast -c:a aac -b:a 320k -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".mp4
-c:v libx264動画形式を指定
H.264
-c:a aac音声形式を指定
AAC
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画へのアスペクト比
16:9
-r 60フレームレートを指定
60fps
-qp 15動画の品質指定
15
-preset ultrafastエンコードのプリセット設定を指定
ultrafast
-b:a 320k音声のビットレートを指定
320kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.mp4録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.mp4」という名前で動画を出力

MP4 (H.265+AAC) 形式で録画と録音をする

$ ffmpeg -threads 0 -y -f x11grab -s 1920x1080 -r 60 -probesize 50M -thread_queue_size 8192 -i :0.0 -f alsa -i default -c:v hevc -aspect 16:9 -b:v 4096k -c:a aac -b:a 320k -ac 2 -ar 44100 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".mp4
-c:v hevc動画形式を指定
H.265
-c:a aac音声形式を指定
AAC
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画のアスペクト比
16:9
-r 60フレームレートを指定
60fps
-b:v 4096k動画のビットレートを指定
4096kbps
-b:a 320k音声のビットレートを指定
320kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.mp4録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.mp4」という名前で動画を出力

WebM (VP8+Opus) 形式で録画と録音をする

$ ffmpeg -threads 0 -y -f x11grab -s 1920x1080 -r 60 -probesize 50M -thread_queue_size 8192 -i :0.0 -f alsa -i default -c:v libvpx -aspect 16:9 -cpu-used 5 -b:v 4096k -c:a libopus -b:a 128k -ac 2 -ar 48000 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".webm
-c:v libvpx動画形式を指定
VP8
-c:a libopus音声形式を指定
Opus
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画のアスペクト比
16:9
-r 60フレームレートを指定
60fps
-b:v 4096k動画のビットレートを指定
4096kbps
-b:a 128k音声のビットレートを指定
128kbps
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 48000サンプリング周波数
48kHz / 48,000Hz
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.webm録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.webm」という名前で動画を出力

MKV (H.264+FLAC) 形式で録画と録音をする

この設定はロスレス(可逆圧縮)でエンコードしますが、4分50秒の録画でファイルサイズが 1.0GB 近くなりますので注意してください。

$ ffmpeg -threads 0 -y -f x11grab -s 1920x1080 -r 60 -probesize 50M -thread_queue_size 8192 -i :0.0 -f alsa -i default -c:v libx264 -aspect 16:9 -qp 0 -preset medium -c:a flac -ac 2 -ar 44100 -compression_level 0 ~/Desktop/OutputFile_"$(date +'%Y%m%d_%H%M%S')".mkv
-c:v libx264動画形式を指定
H.264
-c:a flac音声形式を指定
FLAC
-s 1920×1080動画の解像度を指定
1920×1080
-aspect 16:9動画のアスペクト比
16:9
-r 60フレームレートを指定
60fps
-qp 0動画の品質指定
0 (ロスレス)
-compression_level 0FLACの圧縮レベル指定
0
-ac 2音声のチャンネル指定
2 (ステレオ)
-ar 44100サンプリング周波数
44.1kHz / 44,100Hz
~/Desktop/OutputFile_”$(date +’%Y%m%d_%H%M%S’)”.mkv録画した動画の出力先
Desktopディレクトリに「OutputFile_現在の日時.mkv」という名前で動画を出力

参考にさせていただいたサイト様

スクリーンキャスト:画面を録画してみよう!(コマンド編) - Do-you-linux!?
Windowsでffmpegを用いた画面録画 - Chienomi

コメント