仮想カメラを使った高解像度・高フレームレートのテスト方法

こんにちは、テリーです。フルリモートワークになり、会社の機材を借りてテストすることが気軽にできなくなりました。特定の機種でしか発症しないバグや、機種固有の機能を実機で試す場合、わざわざ電車に乗って取りに行くのも面倒だと感じる機会がたびたびあります。

そんな中、高解像度カメラ、高解像度ディスプレイ、高速Wi-Fi、USB-Cの普及により、高解像度配信のための要素技術がこの数年で全て廉価に手軽になりました。そこで4K 60FPSの映像をそのままライブ配信したくなりますが、廉価なWebカメラでは4Kの場合に最大30FPSとなる商品もあります。進化の激しい映像業界で、最新の高性能カメラを毎回買い続けて手元に置いておくのはコスト面で大変です。今回はこのケース、高解像度・高フレームレートの映像配信を、本物のカメラがない状況で手軽にシミュレーションする方法をご紹介します。

仮想カメラとは

パソコン用のWebカメラはさまざまなメーカーから販売されており、OSが個別対応することなく動作しています。デバイスドライバが各カメラの違いを吸収しているためです。OSが「カメラ」と認識するようなソフトウェアのことを「仮想カメラ」と呼びます。単なるソフトウェアであるため、物理的にはありえないような設定値を持つカメラを作り出すことができます。例えばフレームレート120FPS、解像度8Kなどです。下記でご紹介する映像配信ソフトOBS Studioには、Windows/Mac/Linuxで動作する仮想カメラが付属しています。他にも同様な仮想カメラは存在しますが、本記事ではOBS Studioの仮想カメラを使用し、4K60FPSの仮想カメラを設定する手順・確認する手順を紹介します。

動作環境

本記事は以下のバージョンを用いて動作を確認しています。

  • MacBook Pro (14-inch, 2021) M1 Max
  • macOS Monterey 12.1
  • OBS Studio 27.1.3
  • ffmpeg 5.0

ffmpegのインストール

本記事ではmacOS用のビルド済バイナリを使用しますが、独自でビルドすることも可能です。

ターミナルを開いて下記を実行してください。

mkdir ffmpeg
cd ffmpeg
curl -O https://evermeet.cx/ffmpeg/ffmpeg-5.0.zip
unzip ffmpeg-5.0.zip
curl -O https://evermeet.cx/ffmpeg/ffprobe-5.0.zip
unzip ffprobe-5.0.zip
curl -O https://evermeet.cx/ffmpeg/ffplay-5.0.zip
unzip ffplay-5.0.zip
sudo cp ffmpeg /usr/local/bin
sudo cp ffprobe /usr/local/bin
sudo cp ffplay /usr/local/bin
ffmpeg -version

OBS Studioのインストール

ブラウザでこちらのサイトにアクセスし、「ダウンロード インストーラ」ボタンをクリックしてください。

ダウンロードしたobs-mac-27.1.3.dmgをクリックして実行すると、下記のウインドウが現れます。OBSアイコンをApplicationsアイコンの上にドラッグ&ドロップするとインストール完了です。

OBS Studioの設定

LaunchPadの末尾にあるOBSアイコンをクリックし、実行します。Rosettaのインストールダイアログが出る場合があります。OBSは今のところIntel CPU向けにコンパイルされています。その後「キー操作の受信」「マイクにアクセス許可」のダイアログが出ます。両方とも許可します。「キー操作の受信」は、音声のミュートや仮想カメラのオンオフなどのショートカットキーに必要です。

そのあと、「自動構成ウィザード」のダイアログが出ますが、「キャンセル」を押すのがオススメです。どれを選んでもその後に調整が必要だからです。

次に現れるメインウインドウ右下の「設定」ボタンを押します。

次に現れるダイアログで、左の「映像」セクションをクリックし、基本解像度、出力解像度、FPSを目的の解像度に変更します。下図では4K60FPS(3840x2160、60FPS)にしています。縮小フィルタは基本解像度と出力解像度が同じ場合には使われません。最後にOKボタンを押します。

