我正在创建一个应用程序来播放来自用户本地系统(Windows和Mac)的视频流。我使用Camera.getCamera()方法,然后使用Camera.names获取与系统连接的摄像机列表。
不幸的是,如果相机已被其他应用程序使用,比如用户系统上的桌面应用程序,则浏览器会崩溃。有什么方法可以检测到可用相机列表中的特定相机是否已被其他任何应用程序使用?
答案 0 :(得分:3)
对于某些网络摄像头驱动程序,即使其他应用程序正在使用网络摄像头,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();
}
希望这有助于某人。
答案 1 :(得分:2)
根据我的经验,将camera.currentFps作为一个常数(非零)超过几毫秒的唯一原因是如果刚刚拔掉相机的话。
我所做的是以定时间隔跟踪相机,例如每5秒钟一次,快速连续采集采样数据,比如说每50秒一次。
如果currentFps一直保持不变 样品,相机刚刚拿到 拔出。
答案 2 :(得分:0)
听起来你的应用程序还有更多内容,而不仅仅是另一个应用程序正在使用的相机 - 如果另一个应用程序正在使用相机,则调用Camera.getCamera()应该返回null。在尝试对该值执行任何操作之前,您是否检查了Camera.getCamera()返回的内容?