我正在制作一个从用户本地系统(Windows 和 Mac)播放视频流的应用程序。我使用 Camera.getCamera() 方法,然后使用 Camera.names 来获取系统附带的相机列表。
不幸的是,如果相机已经被另一个应用程序使用,比如用户系统上的桌面应用程序,浏览器就会崩溃。有什么方法可以检测可用相机列表中的特定相机是否已被任何其他应用程序使用?
我正在制作一个从用户本地系统(Windows 和 Mac)播放视频流的应用程序。我使用 Camera.getCamera() 方法,然后使用 Camera.names 来获取系统附带的相机列表。
不幸的是,如果相机已经被另一个应用程序使用,比如用户系统上的桌面应用程序,浏览器就会崩溃。有什么方法可以检测可用相机列表中的特定相机是否已被任何其他应用程序使用?
确实,对于某些网络摄像头驱动程序,即使网络摄像头正在被另一个应用程序使用,Camera 对象也不会为空。唯一的区别是,如果相机已在使用中,则在相机附加到 Video 对象后将永远不会触发 ActivityEvent。
我通过将超时设置为 5 秒并在活动事件尚未触发时引发事件来解决该问题:
public function WebCam(w:Number, h:Number, eventClient:Object) {
_camera = Camera.getCamera();
_micLive = Microphone.getMicrophone();
_cameraWidth = w; // DEFAULT_CAMERA_WIDTH;
_cameraHeight = h; // DEFAULT_CAMERA_HEIGHT;
if (_camera != null) {
video = new Video(_camera.width, _camera.height); //displays video feed
video.attachCamera(_camera);
addChild(video);
_camera.addEventListener(StatusEvent.STATUS, cameraStatus);
_camera.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
_camera.setMode(_cameraWidth, _cameraHeight, DEFAULT_CAMERA_FPS)
//set timer to ensure that the camera activates. If not, it might be in use by another application
_waitingActivation = true;
_timer = new Timer(TIMER_INTERVAL);
_timer.addEventListener(TimerEvent.TIMER, activationTimeout);
_timer.start();
}
else {
//Security.showSettings(SecurityPanel.CAMERA)
}
}
private function cameraStatus(event:StatusEvent):void{
trace(_camera.muted);
}
private function activityHandler(e:ActivityEvent):void {
trace('camera Activity');
trace(_camera.activityLevel);
if (e.activating){
this._waitingActivation = false;
}
}
protected function activationTimeout(e:TimerEvent):void{
if (this._waitingActivation)
this.dispatchEvent(new Event(WebCam.ACTIVATION_TIMEOUT, true));
_timer.stop();
}
希望这可以帮助某人。
根据我的经验,camera.currentFps 是一个常数(非零)超过几毫秒的唯一原因是相机刚刚被拔掉。
我所做的是以定时间隔跟踪相机,例如每 5 秒一次并快速连续收集采样数据,例如每 50 毫秒半秒。
如果 currentFps 在所有样本中都是恒定的,则相机刚刚被拔掉。
听起来您的应用程序不仅仅是另一个应用程序正在使用的相机 - 如果另一个应用程序正在使用相机,则调用 Camera.getCamera() 应该只返回 null 。在尝试使用该值执行任何操作之前,您是否正在检查 Camera.getCamera() 返回的内容?