👻

Mac&Pythonで、OBSの仮想カメラ情報を取得する

2022/10/25に公開

経緯

Mac環境において、「Pythonでカメラのデバイス一覧を取得したいなぁ」と思いながらググると、次の記事に辿り着いた。

https://qiita.com/sutoh/items/fddefe130eae3bba946f

最近、趣味でOBSを触り始めてみて、OBSの仮想カメラからの映像出力をOpenCVでアレコレしたくなった。

しかし、上記記事の手法だと、少なくとも筆者の環境ではOBSの仮想カメラ情報を出力することが出来なかった。

直接的な解決策をググっても見つからなかったため、自身でなんとか解決してみることにした。

やりたいことの整理

  • Pythonで、OBSの仮想カメラを含めたカメラデバイスの一覧を取得できるようにしたい。
  • macOSで実行する。

解決策

FFmpegを使用することで、OBSの仮想カメラを含むデバイスの一覧を取得できたため、FFmpegを用いたPythonスクリプトで書いてみた。

環境準備

Pythonのインストール等は割愛します。

FFmpegをインストールする。

brew install ffmpeg

必要なPythonライブラリをインストールする。

pip install ffmpeg-python

筆者の実行環境

  • macOS Monterey 12.6
  • Python 3.7.13
  • FFmpeg 5.1.2
  • python-ffmpeg 0.2.0
  • OBS 27.2.4

スクリプト

コメントにも書いてあるが、処理を要約すると、

  1. FFmpegの実行結果を取得する。
  2. FFmpegの実行結果を加工し、カメラ情報を抽出する。
  3. 加工した実行結果を出力する。
list_devices.py
import ffmpeg
import re

def get_camera_list():
    # エラー内容をffmpeg_outputに代入。ffmpegの実行結果は常にエラー。
    try:
        # dummy: Input/output error
        ffmpeg_output = ffmpeg.input('dummy', format='avfoundation', list_devices='true').output('dummy').run(capture_stderr=True).decode('utf8')
    except ffmpeg.Error as e: 
        ffmpeg_output = e.stderr.decode('utf8')

    # ffmpegのエラー内容から、カメラデバイス名を抽出。
    regex_specified_range = "AVFoundation video devices:.*?Capture screen 0"
    regex_target_to_remove = "\[AVFoundation indev @.*?\]"
    extracted_lists = re.findall(regex_specified_range, re.sub(regex_target_to_remove, "", ffmpeg_output), flags=re.DOTALL)
    return  [s for s in extracted_lists[0].split('\n') if ("AVFoundation video devices:" not in s) and ("Capture screen 0" not in s)]

def main():
    # カメラデバイスの一覧を出力。
    for camera in get_camera_list():
        print(camera)

if __name__ == "__main__":
    main() 
 

実行結果

一先ず、OBSの仮想カメラを含む、カメラデバイス一覧の出力を確認できた。
出力結果からカメラ番号も合わせて確認できた。出力結果を更に加工し、カメラ番号を上手いことOpenCVのvideoCapture()に渡せば色々できそう。

% python list_devices.py 
 [0] FaceTime HD Camera
 [1] OBS Virtual Camera 

Discussion