次に60FPSの映像を用意します。4Kだとなおよしです。BigBuckBunnyという動画をサンプルとして使用します。

curl -O http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_2160p_60fps_normal.mp4

次に「ソース」セクションの中の「+」をクリックし、メディアソースを選択します。

出てきたダイアログに適当なタイトルをつけます。ここでは「bbb4k」とつけています。

次に出てきたダイアログで動画ファイルを参照します。「繰り返し」にもチェックをつけます。「ハードウェアデコードを使用」にもチェックをつけた方が良いでしょう。

最後に「仮想カメラ開始」ボタンを押します。(下の画像はボタンを押した後で、「仮想カメラ開始」ボタンのところが「仮想カメラ停止」になっています)

カメラの確認

下記のコマンドを実行し、仮想カメラが作成できていることを確認します。OBS Virtual Cameraが"[1]"であることが確認できます。

ffmpeg -f avfoundation -list_devices true -hide_banner -i ""

次に下記のコマンドを実行します。OBS Studioの仮想カメラが4K60FPSのデータとして出力すると検出されています。

ffmpeg -f avfoundation -hide_banner -i "OBS Virtual Camera"

下記のコマンドを実行し、ffmpegがOBSの出力を取り込んでいる様子を確認できます。

ffmpeg -f avfoundation -hide_banner -r 60 -pixel_format nv12 -probesize 100M -i "OBS Virtual Camera:none" -f null -

よく見るとfpsが50台です。どうやらマシンスペックの関係か、4K60FPSは出せないようです。OBS Studioの映像設定でFPSを「48」に変更し、下記のコマンドを実行すると、期待通り48FPSで取り込めています。

ffmpeg -f avfoundation -hide_banner -r 48 -pixel_format nv12 -probesize 100M -i "OBS Virtual Camera:none" -f null -

保存して確認するには下記のコマンドを実行します。エンコードをするとさらにフレームレートは遅くなり、このパソコンでは25FPSになりました。

ffmpeg -f avfoundation -hide_banner -r 48 -pixel_format nv12 -probesize 100M -i "OBS Virtual Camera:none" -c:v h264_videotoolbox -realtime true -b:v 10M -y aaa.mp4

面白いことに、エンコードをhevc(h265)にするとフレームレートは期待通り48になります。macのh264のハードウェアエンコードの上限が25FPSなのかもしれません。4K配信する場合はh264は使わない方が良さそうです。

ffmpeg -f avfoundation -hide_banner -r 48 -pixel_format nv12 -probesize 100M -i "OBS Virtual Camera:none" -c:v hevc_videotoolbox -realtime true -b:v 10M -y aaa.mp4

バグ?

OBS Studioで仮想カメラのフレームレートやフレームサイズを変更すると、画面上は即座に変更されたように表示されますが、ffmpegでデバイス情報を見てみると設定変更前のフレームレートが帰って来ることがあります。仮想カメラの挙動に違和感がある場合は、変更が即座に反映されない可能性を視野に入れ、数分待つと良さそうです。

まとめ

OBS Studioの仮想カメラを用いて、4K60FPSのカメラデバイスを作成する手順と、実際のフレームレートを確認する手順をご紹介しました。4K60FPSのデータはノートパソコンでは最高速度で処理しきれないこともあるようです。今後もっと速いパソコンやGPUでの対応を期待しましょう。

有料サービスのご紹介

WebRTCを利用した会員制ライブ配信サービスを短期間で導入したい方、大規模配信のためのサーバ構築・インフラ運用を専門家に任せたい方は「ImageFlux Live Streaming」をご検討下さい。WebRTC SFUという技術を用いて、配信映像をサーバに中継させる仕組みです。1対多の会員制映像配信に特に強みがあり、初期の利用コストが低価格に抑えられます。