Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Проблема] Скриншот с вебкамеры (http://www.flasher.ru/forum/showthread.php?t=126302)

Mr.Hyde 16.06.2009 12:47

[Проблема] Скриншот с вебкамеры
 
Уважаемые флешеры, выручайте.
Уже больше недели не могу решить одну, может быть и довольно банальную для вас, проблему.
Мне требуется, как вы можете видеть из названия топика, захватить кадр с вебкамеры посредством флеша и сохранить его на сервере (с помощью PHP скрипта).
Гугл был изрыт вдоль и поперек на предмет материала который мог бы мне помочь в данной проблеме. Не без результатно конечно:
А так же поиск по данному форуму:
Но не один из данных примеров не отражает полностью то что мне нужно.
По этому у меня накопилось пара вопросов:
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

вот пример:
Код 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);


?>


Mr.Hyde 16.06.2009 14:24

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

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

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

Venya2007 16.06.2009 14:39

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(...);
}

вот и все:)

Mr.Hyde 16.06.2009 15:18

Данный пост переписывался раз 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()?

Venya2007 16.06.2009 16:26

Не советую писать код в кадре.

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

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

Код 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);


?>

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

Venya2007 16.06.2009 19:06

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


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

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