すっさんぽ
  1. Posts/

FFmpegでMacの画面収録

·

Macでは、QuickTime Playerを使えば画面収録をすることができます。しかし、あえてコマンドラインから収録をしたいことがあるかもしれません。今回は、ffmpegを使用して画面収録を行う方法をまとめます。

コマンドの完成形 #

いろいろ試した結果、以下のコマンドに落ち着きました。

ffmpeg -hide_banner -f avfoundation -capture_cursor 1 -capture_mouse_clicks 1 -i "${VIDEO_DEVICE_NUMBER}:${AUDIO_DEVICE_NUMBER}" -c:v h264_videotoolbox -r ${FRAME_RATE} -b:v ${VIDEO_BIT_RATE} ${OUTPUT_FILE_PATH}

実行すると自動的に画面収録が始まります。終了したいときは、キーボードからqを入力します。

コマンドの解説 #

オプション 説明
-f avfoundation macOSのAVFoundationを使用するようにフォーマットする(らしい)
-capture_cursor 1 マウスカーソルを表示
-capture_mouse_clicks 1 マウスのクリックを表示
-i “{VIDEO_DEVICE_NUMBER}:${AUDIO_DEVICE_NUMBER}” 映像の入力と、音声の入力を、番号で指定する。数字ひとつだけを指定したときは、映像の指定として扱われる。詳しくは後述。
-c:v h264_videotoolbox ビデオコーデックの指定。h264。 h264_videotoolbox は、ハードウェアエンコードができるらしい。
-r ${FRAME_RATE} フレームレートの指定。MBP 13inch 2018だと、30(fps)くらいがちょうどよかった。
-b:v ${VIDEO_BIT_RATE} 映像のビットレート指定。15m(15Mbps)で設定してみた。
[最後のオプション] ${OUTPUT_FILE_PATH 出力先パス。screen_record.mp4とかにしている。

ビットレートは指定したほうが良さそう。 また、出力された映像をみると、tbr, tbn, tbcの値が変な感じがある。 もしかすると、ちゃんと設定したほうが良いのかもしれない。

参考 #

入力に使用できるデバイスの表示 #

以下のコマンドを使用すると、今使用できるデバイスと、それが割り当てられている番号を知ることができます。
ffmpeg -hide_banner -f avfoundation -list_devices true -i ""

> ffmpeg -hide_banner -f avfoundation -list_devices true -i ""
[AVFoundation indev @ 0x7fa807f28700] AVFoundation video devices:
[AVFoundation indev @ 0x7fa807f28700] [0] Krisp Camera
[AVFoundation indev @ 0x7fa807f28700] [1] FaceTime HDカメラ(内蔵)
[AVFoundation indev @ 0x7fa807f28700] [2] Capture screen 0
[AVFoundation indev @ 0x7fa807f28700] AVFoundation audio devices:
[AVFoundation indev @ 0x7fa807f28700] [0] krisp microphone
[AVFoundation indev @ 0x7fa807f28700] [1] MacBook Proのマイク

画質はどうか #

QuickTime Playerの画面収録のほうは、フレームレートが60でも目立ったコマ落ちがなく、安定してなめらかな映像が撮れていました。 ffmpegでも、設定を細かくチューニングしていけば同様の画質になる可能性はあります。 色味については、双方の差は感じなかったです。おそらくどちらもハードウェアのh264エンコーダーを使用しているだろうということと、どちらもyuv420pだということ。 422や444での収録はできませんでした。エンコーダーが対応していなかったようです。