Как обнаружить в приложении Flex, если камера уже используется другим приложением? - PullRequest
1 голос
/ 30 марта 2010

Я делаю приложение, которое воспроизводит видеопоток из локальной системы пользователя (как Windows, так и Mac). Я использую метод Camera.getCamera () и, в свою очередь, Camera.names, чтобы получить список камер, подключенных к системе.

К сожалению, если камера уже используется другим приложением, например, настольным приложением в системе пользователя, браузер не работает. Могу ли я определить, используется ли конкретная камера из списка доступных камер каким-либо другим приложением?

Ответы [ 3 ]

3 голосов
/ 16 июня 2010

Это правда, что с некоторыми драйверами веб-камеры объект Camera не будет иметь значение null, даже если веб-камера используется другим приложением. Единственное отличие состоит в том, что ActivityEvent никогда не будет запущен после того, как камера прикреплена к объекту Video, если камера уже используется.

Я решил проблему, установив тайм-аут на 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 голосов
/ 14 июня 2011

По моему опыту, единственная причина, по которой camera.currentFps должен быть постоянным числом (ненулевым) в течение нескольких миллисекунд, заключается в том, что камера только что была отключена.

Что я делаю, так это отслеживаю камеру через определенные промежутки времени, например, один раз каждые 5 секунд и собирайте данные выборки в быстрой последовательности, скажем, каждые 50 мсек в течение полсекунды.

Если currentFps постоянен во всех образцы, камера только что получила отключен от сети.

0 голосов
/ 30 марта 2010

Похоже, что с вашим приложением происходит нечто большее, чем просто использование камеры другим приложением - вызов Camera.getCamera () должен просто вернуть значение null, если другое приложение использует камеру. Проверяете ли вы, что Camera.getCamera () возвращает, прежде чем пытаться что-либо делать с этим значением?

...