我有一个 Javascript Web 应用程序,它使用.getUserMedia()
、.applyConstraints()
和相关的浏览器 API 从移动设备 Web 浏览器捕获一些视频,并使用 Websocket 将其发送到某个地方。捕获和发送的东西运行良好。
我已经实现了一个小用户界面,让我的用户打开和关闭手电筒(为相机提供光线的 LED 灯。)
在大多数 Android 设备上,此 UI 可以正常打开和关闭手电筒。但不适用于 Android Studio Mega(运行 Android 8.1.0 和移动 Chrome 81.0.4044.138 的 Build/O11019)
注意:Studio Mega 是 Android 型号名称,与 Android Studio 无关。
在那个设备上,我可以很好地打开手电筒,但它忽略了我关闭手电筒的请求。我使用这样的代码:
const torchstate = false /* works when torchstate = true */
const track = stream.getVideoTracks()[0]
if( track && typeof track.getCapabilities === 'function' ) {
const caps = track.getCapabilities()
if( caps.torch ) {
track.applyConstraints( { advanced: [{ torch: torchstate }] } )
.then( () => {
/* the torch should now be off, but it is not. */
} )
.catch( ( error ) => {
/* My code never hits this catch clause */
console.log( 'setTorch', torchstate ? 'on' : 'off', 'error', error )
} )
}
}
这个 Studio Mega 设备实际上有两个手电筒,一个在后置摄像头上,另一个在自拍摄像头上。我的 UI 打开了我希望它打开的那个(与当前活动的相机关联的那个)。但不关。
按预期关闭stream
手电筒(在我尝试过的所有机器人上)。
有没有其他方法可以关闭手电筒?或者这可能是浏览器、WebRTC 或设备错误?
(对于它的价值 iOS / 移动 Safari 没有火炬功能。所以也许我应该认为这是一个会说话的驴子问题——我应该对它的工作感到惊讶,而不是对它奇怪的工作感到恼火。)