Просмотр полной версии : [Проблема] Скриншот с вебкамеры
Уважаемые флешеры, выручайте.
Уже больше недели не могу решить одну, может быть и довольно банальную для вас, проблему.
Мне требуется, как вы можете видеть из названия топика, захватить кадр с вебкамеры посредством флеша и сохранить его на сервере (с помощью 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);
?>
Спасибо за ответ но к сожалению для меня вещи не на столько банальны, учитывая очень маленький опыт в работе с 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(...);
}
вот и все:)
Данный пост переписывался раз 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)
Все отлично, swf компилируется без проблем, но при запуске подгружает процессор на 50-70% а в папку генерирует файл либо полностью белый либо полностью черный файл О.о
Venya2007
16.06.2009, 18:31
Mr.Hyde ну, тут уже надо смотреть код. какая у вас версия пхп? когда и как вы сохраняете! попробуйте вывести битмапу которую вы сгенерили, на экран.
Добавлено через 46 секунд
Только что специально протестировал код, все работает
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 проверил, код рабочий. Вы тестируете на денвере или на удаоенном серваке?
На денвере. Сейчас попробую на удаленном.
Попробовал на удаленном. Тот же результат.
Не могли бы вы выложить ваш рабочий вариант?
Venya2007
16.06.2009, 19:27
вот качайте, пробуйте.
Попробовал. Все работает идеально. Огромное спасибо за помощь.
Сейчас пойду ковырять свой код на наличие различий и ошибок
Ребята а подскажите как "зафризить" и "анфризить" изображение на камере именно в этом скрипте
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.