TurboWarp-Camera-Source

TurboWarp capability extension

姿勢、画像、QRでカメラを使い分ける。

TurboWarp-Camera-Sourceは`navigator.mediaDevices.getUserMedia()`を管理し、役割名ごとにライブフレームを共有します。TMは水平カメラ、jsQRや画像認識は下向きカメラ、という構成にできます。

start shared camera posestart shared camera qrcamera device ID at 1

ブロック

start shared camera

カメラ許可を要求し、`pose`や`qr`などの名前付きMediaStreamを開始または維持します。

camera previewの表示・非表示

opt-inのGPU-backed stage previewを操作します。showを繰り返してもcameraごとにブロック所有leaseは1つです。

refresh camera devices

ブラウザのカメラ一覧を更新し、役割名をdevice IDへ割り当てられるようにします。

shared camera is running?

名前付きストリームが有効かを返します。device ID reporterは選択中の物理カメラを返します。

camera error

名前付きcameraごとの直近の失敗codeとmessageを返し、開始成功後に消去します。

frame入力reporter

受信中の幅、高さ、track frame rateを返します。camera停止中または値が不明な場合は0です。

API capability

unsandboxed拡張は`Scratch.vm.runtime.ext_kubohiroyacamerasource`を参照できます。

const poseLease = await cameraSource.acquireCamera({
  owner: 'tm',
  cameraId: 'pose',
  deviceId: poseDeviceId
});
const qrLease = await cameraSource.acquireCamera({
  owner: 'jsqr',
  cameraId: 'qr',
  deviceId: qrDeviceId
});
const previewLease = await cameraSource.acquireCamera({
  owner: 'camera-preview',
  cameraId: 'pose',
  preview: true,
  mirrored: true
});
const frame = qrLease.getFrameSource();
await qrLease.release();
await previewLease.release();
await poseLease.release();

各ストリームは最後のleaseが解放されるまで維持されます。同じcameraIdなら1つの物理カメラを共有し、異なるIDなら別カメラを同時利用できます。

preview: trueは、そのleaseで専用のGPU-backed stage previewを有効にします。共有video elementをdrawImage()、getImageData()、CPU pixel走査なしでtexImage2D(video)へ渡します。左右反転はdrawable scaleだけを変更し、WebGPU、WebCodecs、vision consumer向けのframe.elementは未加工のままです。

この経路は明示的なCPU readbackを避けますが、ブラウザ内部のzero-copyは保証しません。色変換やGPU転送が発生する可能性があります。

ブロック所有previewは、名前付きcameraの停止、作品の停止・再読込、runtime dispose時に解放されます。

プライバシーと要件

カメラ利用にはユーザー許可とHTTPSまたはlocalhostなどの安全なコンテキストが必要です。Camera Sourceはフレームをアップロードせず、画像も保存しません。