Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > 3p.station

Оценить эту запись

Список актуальных камер юзера.

Запись от 3p.station размещена 11.03.2011 в 18:48
Обновил(-а) 3p.station 15.07.2011 в 15:56

Делал видео рекордер похожий на ютубовский.
Сразу обратил внимание что после согласия использовать данные с микрофона и видеокамеры появляется сообщение "Looking for Camera Activity". Сделано это для того чтобы отфильтровать из нативного списка Camera.names неактуальные камеры.
Есть несколько вариантов по которым камера может быть неактуальна для использования:
- Камера не подключена
- Другая программа использует камеру
- У одной камеры несколько драйверов, и флеш может работать только с одним…
Все варианты нам на самом деле не особо интересны так как задача – найти работающие камеры способные вести видеосъемку.
Предлагаю класс ActiveCameraList, задачей которого будет создание списка с доступными для реальной записи камерами.

Имеем: нативный список Camera.names;
Решение: поочередно подключаем все доступные камеры и проверяем их активность, в частности currentFPS.
Важный момент - после включения, камере необходимо некоторое время, чтобы инициализироваться, для этого мы будем использовать таймер с задержкой в 2 секунды(подобрано экспериментально).
Реализация: если нативный список камер (Camera.names) не пуст создадим объект Video и приаттачим к нему первую камеру из списка . Далее, запускаем таймер и по тику проверяем currentFPS текущей камеры и если currentFPS больше нуля заносим имя(индекс) текущей камеры в список актуальных камер. Если в списке есть еще камеры, то делаем аналогичную проверку активности всех доступных из нативного списка камер. Когда все камеры проверены создаем сообщение о завершении создания списка(Event.COMPLETE).
Данный метод добычи актуальных камер требует разрешения юзера о передаче данных через камеру и микрофон (сам Camera.names не требует), поэтому -
класс ActiveCameraList также учитывает настройки политики безопасности (и при необходимости просит юзера разрешение на передачу данных).

использование:
Код AS3:
_testCams = new ActiveCameraList();
_testCams.addEventListener(Event.COMPLETE, onCompleteScanVideoDevices);
_testCams.checkCams();
сам классик вышел небольшой, отдельный файл не заливаю
Код AS3:
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 etc вне форума
etc
 
Аватар для etc
Константы имён событий должны принадлежать этим самым событиям. Поэтому статическая COMPLETE нафиг не уперлась, точно такая же есть у Event.
Старый 11.03.2011 20:25 3p.station вне форума
3p.station
 
Аватар для 3p.station
спасибо! исправил.
Старый 11.03.2011 20:43 Хемуль вне форума
Хемуль
 
Аватар для Хемуль
Заинтересовало, спасибо. ^_^
Старый 15.07.2011 07:39 XoJlToH вне форума
XoJlToH
 
Аватар для XoJlToH
Весьма полезно!
Старый 15.07.2011 12:19 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
спасибо! исправил.
не совсем)
Код AS3:
_testCams.addEventListener(ActiveCameraList.COMPLETE, onCompleteScanVideoDevices);
Старый 15.07.2011 15:55 3p.station вне форума
3p.station
 
Аватар для 3p.station
голова моя друшляк
спасибо
 

 


Часовой пояс GMT +4, время: 19:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.