Chienomi

Windowsでffmpegを用いた画面録画

雑感::technique

Windowsだと画面録画をするのに、「有料ソフトでないと撮れない」とかいう状況らしい。 というより、そのように認識している人が多いらしい。

実際は色々と方法があり、その基本となるのがffmpegによるキャプチャである。 これはLinuxでは定番だが、Windowsでも可能だ。だが、Windowsの場合かなりややこしい。

今回はちょっとした事情により、Windowsで困っている人が多そうだったので、Windowsでのやり方を調べながら試してみた。

基本的にゲームキャプチャはRadeon Relive, XBox Gaming, ShadowPlay(要登録)でやるものだろう。 今回紹介する方法は決して悪用することのないよう。 もちろん、本記事を利用した結果については筆者は一切の責任を負わない。

順を追って説明していくので、理解を進めていくといいだろう。

Linuxの場合

Linuxでは非常に簡単なので、こちらをまず理解すると良い。

まず、画面の録画はx11grabを用いる。

ffmpeg -f x11grab -i $DISPLAY out.mp4

字面からわかるように、純Wayland環境ではこれはうまくいかない。Pipewireと組み合わせることで実現可能だが、それ自体で独立した記事になるレベルなので省略する。

座標を指定する場合は入力デバイスの指定に追加する。

ffmpeg -f x11grab -i $DISPLAY+100,100 out.mp4

フレームレートとサイズを指定したほうが良いだろう。

ffmpeg -f x11grab -video_size 640x480 -framerate 30 -i $DISPLAY+100,100 out.mp4

一方、オーディオの録音はPulseAudioを使うのが楽だ。

ffmpeg -f alsa -i pulse out.mp3

PulseAudioのミキサー(pavucontrol)で録音するデバイスを選択できる。モニターを録音することでプレイバック録音も可能だ。

録画する場合、エンコードは速度を重視することになる。

巨大なファイルを吐いて、あとからエンコードするのが基本。組み合わせよう。

ffmpeg -f x11grab -video_size 640x480 -framerate 30 -i $DISPLAY+100,100 -f alsa -i pulse out.mp3 -c:v libx264 -qp 0 -preset ultrafast -c:a flac out.mkv

Windowsで厄介な要素とは

ビデオに関してはgdigrabを用いればそれほど難しくない。

だが、音声に関しては録音するデバイスをPulseAudioのように自由にコントロールできないこと、モニターデバイスをちゃんと持っていないことが問題になる。統一的に仕組みもない。

音声を扱うにはDirect Showを用いるのだが、モニターデバイスの選択について色々と手順がある。

StereoMixの有効化

サウンドデバイスの設定(コントロールパネル)を開き、「録音」タブを選択する。 ここにStereoMixが出ていれば、コンテキストメニューを開き、有効化する。

ない場合は、なにもないところで右クリックして無効なデバイスを表示するようにする。

プロパティからモニターの音量の100%にしておくと良いだろう。

StereoMixに音を流す

StereoMixは全てのデバイスに用意されているわけではなく、基本的に「特定の経路だけ」になっている。 そしてそれは通常、デフォルトのサウンドデバイスのデフォルト出力だ。

ラップトップの場合はおそらく考えることはないだろうが、デスクトップPCの場合はそうはいかない。

通常、デフォルトのサウンドデバイスはマザーボードのオンボードデバイスになる。

そしてそのデフォルト出力は一般的にスピーカーだ。スピーカーがつながっている場合は、そのスピーカーから音を流すようにすればStereoMixに音が入るようになる。

スピーカーにつながっていない場合は、そもそも音声出力先としてスピーカーを選ぶことができないため、うまく動作しない。 この場合、スピーカーをつなげばいい。PCの場合、スピーカー出力(リヤ出力、リヤラインアウト)にヘッドフォンをつないでも問題はない。なんなら3.5mmのステレオジャックを挿しておくだけでもいい。とにかくつないでおく必要があるのだ。

StereoMixのサウンドデバイス名を調べる

次のコマンドでサウンドデバイスをリストすることができる。

ffmpeg -list_devices true -f dshow -i dummy

これでStereoMixの名前をひかえておこう。

実際に録画する

画面側はgdigrabを用いる。Direct Showを使う場合、矩形選択はできないからだ。 多くは一緒だが、入力デバイスにオフセットを書くのではなく、独立したオプションを使う。

