2010-03-30 102 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在所有 樣本上都保持不變,則相機剛剛取下 拔掉。

相關問題