カメラストリームの適切な管理
ステップ1: 既存ストリームの停止
すべてのトラックを停止し、ビデオ要素の`srcObject`を`null`にクリアします。
currentStream.getTracks().forEach(track => {
track.stop();
});
video.srcObject = null;
↓
ステップ2: 解放待機
ストリームが完全に解放されるまで、100ミリ秒待機します。これにより、リソースの競合を防ぎます。
await new Promise(resolve =>
setTimeout(resolve, 100)
);
↓
ステップ3: 新しいストリームの取得
`getUserMedia()`で新しいカメラストリームを取得します。
const stream = await navigator.mediaDevices
.getUserMedia({
video: {
deviceId: { exact: deviceId }
}
});
↓
ステップ4: ビデオ要素への設定
既存の`srcObject`をクリアしてから、新しいストリームを設定します。50ミリ秒待機してから設定することで、確実に切り替わります。
video.srcObject = null;
await new Promise(resolve =>
setTimeout(resolve, 50)
);
video.srcObject = stream;
await video.play();
重要なポイント: ストリームの完全な解放が重要です。`stop()`を呼ぶだけでは不十分で、`srcObject`を`null`にクリアし、さらに待機時間を設けることで、確実に切り替えができるようになりました。
注意: 待機時間が短すぎると、カメラの切り替えが失敗することがあります。100ミリ秒の待機時間は、試行錯誤の結果、最も安定した値でした。