PDA

Просмотр полной версии : [Проблема] Скриншот с вебкамеры


Mr.Hyde
16.06.2009, 12:47
Уважаемые флешеры, выручайте.
Уже больше недели не могу решить одну, может быть и довольно банальную для вас, проблему.
Мне требуется, как вы можете видеть из названия топика, захватить кадр с вебкамеры посредством флеша и сохранить его на сервере (с помощью PHP скрипта).
Гугл был изрыт вдоль и поперек на предмет материала который мог бы мне помочь в данной проблеме. Не без результатно конечно:

http://www.sephiroth.it/tutorials/flashPHP/print_screen/page002.php
http://designreviver.com/tutorials/actionscript-3-jpeg-encoder-revealed-saving-images-from-flash/
http://www.ultrashock.com/forums/actionscript/as3-save-bitmap-82715.html
http://mattkenefick.com/blog/2008/11/saving-jpegs-with-flash/

А так же поиск по данному форуму:

http://www.flasher.ru/forum/showthread.php?t=118025


Но не один из данных примеров не отражает полностью то что мне нужно.
По этому у меня накопилось пара вопросов:
1. Возможно ли захватить кадр с обьекта Video? Или только с MovieClip
2. Нужно ли останавливать воспроизведение видео для этого?
3. Какую библиотеку лучше всего использовать для этого? JPEGEncode?


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

Venya2007
16.06.2009, 13:34
Реализация очень проста

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

вот пример:

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
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);


?>

Mr.Hyde
16.06.2009, 14:24
Спасибо за ответ но к сожалению для меня вещи не на столько банальны, учитывая очень маленький опыт в работе с ActionScript.

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

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

Venya2007
16.06.2009, 14:39
Mr.Hyde

//V_Utility.as
package{
public class V_Utility{
public function V_Utility(){

}
public static function saveImageToServer(val:BitmapData):void{
......
}


}
}



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


import V_Utility
....

private function saveImage():void{
V_Utility.saveImageToServer(...);
}


вот и все:)

Mr.Hyde
16.06.2009, 15:18
Данный пост переписывался раз 5 по причине запоздавших мыслей которые приходили в голову в самый последний момен. Слава богу что большенство довольно таки банальных вещей было отсеяно и остался только последний очень важный для меня аспект.


//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)
}
}
}
}



//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()?

Venya2007
16.06.2009, 16:26
Не советую писать код в кадре.

конверт в ьитмапу:

var bData:BitmapData=new BitmapData(vid.width,vid.height,false,0);
bData.Draw(vid)

Mr.Hyde
16.06.2009, 18:04
Все отлично, swf компилируется без проблем, но при запуске подгружает процессор на 50-70% а в папку генерирует файл либо полностью белый либо полностью черный файл О.о

Venya2007
16.06.2009, 18:31
Mr.Hyde ну, тут уже надо смотреть код. какая у вас версия пхп? когда и как вы сохраняете! попробуйте вывести битмапу которую вы сгенерили, на экран.

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

Mr.Hyde
16.06.2009, 18:47
PHP Version 5.2.4


//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);



//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
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);


?>


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

Venya2007
16.06.2009, 19:06
Mr.Hyde проверил, код рабочий. Вы тестируете на денвере или на удаоенном серваке?

Mr.Hyde
16.06.2009, 19:12
На денвере. Сейчас попробую на удаленном.

Попробовал на удаленном. Тот же результат.
Не могли бы вы выложить ваш рабочий вариант?

Venya2007
16.06.2009, 19:27
вот качайте, пробуйте.

Mr.Hyde
16.06.2009, 19:39
Попробовал. Все работает идеально. Огромное спасибо за помощь.

Сейчас пойду ковырять свой код на наличие различий и ошибок

IIaBeJI
03.05.2011, 15:40
Ребята а подскажите как "зафризить" и "анфризить" изображение на камере именно в этом скрипте