IronHSP 仮想ウェブカメラ ガイド

hspvcam DirectShow 仮想カメラプラグイン — 最終更新: 2026-04-18

目次

1. 仮想ウェブカメラとは

仮想ウェブカメラ (Virtual Webcam) とは、物理的なカメラデバイスがなくても、ソフトウェアが生成した映像をあたかもウェブカメラの映像であるかのように OS に認識させる仕組みです。

IronHSP の hspvcam プラグインは DirectShow ソースフィルタ として実装されており、regsvr32 で登録すると Windows のカメラデバイス一覧に「IronHSP Virtual Camera」として表示されます。HSP プログラムから送信した映像を、Zoom、Google Meet、Microsoft Teams、Discord など、カメラ入力に対応するあらゆるアプリケーションで使用できます。

2. アーキテクチャ

hspvcam.dll は1つの DLL で2つの役割を果たします:

(A) HSP プロセス側 (プロデューサ)

HSP から vcam_create / vcam_send_frame 等の関数を呼び出すと、名前付き共有メモリにフレームデータ (BGRA ピクセル) を書き込みます。

(B) 消費側プロセス (コンシューマ)

Zoom や Teams 等のアプリケーションが「IronHSP Virtual Camera」を選択すると、同じ hspvcam.dll がそのアプリのプロセス内に DirectShow フィルタとしてロードされます。フィルタは共有メモリからフレームを読み出して映像ストリームとして出力します。

HSP プログラム (プロデューサ) | | hspvcam.dll (vcam_create / vcam_send_frame / ...) | v 名前付き共有メモリ [IronHSP_VCam_SharedMem] | VCamSharedHeader (64 bytes) + BGRA ピクセルデータ | | 名前付きイベント [IronHSP_VCam_FrameReady] | フレーム更新の通知 v 消費アプリ (Zoom / Teams / OBS / ...) | | hspvcam.dll (DirectShow IBaseFilter として動作) | 共有メモリからフレーム読み出し → 映像ストリーム v アプリ内のカメラ映像として表示

この設計のメリット

3. セットアップ手順

3.1 必要なファイル

ファイル配置先説明
hspvcam.dllHSP ランタイムフォルダDirectShow フィルタ + HSP API (32bit)
hspvcam_64.dllHSP ランタイムフォルダ同上 (64bit)
hspvcam.ascommon/低レベル API ヘッダー
iron_vcam.hspcommon/高レベル API モジュール

3.2 DirectShow フィルタの登録

仮想カメラデバイスを OS に認識させるため、管理者権限のコマンドプロンプトで以下を実行します:

; 32bit 版の登録
regsvr32 hspvcam.dll

; 64bit 版の登録 (64bit アプリで使う場合)
regsvr32 hspvcam_64.dll
注意: regsvr32 は必ず管理者権限で実行してください。通常のコマンドプロンプトでは「アクセスが拒否されました」エラーが発生します。

3.3 登録解除

仮想カメラを削除する場合:

regsvr32 /u hspvcam.dll
regsvr32 /u hspvcam_64.dll

4. クイックスタート

最小限のコードで仮想カメラにフレームを送信する例です:

#include "iron_vcam.hsp"

    ; 640x480, 30fps で仮想カメラを初期化
    vcam_init 640, 480, 30
    if stat != 0 : dialog "失敗" : end

    screen 0, 640, 480
    title "Virtual Webcam"

    repeat
        redraw 0
        color 0, 0, 0 : boxf
        color 255, 255, 255
        pos 10, 10 : mes "Hello Virtual Camera!"
        pos 10, 30 : mes "Frame: " + cnt
        redraw 1

        ; カレントスクリーンを送信
        vcam_send

        await 33   ; 約 30fps
    loop

5. API リファレンス

5.1 高レベル API (iron_vcam.hsp)

#include "iron_vcam.hsp" で利用できるモジュール版 API です。

命令 / 関数説明戻り値 (stat)
vcam_init w, h, fps 仮想カメラを初期化する 0: 成功, -1: 失敗
vcam_send カレントスクリーン全体を送信 0: 成功, -1: 失敗
vcam_send_region x, y, w, h スクリーン領域を送信 (スクリーン座標) 0: 成功, -1: 失敗
vcam_send_buffer buf BGRA バッファを直接送信 0: 成功, -1: 失敗
vcam_is_active() フィルタ接続チェック 1: 接続, 0: 未接続
vcam_term 仮想カメラを終了・解放 0: 成功, -1: 失敗

5.2 低レベル API (hspvcam.as)

#include "hspvcam.as" で利用できる DLL 直接呼び出し API です。

関数 / 命令プロトタイプ説明
vcam_create w, h, fps 共有メモリ作成。stat=0: 成功
vcam_send_frame buf, size BGRA バッファ送信 (サイズ指定)
vcam_is_connected() #cfunc 接続チェック。1=接続, 0=未接続
vcam_close (なし) 共有メモリ解放

6. DirectShow 仮想カメラの仕組み

6.1 DirectShow とは

DirectShow は Windows のマルチメディアフレームワークで、フィルタグラフと呼ばれるパイプラインでメディアを処理します。カメラデバイスは「ソースフィルタ」として実装され、映像フレームをダウンストリームに配信します。

6.2 hspvcam.dll の COM 登録

regsvr32 hspvcam.dll を実行すると、以下のレジストリエントリが作成されます:

キー説明
HKCR\CLSID\{8A5E2CE1-...}フィルタの COM クラス登録
HKCR\CLSID\{8A5E2CE1-...}\InprocServer32DLL パスとスレッディングモデル
HKCR\CLSID\{860BB310-...}\Instance\{8A5E2CE1-...}ビデオキャプチャデバイスカテゴリへの登録

これにより、アプリケーションが CLSID_VideoInputDeviceCategory を列挙したとき (= カメラ一覧を取得したとき) に「IronHSP Virtual Camera」が表示されるようになります。

6.3 フレーム配信の流れ

  1. HSP プログラムが vcam_create() で共有メモリとイベントを作成
  2. HSP が vcam_send_frame() でフレームデータを共有メモリに書き込み、イベントをシグナル
  3. 消費アプリが「IronHSP Virtual Camera」を選択すると、hspvcam.dll がそのプロセス内にロード
  4. DirectShow フィルタのストリーミングスレッドが共有メモリを開き、イベントを待機
  5. イベントがシグナルされるとフレームを読み出し、IMemInputPin::Receive() でダウンストリームに配信
  6. フィルタは consumer_alive フラグを 1 に設定し、HSP 側が接続状態を確認可能

6.4 ピクセルフォーマット

7. アプリケーションでの仮想カメラ選択

7.1 Zoom

  1. 設定 → ビデオ を開く
  2. 「カメラ」ドロップダウンから「IronHSP Virtual Camera」を選択
  3. プレビューに HSP からの映像が表示される

7.2 Microsoft Teams

  1. 設定 → デバイス → カメラ を開く
  2. IronHSP Virtual Camera」を選択

7.3 Google Meet

  1. 設定 (歯車アイコン) → ビデオ を開く
  2. カメラのドロップダウンから選択

7.4 Discord

  1. 設定 → 音声・ビデオ を開く
  2. 「ビデオカメラ」から「IronHSP Virtual Camera」を選択
ヒント: 一部のアプリケーションでは、仮想カメラを認識するためにアプリの再起動が必要な場合があります。regsvr32 実行後にアプリを再起動してください。

8. コード例

8.1 基本的な配信

#include "iron_vcam.hsp"

    screen 0, 640, 480
    vcam_init 640, 480, 30
    if stat != 0 : dialog "初期化失敗" : end

    repeat
        redraw 0
        color 0, 0, 64 : boxf
        color 255, 255, 255
        pos 10, 10 : mes "Live from IronHSP!"
        redraw 1
        vcam_send
        await 33
    loop

8.2 接続状態の監視

#include "iron_vcam.hsp"

    vcam_init 640, 480, 30
    if stat != 0 : end

    screen 0, 320, 100

    repeat
        redraw 0
        color 240, 240, 240 : boxf

        if vcam_is_active() {
            color 0, 128, 0
            pos 10, 10 : mes "状態: 配信中"
        } else {
            color 200, 0, 0
            pos 10, 10 : mes "状態: 待機中"
        }

        color 0, 0, 0
        pos 10, 40 : mes "ESC で終了"
        redraw 1

        vcam_send

        getkey k, 27
        if k : break
        await 100
    loop

    vcam_term
    end

8.3 hspcv4 との連携 (カメラ映像にエフェクト)

#include "iron_vcam.hsp"
#include "hspcv4.as"

    cam_w = 640 : cam_h = 480
    vcam_init cam_w, cam_h, 30
    if stat != 0 : end

    ; 物理カメラを開く
    cv4_video_open 0, "0"

    screen 0, cam_w, cam_h

    repeat
        ; カメラからフレーム取得
        cv4_video_read 0, 1

        ; エッジ検出エフェクト
        cv4cvt 2, 1, CV4_BGR2GRAY
        cv4canny 3, 2, 50, 150, 3

        ; HSP 画面に表示
        redraw 0
        cv4getimg 3, bmscr
        redraw 1

        ; 仮想カメラに送信
        vcam_send

        await 33
    loop

9. トラブルシューティング

症状原因対処
vcam_init が -1 を返す hspvcam.dll が見つからない / パラメータが不正 DLL がランタイムフォルダにあるか確認。width/height/fps は正の整数を指定
カメラ一覧に表示されない regsvr32 が未実行 / 管理者権限なし 管理者権限のコマンドプロンプトで regsvr32 hspvcam.dll を実行。その後アプリを再起動
64bit アプリで認識されない 32bit DLL のみ登録済み regsvr32 hspvcam_64.dll も実行する
vcam_is_active() が常に 0 消費アプリがカメラを選択していない Zoom 等でカメラに「IronHSP Virtual Camera」を選択
映像が真っ暗 HSP 側がフレームを送信していない vcam_send がメインループ内で呼ばれているか確認
映像が暗い青一色 フィルタは動作しているが HSP プログラムが未起動 HSP プログラムを起動して vcam_init + vcam_send を実行
映像がカクつく フレームレートが不足 await の値を確認。30fps なら await 33。描画処理の負荷を確認
色がおかしい (赤と青が入れ替わる) BGRA と RGBA の混同 共有メモリのデータは BGRA 順序。外部ツールで加工する場合は注意
regsvr32 でエラー DLL の依存関係が不足 Visual C++ ランタイムがインストールされているか確認
パフォーマンスのヒント: