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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.06.2009, 12:47
Mr.Hyde вне форума Посмотреть профиль Отправить личное сообщение для Mr.Hyde Найти все сообщения от Mr.Hyde
  № 1  
Ответить с цитированием
Mr.Hyde

Регистрация: Jun 2009
Сообщений: 7
Question [Проблема] Скриншот с вебкамеры

Уважаемые флешеры, выручайте.
Уже больше недели не могу решить одну, может быть и довольно банальную для вас, проблему.
Мне требуется, как вы можете видеть из названия топика, захватить кадр с вебкамеры посредством флеша и сохранить его на сервере (с помощью PHP скрипта).
Гугл был изрыт вдоль и поперек на предмет материала который мог бы мне помочь в данной проблеме. Не без результатно конечно:
А так же поиск по данному форуму:
Но не один из данных примеров не отражает полностью то что мне нужно.
По этому у меня накопилось пара вопросов:
1. Возможно ли захватить кадр с обьекта Video? Или только с MovieClip
2. Нужно ли останавливать воспроизведение видео для этого?
3. Какую библиотеку лучше всего использовать для этого? JPEGEncode?


P.S. Используются Adobe CS4 Pro и FMS 3.5 и естественно Apache 2.2 + PHP 5 c GD lib

Старый 16.06.2009, 13:34
Venya2007 вне форума Посмотреть профиль Отправить личное сообщение для Venya2007 Найти все сообщения от Venya2007
  № 2  
Ответить с цитированием
Venya2007
[+4 16.07.08]

Регистрация: Jul 2008
Адрес: Gamburg
Сообщений: 108
Реализация очень проста

1.рисуйте в битмап дату
2.не обезательно
3.JPEGEncode

вот пример:
Код AS3:
public static function saveImageToServer(val:BitmapData):void{
			if (val!=null){
				var encoder : JPGEncoder = new JPGEncoder(100);
				var picture:ByteArray = encoder.encode(val);
				var urlRequest:URLRequest = new URLRequest();
				urlRequest.url = "saveImageToServer.php";
				urlRequest.contentType="application/octet-stream"
				urlRequest.method = URLRequestMethod.POST;
				urlRequest.data=picture
 
				var urlLoader:URLLoader = new URLLoader();
				urlLoader.load(urlRequest)
			}
		}
вот примерчик пхп
PHP код:
<?php
 session_start
();
if (!
$_SESSION['dirname']){
     
$_SESSION['dirname'] = time();
};
echo(
$_SESSION['dirname']);
if (!
is_dir($_SESSION['dirname'])) {
    
mkdir($_SESSION['dirname']."",0700);
}


$binary file_get_contents('php://input');

if (
$binary){
$fp fopen($_SESSION['dirname']."/image.jpg",'w'); 
if(!
$fp ) { 
    
trigger_error ('error' E_USER_ERROR ); 
} else{
fputs ($fp,$binary); 
fclose ($fp);
echo(
"good save");
};

};
$f=fopen($_SESSION['dirname']."/image.jpg",'rb');
echo(
"filesize".filesize($_SESSION['dirname']."/image.jpg"));
fread($f,filesize($_SESSION['dirname']."/image.jpg"));
fclose($f);


?>

Старый 16.06.2009, 14:24
Mr.Hyde вне форума Посмотреть профиль Отправить личное сообщение для Mr.Hyde Найти все сообщения от Mr.Hyde
  № 3  
Ответить с цитированием
Mr.Hyde

Регистрация: Jun 2009
Сообщений: 7
Спасибо за ответ но к сожалению для меня вещи не на столько банальны, учитывая очень маленький опыт в работе с ActionScript.

Я создал saveImageToServer.as и добавил в него предоставленный вами код внутри package {}
Естественно в проекте прописал связь с этим классом, но при попытке запустить приложение в логах получаю примерно следующее:
"1012: Атрибут static может быть использован только внутри класса"

Не могли бы указать как прописать данную функцию внутри класса?

Старый 16.06.2009, 14:39
Venya2007 вне форума Посмотреть профиль Отправить личное сообщение для Venya2007 Найти все сообщения от Venya2007
  № 4  
Ответить с цитированием
Venya2007
[+4 16.07.08]

Регистрация: Jul 2008
Адрес: Gamburg
Сообщений: 108
Mr.Hyde
Код AS3:
//V_Utility.as
package{
    public class V_Utility{
          public function V_Utility(){
 
          }
          public static function saveImageToServer(val:BitmapData):void{
            ......
          }
 
 
    }
}

далее у вас есть главний клас приложения, например V_Main.as

Код AS1/AS2:
import V_Utility
....
 
private function saveImage():void{
   V_Utility.saveImageToServer(...);
}
вот и все

Старый 16.06.2009, 15:18
Mr.Hyde вне форума Посмотреть профиль Отправить личное сообщение для Mr.Hyde Найти все сообщения от Mr.Hyde
  № 5  
Ответить с цитированием
Mr.Hyde

Регистрация: Jun 2009
Сообщений: 7
Данный пост переписывался раз 5 по причине запоздавших мыслей которые приходили в голову в самый последний момен. Слава богу что большенство довольно таки банальных вещей было отсеяно и остался только последний очень важный для меня аспект.

Код AS3:
//V_Utility.as
 
package{
		import flash.display.BitmapData;
		import flash.utils.ByteArray;
		import flash.events.*;
		import flash.net.*;
		import com.adobe.images.JPGEncoder;
 
    public class V_Utility{
          public function V_Utility(){
 
          }
 
public static function saveImageToServer(val:BitmapData):void{
			if (val!=null){
				var encoder : JPGEncoder = new JPGEncoder(100);
				var picture:ByteArray = encoder.encode(val);
				var urlRequest:URLRequest = new URLRequest();
				urlRequest.url = "saveImageToServer.php";
				urlRequest.contentType="application/octet-stream"
				urlRequest.method = URLRequestMethod.POST;
				urlRequest.data=picture
 
				var urlLoader:URLLoader = new URLLoader();
				urlLoader.load(urlRequest)
			}
		}
	}
}
Код AS3:
//V_Main.fla
 
//-=-=-=-=-=-=-=-= IMPORTS =-=-=-=-=-=-=-=-
 
	import V_Utility;
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
//-=-=-=-=-=-=-=-= VARIABLES =-=-=-=-=-=-=-=-
 
	var myTextField:TextField;
	var cam:Camera;
	var vid:Video;
	var t:Timer = new Timer(2000);
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
//-=-=-=-=-=-=-=-= FUNCTIONS =-=-=-=-=-=-=-=-
 
function onCameraStatus(evt):void 
	{
		if (evt.code == "Camera.Muted")
			{
				trace ("Camera access has been denied");
			}
		if (evt.code == "Camera.Unmuted")
			{
				trace ("Camera access has been granted");
			}
	}
 
function connectCamera():void 
	{
		vid = new Video();
		vid.width = cam.width;
		vid.height = cam.height; 
		vid.attachCamera(cam);
		addChild(vid);
		t.start();
    }
 
function timerHandler(event:TimerEvent):void 
	{
		myTextField.text = "";
		myTextField.appendText("bandwidth: " + cam.bandwidth + "\n");
		myTextField.appendText("currentFPS: " + Math.round(cam.currentFPS) + "\n");
		myTextField.appendText("fps: " + cam.fps + "\n");
		myTextField.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n");
	}
 
function saveImage():void
	{
	//V_Utility.saveImageToServer();
	}
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	myTextField = new TextField();
	myTextField.x = 150;
	myTextField.y = 300;
	myTextField.background = true;
	myTextField.selectable = false;
	myTextField.autoSize = TextFieldAutoSize.LEFT;   
 
	cam = Camera.getCamera();
 
if (!cam) 
	{
		Security.showSettings(SecurityPanel.CAMERA);
	}else{
		cam.addEventListener(StatusEvent.STATUS, onCameraStatus);
		connectCamera();
	}
 
	addChild(myTextField);
	t.addEventListener(TimerEvent.TIMER, timerHandler);
 
btn_print.addEventListener(MouseEvent.CLICK, saveImage);
Каким образом я могу преобразовать flash.media:Video в flash.display:BitmapData что бы потом скормить его функции saveImageToServer()?

Старый 16.06.2009, 16:26
Venya2007 вне форума Посмотреть профиль Отправить личное сообщение для Venya2007 Найти все сообщения от Venya2007
  № 6  
Ответить с цитированием
Venya2007
[+4 16.07.08]

Регистрация: Jul 2008
Адрес: Gamburg
Сообщений: 108
Не советую писать код в кадре.

конверт в ьитмапу:
Код AS3:
var bData:BitmapData=new BitmapData(vid.width,vid.height,false,0);
bData.Draw(vid)


Последний раз редактировалось Venya2007; 16.06.2009 в 16:29.
Старый 16.06.2009, 18:04
Mr.Hyde вне форума Посмотреть профиль Отправить личное сообщение для Mr.Hyde Найти все сообщения от Mr.Hyde
  № 7  
Ответить с цитированием
Mr.Hyde

Регистрация: Jun 2009
Сообщений: 7
Все отлично, swf компилируется без проблем, но при запуске подгружает процессор на 50-70% а в папку генерирует файл либо полностью белый либо полностью черный файл О.о


Последний раз редактировалось Mr.Hyde; 16.06.2009 в 18:13.
Старый 16.06.2009, 18:31
Venya2007 вне форума Посмотреть профиль Отправить личное сообщение для Venya2007 Найти все сообщения от Venya2007
  № 8  
Ответить с цитированием
Venya2007
[+4 16.07.08]

Регистрация: Jul 2008
Адрес: Gamburg
Сообщений: 108
Mr.Hyde ну, тут уже надо смотреть код. какая у вас версия пхп? когда и как вы сохраняете! попробуйте вывести битмапу которую вы сгенерили, на экран.

