Список актуальных камер юзера.
Делал видео рекордер похожий на ютубовский.
Сразу обратил внимание что после согласия использовать данные с микрофона и видеокамеры появляется сообщение "Looking for Camera Activity". Сделано это для того чтобы отфильтровать из нативного списка Camera.names неактуальные камеры.
Есть несколько вариантов по которым камера может быть неактуальна для использования:
- Камера не подключена
- Другая программа использует камеру
- У одной камеры несколько драйверов, и флеш может работать только с одним…
Все варианты нам на самом деле не особо интересны так как задача – найти работающие камеры способные вести видеосъемку.
Предлагаю класс ActiveCameraList, задачей которого будет создание списка с доступными для реальной записи камерами.
Имеем: нативный список Camera.names;
Решение: поочередно подключаем все доступные камеры и проверяем их активность, в частности currentFPS.
Важный момент - после включения, камере необходимо некоторое время, чтобы инициализироваться, для этого мы будем использовать таймер с задержкой в 2 секунды(подобрано экспериментально).
Реализация: если нативный список камер (Camera.names) не пуст создадим объект Video и приаттачим к нему первую камеру из списка . Далее, запускаем таймер и по тику проверяем currentFPS текущей камеры и если currentFPS больше нуля заносим имя(индекс) текущей камеры в список актуальных камер. Если в списке есть еще камеры, то делаем аналогичную проверку активности всех доступных из нативного списка камер. Когда все камеры проверены создаем сообщение о завершении создания списка(Event.COMPLETE).
Данный метод добычи актуальных камер требует разрешения юзера о передаче данных через камеру и микрофон (сам Camera.names не требует), поэтому -
класс ActiveCameraList также учитывает настройки политики безопасности (и при необходимости просит юзера разрешение на передачу данных).
использование:
_testCams = new ActiveCameraList(); _testCams.addEventListener(Event.COMPLETE, onCompleteScanVideoDevices); _testCams.checkCams();
package media { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.StatusEvent; import flash.events.TimerEvent; import flash.media.Camera; import flash.media.Video; import flash.system.Security; import flash.system.SecurityPanel; import flash.utils.Timer; public class ActiveCameraList extends EventDispatcher { private var _video:Video; private var _currentCamIndex:uint; private var _camera:Camera; /* список актуальных камер */ private var _list:Array = []; /* список с потенциальными камерами */ private var _probableCamList:Array; private var _timer:Timer = new Timer(2000); public function checkCams():void { //если камер не обнаружено if(Camera.names == null) { complete(); return; } //// _probableCamList = Camera.names; _currentCamIndex = 0; _camera = Camera.getCamera(_currentCamIndex.toString()); //если у юзера по умолчанию стоит согласие с передачей данных с микрофона и камеры if(!_camera.muted) { _video = new Video(); _video.attachCamera(_camera); _timer.addEventListener(TimerEvent.TIMER, checkCam); _timer.start(); } //иначе предлагаем юзеру разрешить доступ к камере else { _camera.addEventListener(StatusEvent.STATUS , onCamStatus); Security.showSettings(SecurityPanel.PRIVACY); } } private function onCamStatus(event:StatusEvent):void { // если юзер дал согласие - начинаем тестить камеры, иначе по вашему усмотрению if(!_camera.muted) { _camera.removeEventListener(StatusEvent.STATUS , onCamStatus); _video = new Video(); _video.attachCamera(_camera); _timer.addEventListener(TimerEvent.TIMER, checkCam); _timer.start(); } else { //TODO } // также юзер мог вообще не делать выбор и просто закрыть окно SecurityPanel.PRIVACY как это словить я не знаю (: } private function checkCam(event:TimerEvent):void { //если текущее значение ФПС больше нуля, добавляем в список имя камеры, также можно передать и индекс if(_camera.currentFPS > 0) { _list.push(_camera.name); //_list.push(_currentCamIndex); } // проверяем следующую камеру _currentCamIndex ++; if(_currentCamIndex < _probableCamList.length) { _camera = Camera.getCamera(_currentCamIndex.toString()); _video = new Video(); _video.attachCamera(_camera); _timer.start(); } else { _camera = null; _video = null; _timer.stop(); _timer.removeEventListener(TimerEvent.TIMER, checkCam); complete(); } } private function complete():void { dispatchEvent(new Event(Event.COMPLETE)); } public function get list():Array { return(_list); } }//end class }//end package
Всего комментариев 6
Комментарии
11.03.2011 19:54 | |
Константы имён событий должны принадлежать этим самым событиям. Поэтому статическая COMPLETE нафиг не уперлась, точно такая же есть у Event.
|
11.03.2011 20:25 | |
спасибо! исправил.
|
11.03.2011 20:43 | |
Заинтересовало, спасибо. ^_^
|
15.07.2011 07:39 | |
Весьма полезно!
|
15.07.2011 12:19 | |
15.07.2011 15:55 | |
голова моя друшляк
спасибо |
Последние записи от 3p.station
- Спиннер. Кому лень писать. (12.06.2013)
- AIR. Показываем видео HD на несколько экранов (24.04.2013)
- Парсинг линков в стринге. (03.08.2011)
- автоотправка событий (24.05.2011)
- Список актуальных камер юзера. (11.03.2011)