音声はDirect Showを使い、オーディオデバイスとして先程調べたものを使う。例としては

ffmpeg -f gdigrab -framerate 30 -offset_x 100 -offset_y 100 -video_size 640x480 -i desktop -f dshow -i audio="ステレオ ミキサー (Realtek(R) Audio)" -c:v libx264 -qp 0 -preset ultrafast -c:a flac out.mkv

圧縮する

これをすると巨大なファイルが吐かれる。 デスクトップキャプチャの圧縮で私の標準的な設定は次のものだ。

ffmpeg -i source.mkv -r 30 -c:v libvpx-vp9 -crf 42 -c:a libopus -b:a 128k out.webm

その他の方法

いわゆる有料ソフトの無料版を使う(一般的にロゴが入ったり、時間が制限されたりする)以外の方法に触れよう。 前提として、Windowsユーザーが気にする部分である、「無料」と「ロゴなどが入らず制限がない」を置く。

まずXBox Game Barを用いたレコーディングだ。 Win+Alt+Rで録画することができる。また、Win+Gでゲームバーを表示する方法もある。

この方法でのレコーディングはデスクトップレコーディングになるのだが、レコーディングを行うにはそもそも起動中のアプリがXBox Game Barが表示できること、つまりWindowsにゲームとして認識されていることが必要となる。 ただし、ゲームとして認識されていなくても、Win+Gでゲームバーを表示しようとするとアプリをゲームとして扱うかどうか聞かれる。

XBox Gamingによる録画はうまく動作しないことがあり、安定性が低い。 また、ソフトウェアエンコーディングであり、少し重い。

次にRadeon ReLiveだ。 AMDのビデオカードを搭載する場合、Radeonのドライバーと共にインストールされる。

レコーディング対象はデスクトップ、またはアプリケーションで、「デスクトップ録画を有効にする」チェックボックスにより動作が切り替わる。アプリのレコーディングはRadeon ReLiveによってゲームとして登録されている必要がある。 また、録画領域を「リージョン」とすればデスクトップ録画でウィンドウ描画エリアが保存される。

Radeon ReLiveによるレコーディングはAMFを用いたハードウェアエンコーディングとなり軽量。 不安定さが難であったが、随分改善した。

続いてVLC Media Player。 「変換/保存」→「キャプチャーデバイス」と進み、キャプチャーモードに「デスクトップ」を選択することでデスクトップレコーディングが可能。「変換/保存」を押すと変換のダイアログが出るので、プロファイルを選択(H.264+MP3が妥当)、出力ファイルを指定(拡張子は.mp4)し、「開始」を押すとレコーディングが開始される。 プレイリストにConvertingと書かれたものが入るので、これを停止するとレコーディングを終える。再生ボタンを押すと再度開始する。

フレームレートの指定は可能だが、領域指定はできなさそうに見える。が、できる。 「ツール」→「設定」→「すべて」→「入力/コーデック」→アクセスモジュール→スクリーン。 いちいちここで指定しないといけないのが少し面倒。

この処理は内部的にはffmpegによるものと変わらないが、自由度が少し低いのと、操作が面倒なのが難点。コマンドが打てるならあまり歓迎できない。

OBS Studioを用いたレコーディングはある程度知られている。 エンコーダの設定でハードウェアエンコーディングも可能であること、自由度が高く扱いやすいことはメリット。 ビジュアライズしてくれないと操作できない、という人が矩形録画するには良い選択肢だろう。 エンコーダオプションを細かく指定すれば望む画質・音質にもできる。 配信とは違うので、他の場合同様にサイズを気にせず保存し、あとから変換するのが基本だ。

ShadowPlayは私は使ったことがないので分からない。Nvidiaのゲーミングカードも持っていないし。

個人的には、ゲームプレイの録画に関してはRadeon ReLive(あるいはShadowPlay)を使うのが良いと思うが、結局のところ動画とキャプチャに関するある程度の知識は必要になるのだから、ffmpegでやるのが一番手っ取り早いし楽だと思う。 ただ、Windowsの場合は音声の扱いに関して面倒な点があるのは確かなので、そこを自前で手当てしているOBSというのも悪くない。

もしくはいっそ、Linuxに乗り換えるのもアリではないか。