Добавлено через 46 секунд
Только что специально протестировал код, все работает

Старый 16.06.2009, 18:47
Mr.Hyde вне форума Посмотреть профиль Отправить личное сообщение для Mr.Hyde Найти все сообщения от Mr.Hyde
  № 9  
Ответить с цитированием
Mr.Hyde

Регистрация: Jun 2009
Сообщений: 7
PHP Version 5.2.4

Код AS3:
//V_Main.fla
 
//-=-=-=-=-=-=-=-= IMPORTS =-=-=-=-=-=-=-=-
 
	import V_Utility;
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
//-=-=-=-=-=-=-=-= VARIABLES =-=-=-=-=-=-=-=-
 
	var myTextField:TextField;
	var cam:Camera;
	var vid:Video;
	var t:Timer = new Timer(2000);
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
//-=-=-=-=-=-=-=-= FUNCTIONS =-=-=-=-=-=-=-=-
 
function onCameraStatus(evt):void 
	{
		if (evt.code == "Camera.Muted")
			{
				trace ("Camera access has been denied");
			}
		if (evt.code == "Camera.Unmuted")
			{
				trace ("Camera access has been granted");
			}
	}
 
function connectCamera():void 
	{
		vid = new Video();
		vid.width = cam.width;
		vid.height = cam.height; 
		vid.attachCamera(cam);
		addChild(vid);
		t.start();
    }
 
function timerHandler(event:TimerEvent):void 
	{
		myTextField.text = "";
		myTextField.appendText("bandwidth: " + cam.bandwidth + "\n");
		myTextField.appendText("currentFPS: " + Math.round(cam.currentFPS) + "\n");
		myTextField.appendText("fps: " + cam.fps + "\n");
		myTextField.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n");
	}
 
function saveImage(evt):void
	{
	var bData:BitmapData=new BitmapData(vid.width,vid.height,false,0);
	bData.draw(vid);
	V_Utility.saveImageToServer(bData);
	}
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
	myTextField = new TextField();
	myTextField.x = 150;
	myTextField.y = 300;
	myTextField.background = true;
	myTextField.selectable = false;
	myTextField.autoSize = TextFieldAutoSize.LEFT;   
 
	cam = Camera.getCamera();
 
if (!cam) 
	{
		Security.showSettings(SecurityPanel.CAMERA);
	}else{
		cam.addEventListener(StatusEvent.STATUS, onCameraStatus);
		connectCamera();
	}
 
	addChild(myTextField);
	t.addEventListener(TimerEvent.TIMER, timerHandler);
 
btn_print.addEventListener(MouseEvent.CLICK, saveImage);
Код AS3:
//V_Utility.as
 
package{
		import flash.display.BitmapData;
		import flash.utils.ByteArray;
		import flash.events.*;
		import flash.net.*;
		import com.adobe.images.JPGEncoder;
 
    public class V_Utility{
          public function V_Utility(){
 
          }
 
public static function saveImageToServer(val:BitmapData):void{
			if (val!=null){
				var encoder : JPGEncoder = new JPGEncoder(90);
				var picture:ByteArray = encoder.encode(val);
				var urlRequest:URLRequest = new URLRequest();
				urlRequest.url = "saveImageToServer.php";
				urlRequest.contentType="application/octet-stream"
				urlRequest.method = URLRequestMethod.POST;
				urlRequest.data=picture;
 
 
				var urlLoader:URLLoader = new URLLoader();
				urlLoader.load(urlRequest)
			}
		}
}
}
PHP код:
<?php
 session_start
();
if (!
$_SESSION['dirname']){
     
$_SESSION['dirname'] = time();
};
echo(
$_SESSION['dirname']);
if (!
is_dir($_SESSION['dirname'])) {
    
mkdir($_SESSION['dirname']."",0700);
}

$binary file_get_contents('php://input');

if (
$binary){
$fp fopen($_SESSION['dirname']."/image.jpg",'w'); 
if(!
$fp ) { 
    
trigger_error ('error' E_USER_ERROR ); 
} else{
fputs ($fp,$binary); 
fclose ($fp);
echo(
"good save");
};

};
$f=fopen($_SESSION['dirname']."/image.jpg",'rb');
echo(
"filesize".filesize($_SESSION['dirname']."/image.jpg"));
fread($f,filesize($_SESSION['dirname']."/image.jpg"));
fclose($f);


?>
Заранее благодарю за помощь и проявленное вами терпение

Старый 16.06.2009, 19:06
Venya2007 вне форума Посмотреть профиль Отправить личное сообщение для Venya2007 Найти все сообщения от Venya2007
  № 10  
Ответить с цитированием
Venya2007
[+4 16.07.08]

Регистрация: Jul 2008
Адрес: Gamburg
Сообщений: 108
Mr.Hyde проверил, код рабочий. Вы тестируете на денвере или на удаоенном серваке?

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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