start shared camera
カメラ許可を要求し、`pose`や`qr`などの名前付きMediaStreamを開始または維持します。
TurboWarp capability extension
TurboWarp-Camera-Sourceは`navigator.mediaDevices.getUserMedia()`を管理し、役割名ごとにライブフレームを共有します。TMは水平カメラ、jsQRや画像認識は下向きカメラ、という構成にできます。
カメラ許可を要求し、`pose`や`qr`などの名前付きMediaStreamを開始または維持します。
opt-inのGPU-backed stage previewを操作します。showを繰り返してもcameraごとにブロック所有leaseは1つです。
ブラウザのカメラ一覧を更新し、役割名をdevice IDへ割り当てられるようにします。
名前付きストリームが有効かを返します。device ID reporterは選択中の物理カメラを返します。
名前付きcameraごとの直近の失敗codeとmessageを返し、開始成功後に消去します。
受信中の幅、高さ、track frame rateを返します。camera停止中または値が不明な場合は0です。
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はフレームをアップロードせず、画像も保存しません。