Flash 如何在Flex应用程序中检测另一个应用程序是否已在使用摄像头?

Flash 如何在Flex应用程序中检测另一个应用程序是否已在使用摄像头?,flash,apache-flex,camera,detection,Flash,Apache Flex,Camera,Detection,我正在制作一个应用程序,播放来自用户本地系统(Windows和Mac)的视频流。我使用Camera.getCamera()方法,然后依次使用Camera.names来获取系统附带的摄像头列表 不幸的是,如果相机已经被其他应用程序使用,比如用户系统上的桌面应用程序,浏览器就会崩溃。是否有任何方法可以检测可用摄像头列表中的特定摄像头是否已被任何其他应用程序使用?听起来您的应用程序中发生的事情比另一个调用camera.getCamera()的应用程序正在使用的摄像头还多如果其他应用程序正在使用相机,则

我正在制作一个应用程序,播放来自用户本地系统(Windows和Mac)的视频流。我使用Camera.getCamera()方法,然后依次使用Camera.names来获取系统附带的摄像头列表


不幸的是,如果相机已经被其他应用程序使用,比如用户系统上的桌面应用程序,浏览器就会崩溃。是否有任何方法可以检测可用摄像头列表中的特定摄像头是否已被任何其他应用程序使用?

听起来您的应用程序中发生的事情比另一个调用camera.getCamera()的应用程序正在使用的摄像头还多如果其他应用程序正在使用相机,则应仅返回null。在尝试使用该值执行任何操作之前,您是否正在检查Camera.getCamera()返回的内容?

听起来您的应用程序中发生的事情不仅仅是另一个应用程序正在使用的摄像头-如果另一个应用程序正在使用该摄像头,则调用Camera.getCamera()的应用程序应该返回null。在尝试使用该值执行任何操作之前,是否检查Camera.getCamera()返回的内容?

对于某些网络摄像头驱动程序,即使其他应用程序正在使用该网络摄像头,Camera对象也不会为空。唯一的区别是,如果相机已在使用中,则在相机连接到视频对象后,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();
}

希望这对其他人有所帮助。

对于某些网络摄像头驱动程序,即使其他应用程序正在使用网络摄像头,摄像头对象也不会为空。唯一的区别是,如果相机已在使用中,则在相机连接到视频对象后,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.currentFps保持常量(非零)超过几毫秒的唯一原因是刚刚拔下摄像头

我要做的是以定时间隔跟踪摄像头,例如每5秒跟踪一次,然后快速连续采集采样数据,例如每50毫秒采集半秒钟

如果currentFps为常数,则所有 样品,相机刚拍下来
拔下插头

谢谢你的回答。问题是Camera.getCamera()仅在系统未连接摄像头时返回null。即使其他应用程序正在使用摄影机,它也会返回摄影机类型的对象。当我得到一个相机对象时,我已经检查了这两种情况的属性,它们之间没有区别,可以帮助识别相机是否已经在使用中。崩溃问题始于flash player中的隐私安全框。如果单击“允许”按钮,浏览器将崩溃。如果拒绝,则不会发生预期的任何事情。希望您现在有一个清晰的图像。什么代码被称为“允许”?在崩溃之前,您是否有状态或活动事件侦听器?我经常在这种情况下测试我的相机应用程序,但不知何故从未遇到过这个错误。我还没有注册任何状态事件的侦听器。在两个不同的浏览器中尝试应用程序,以实现此目的。我不知道如果你在同一个浏览器中从多个应用程序访问同一个摄像头,为什么不会发生这种情况。但是,随着摄像头在桌面应用程序或其他浏览器中的使用,这种情况肯定会发生。在另一个浏览器中使用网络摄像头录制选项,使用youtube视频上传器尝试一个摄像头应用程序,你会看到我在说什么。谢谢你的回答。问题是Camera.getCamera()仅在系统未连接摄像头时返回null。即使其他应用程序正在使用摄影机,它也会返回摄影机类型的对象。当我得到一个相机对象时,我已经检查了这两种情况的属性,它们之间没有区别,可以帮助识别相机是否已经在使用中。崩溃问题始于flash player中的隐私安全框。如果单击“允许”按钮,浏览器将崩溃。如果拒绝,则不会发生预期的任何事情。希望您现在有一个清晰的图像。什么代码被称为“允许”?在崩溃之前,您是否有状态或活动事件侦听器?我经常在这种情况下测试我的相机应用程序,但不知何故从未遇到过这个错误。我还没有注册任何状态事件的侦听器。在两个不同的浏览器中尝试应用程序,以实现此目的。我不知道如果你在同一个浏览器中从多个应用程序访问同一个摄像头,为什么不会发生这种情况。但是,随着摄像头在桌面应用程序或其他浏览器中的使用,这种情况肯定会发生。在另一个浏览器中使用网络摄像头录制选项,在youtube视频上传器上尝试一个摄像头应用程序,你就会明白我在说什么。