hspvcam DirectShow 仮想カメラプラグイン — 最終更新: 2026-04-18
仮想ウェブカメラ (Virtual Webcam) とは、物理的なカメラデバイスがなくても、ソフトウェアが生成した映像をあたかもウェブカメラの映像であるかのように OS に認識させる仕組みです。
IronHSP の hspvcam プラグインは DirectShow ソースフィルタ として実装されており、regsvr32 で登録すると Windows のカメラデバイス一覧に「IronHSP Virtual Camera」として表示されます。HSP プログラムから送信した映像を、Zoom、Google Meet、Microsoft Teams、Discord など、カメラ入力に対応するあらゆるアプリケーションで使用できます。
hspvcam.dll は1つの DLL で2つの役割を果たします:
HSP から vcam_create / vcam_send_frame 等の関数を呼び出すと、名前付き共有メモリにフレームデータ (BGRA ピクセル) を書き込みます。
Zoom や Teams 等のアプリケーションが「IronHSP Virtual Camera」を選択すると、同じ hspvcam.dll がそのアプリのプロセス内に DirectShow フィルタとしてロードされます。フィルタは共有メモリからフレームを読み出して映像ストリームとして出力します。
| ファイル | 配置先 | 説明 |
|---|---|---|
hspvcam.dll | HSP ランタイムフォルダ | DirectShow フィルタ + HSP API (32bit) |
hspvcam_64.dll | HSP ランタイムフォルダ | 同上 (64bit) |
hspvcam.as | common/ | 低レベル API ヘッダー |
iron_vcam.hsp | common/ | 高レベル API モジュール |
仮想カメラデバイスを OS に認識させるため、管理者権限のコマンドプロンプトで以下を実行します:
; 32bit 版の登録
regsvr32 hspvcam.dll
; 64bit 版の登録 (64bit アプリで使う場合)
regsvr32 hspvcam_64.dll
仮想カメラを削除する場合:
regsvr32 /u hspvcam.dll
regsvr32 /u hspvcam_64.dll
最小限のコードで仮想カメラにフレームを送信する例です:
#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
#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: 失敗 |
#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 |
(なし) | 共有メモリ解放 |
DirectShow は Windows のマルチメディアフレームワークで、フィルタグラフと呼ばれるパイプラインでメディアを処理します。カメラデバイスは「ソースフィルタ」として実装され、映像フレームをダウンストリームに配信します。
regsvr32 hspvcam.dll を実行すると、以下のレジストリエントリが作成されます:
| キー | 説明 |
|---|---|
HKCR\CLSID\{8A5E2CE1-...} | フィルタの COM クラス登録 |
HKCR\CLSID\{8A5E2CE1-...}\InprocServer32 | DLL パスとスレッディングモデル |
HKCR\CLSID\{860BB310-...}\Instance\{8A5E2CE1-...} | ビデオキャプチャデバイスカテゴリへの登録 |
これにより、アプリケーションが CLSID_VideoInputDeviceCategory を列挙したとき (= カメラ一覧を取得したとき) に「IronHSP Virtual Camera」が表示されるようになります。
vcam_create() で共有メモリとイベントを作成vcam_send_frame() でフレームデータを共有メモリに書き込み、イベントをシグナルIMemInputPin::Receive() でダウンストリームに配信consumer_alive フラグを 1 に設定し、HSP 側が接続状態を確認可能#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
#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
#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
| 症状 | 原因 | 対処 |
|---|---|---|
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++ ランタイムがインストールされているか確認 |
vcam_send はスクリーン DC からの BitBlt を伴うため、redraw 1 後に呼び出すこと