seleniumを使ってChromeに動画ファイルをカメラ映像として認識させる【WebRTC負荷テスト用】

アイキャッチ

私の会社でWebRTCに関する負荷テストをすることになり、数百のクライアントを用意する必要ができました。
カメラを備えたPCを数百台用意するのは現実的ではないため、docker+pythonseleniumを使ったスクレイピング環境を整え、作成したコンテナをAWSのインスタンス上で稼働させることを試みます。

今回はseleniumを使って、Chromeに動画ファイルをカメラ映像として認識させる方法を解説します。

docker+pythonを使ったスクレイピング環境の構築方法は下記の記事を参考にしてください。

カメラ映像として使用する動画・音声ファイルを用意する

まず、Chromeに認識させる動画ファイルと、音声ファイルを用意します。
ちなみに、わざわざ動画・音声ファイルを設定しなくても、Chromeドライバーには試験用の映像が組み込まれているので、それを使うのもアリです。
映像の解像度を指定したかったり、デフォルトの音声がうるさいと感じた場合は、自前で用意してください。

カメラ映像として使用できるビデオファイルは.y4m形式、マイクへの入力として使用できる音声ファイルは.wav形式です。(試しにmp4ファイルを動画ファイルに指定してみましたが、使えませんでした)
今回はffmpegを使ってmp4ファイルをy4mとwavに変換しました。
ffmpegをインストールしていれば、下記のコマンドで変換できます。

# y4mファイルに変換する
ffmpeg -i src.mp4 dst.y4m

# 動画の縦の解像度を200pixに指定して変換(横方向は自動的に決定)
ffmpeg -i src.mp4 -vf scale=-1:200 dst.y4m
# 動画から音声ファイルを抽出する
ffmpeg -i src.mp4 dst.wav

元のテスト用のフリー動画はPixaboyから取得すると便利です。

ソースコード

ソースコードは下記の通りです。

from selenium import webdriver

# Chromeドライバーを起動するときのオプションを設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # ヘッドレスで起動
options.add_argument("--disable-gpu") # ヘッドレスモードで起動するときに必要なオプション
options.add_argument("--no-sandbox")# dockerコンテナ環境で実行するときは必要なオプション
options.add_argument("--window-size=100,100")  # 画面サイズ指定(サイズを小さくすればメモリ節約できる)
options.add_argument('--disable-dev-shm-usage') #VM環境では設定したほうが良い(クラッシュする確率が低くなる)

# 以下が動画・音声ファイルを認識させるためのパラメータ指定
options.add_argument("--use-fake-ui-for-media-stream")# 「カメラ等の使用を許可しますか」のダイアログに対応するためのオプション
options.add_argument("--use-fake-device-for-media-stream")# カメラやマイクの代わりに、動画や音声ファイルを使用するためのオプション
options.add_argument("--use-file-for-fake-video-capture=./sample.y4m")# 動画ファイル指定
options.add_argument("--use-file-for-fake-audio-capture=./sample.wav")# 音声ファイルを指定

# webドライバー取得
driver = webdriver.Chrome(options=options)

# urlにアクセス
driver.get("https://hoge.hoge.com")


## 任意の操作

ここで、動画ファイルや音声ファイルを指定しなければ、デフォルトで用意されている試験用の映像と音声が流れます。
また、空文字を指定することで、真っ黒な映像や、無音にすることも可能です。

まとめ

任意の動画・音声ファイルを指定してカメラやマイクの代わりに使用できるようになりました。
次は、これをAWSのインスタンス上で実行できるようにします。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です