2010-03-30 62 views
1

我正在制作播放用户本地系统(包括Windows和Mac)的视频流的应用程序。我使用Camera.getCamera()方法并依次使用Camera.names来获取系统附带的相机列表。如何在Flex应用程序中检测相机是否已被其他应用程序使用?

不幸的是,如果相机已经被其他应用程序使用,比方说用户的系统上的桌面应用程序,浏览器崩溃。有没有什么办法可以检测到可用相机列表中的特定相机是否已被其他应用程序使用?

回答

0

这听起来像有更多的事情与你的应用不仅仅是相机正在使用由其他应用程序 - 调用Camera.getCamera()如果另一个应用程序正在使用相机应该只是返回null。在尝试使用该值做任何事情之前,您是否检查Camera.getCamera()返回的内容?

+0

感谢Quoo回答。 问题是Camera.getCamera()只有在系统没有附加摄像头时才返回null。即使相机正在被其他应用程序使用,它也会返回相机类型对象。当我获取相机对象时,我已经检查了两种情况的属性,并且它们之间没有区别,以帮助识别相机是否已被使用。 崩溃问题从Flash播放器中的隐私安全框开始。如果我点击“允许”按钮,浏览器崩溃。如果被拒绝,没有事情按预期发生。 希望你现在有一个清晰的图片。 – 2010-03-31 07:31:45

+0

什么代码被称为“允许”?你有一个状态或活动事件监听器,它正在崩溃之前?我经常测试我的相机应用程序的这种情况,并以某种方式从未遇到过这个错误。 – quoo 2010-03-31 12:37:48

+0

我没有在状态事件上注册任何监听者。在两个不同的浏览器中尝试您的应用程序,以实现此目的。我不知道为什么在同一浏览器中从多个应用程序访问相同的相机时不会出现这种情况。 但随着相机在桌面应用程序或其他浏览器中使用,它肯定会发生。使用网络摄像头录制选项在不同的浏览器中使用youtube视频上传器试用您的一款相机应用程序,您将看到我在说什么。 – 2010-03-31 13:24:03

3

这是真的,一些摄像头驱动程序,摄像头对象将不能为空,即使摄像头正在被其他应用程序使用。唯一的区别是,如果摄像机已被使用,则摄像机连接到视频对象后,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(); 
} 

希望这可以帮助别人。

2

以我的经验,为camera.currentFps是一个常数(非零)超过几毫秒是,如果相机刚刚被拔出的唯一原因。

我的工作是定时跟踪摄像机,每5秒一次并快速连续收集采样数据,例如每50ms半秒收集一次。

如果currentFps在所有 样本上都保持不变,则相机刚刚取下 拔掉。

相关问题