[ActionScipt3/Flex] JPEG aus Webcamvid. klappt nicht

DelphiKing

King with a crown
ID: 46719
L
20 April 2006
6.553
729
Aloha,

ich habe mal angefangen mich in Adobe Flex einzuarbeiten und wollte nun eine Anwendung schreiben, welche das Webcambild einer angeschlossenen Webcam zeigt (funktioniert!) und dann auf Knopfdruck ein JPEG davon grabbt und anzeigt (bzw. weiterverarbeiten lässt letztenendes).

Meinen Code habe ich mir größtenteils aus Internetquellen zusammengeschustert, zu finden ist das "Tutorial" hier: https://www.video-flash.de/index.php/jpg-bilder-von-webcam-abspeichern/ (der interessante Teil allerdings dort)

Mein Code sieht atm so aus:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="https://www.adobe.com/2006/mxml"
  layout="vertical"
  verticalAlign="middle"
  width="700" height="400">

  <mx:Script>
    <![CDATA[
      import mx.controls.Alert;
      import encoding.JPEGEncoder;
      import flash.utils.ByteArray;
      import flash.events.*;
      import flash.display.Loader;
      
      var vorschau:Loader = new Loader();
      
      var myJPEGData:ByteArray
      
      function createJPEG ():void
      {

        // neues Bitmap-Objekt
        var myBmd:BitmapData = new BitmapData ( videoDisplay.width, videoDisplay.height );


        // Bitmap vom Video erstellen
        myBmd.draw ( videoDisplay );


        // neues JPEP-Objekt (Angabe in Klasmmern ist die Qualitaet)
        var myEnc:JPEGEncoder = new JPEGEncoder(20);


        // neues ByteArray (binaere Daten)
        myJPEGData = myEnc.encode (myBmd);


        // loadBytes() laedt binaere Daten aus einem ByteArray
        vorschau.loadBytes (myJPEGData);


        // vorschau auf der Buehne platzieren
        // ### PROBLEM! ###
        addChild (vorschau);
        Alert.show("Bild erstellt");

      }

      private function videoDisplay_creationComplete():void {
        var camera:Camera = Camera.getCamera();
        if (camera)
        {
          camera.setMode(320, 240, 15);
          videoDisplay.attachCamera(camera);
        }
        else
        {
          Alert.show("Keine Webcam erkannt.");
        }
      }
    ]]>
  </mx:Script>

  <mx:VideoDisplay id="videoDisplay"
    creationComplete="videoDisplay_creationComplete();"
    width="320"
    height="240" />


  <mx:Button id="button"
    label="Shot!"
    click="createJPEG();" />

</mx:Application>

Das Problem tritt auf an der Stelle [Z.44] addChild (vorschau); auf... denn da bricht er irgendwie im Stillen bei der Ausführung ab, denn [Z.45] Alert.show("Bild erstellt"); wird nicht mehr ausgeführt... nur wieso nicht? Und was kann ich tun, damit es doch ausgeführt wird?

Mir wäre ja btw. auch schon geholfen, wenn jemand, der Flash besitzt mir den AS-Teil aus dem Beispielcode rauskopieren könnte - denn mit der darin befindlichen FLA-Datei kann ich nix anfangen...


liebe grüße
flo
 
Zuletzt bearbeitet:
Code:
import flash.net.NetStream;
import flash.events.NetStatusEvent;
import flash.utils.ByteArray;
import encoding.JPEGEncoder;
import flash.display.Loader;

// ::::: Video ::::::

var myVideo:Video = new Video(400,300);
addChild(myVideo);
myVideo.x = 20;
 
var nc:NetConnection = new NetConnection();
nc.connect(null);

var ns:NetStream = new NetStream(nc);
myVideo.attachNetStream(ns);
ns.play("sand.flv");

var customClient:Object = new Object();
ns.client = customClient;

ns.addEventListener(NetStatusEvent.NET_STATUS, statusmeldungen);
 
function statusmeldungen(meldungen:Object)
{
	// Loop
	if (meldungen.info.code == "NetStream.Play.Stop") {
		ns.seek(0);
		ns.resume();
	}
};
 
// :::: Loader --> Anzeigen des JPEGs :::::

var vorschau:Loader = new Loader();
vorschau.x = 480;


// :::: JPG erstellen :::::

var myJPEGData:ByteArray;

function createJPEG ( evt:MouseEvent ):void 

{

	// neues Bitmap-Objekt
	var myBmd:BitmapData = new BitmapData ( myVideo.width, myVideo.height );
	
	// Bitmap vom Video erstellen
	myBmd.draw ( myVideo );
	
	// neues JPEP-Objekt (Angabe in Klasmmern ist die Qualitaet)
	var myEnc:JPEGEncoder = new JPEGEncoder(20);
	
	// neues ByteArray (binäre Daten)
	myJPEGData = myEnc.encode (myBmd);
	
	// loadBytes() lädt binäre Daten aus einem ByteArray
	vorschau.loadBytes (myJPEGData);
	
	// vorschau auf der Bühne platzieren
	addChild (vorschau);
	
	// Save-Button anzeigen
	buttonSave.visible = true;

}

buttonPreview.addEventListener (MouseEvent.MOUSE_UP, createJPEG);


// :::: JPG speichern :::::

buttonSave.addEventListener (MouseEvent.MOUSE_UP, save);
buttonSave.visible = false;

// neuer URLLoader zum Senden der Daten an den Server
var myURLLoader:URLLoader = new URLLoader();
myURLLoader.addEventListener ( Event.COMPLETE, onImageSent )


function save(evt:MouseEvent) {
	
	// neue URL-Anfrage festlegen
 	var myRequest:URLRequest = new URLRequest ("save-to-disk.php?name=meinBild.jpg"); 
	
	// Content-type (application/octet-stream) header festlegen und hinzufügen
 	var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
	myRequest.requestHeaders.push (header);
 	
	// über POST versenden
 	myRequest.method = URLRequestMethod.POST;
 	
	// JPEG-Daten mit der URL-Anfrage verknüpfen
 	myRequest.data = myJPEGData;
	
	// URLLoader mit der URL-Anfrage verknüpfen und danach laden
	myURLLoader.load (myRequest); 
	navigateToURL (myRequest, "_blank");
}
	

function onImageSent ( evt:Event ):void 

{
	var loader:URLLoader  = URLLoader (evt.target);
	var myVars:URLVariables = new URLVariables (loader.data);
	tf.text = "https://www.meinserver.de/" + myVars.result;

}

bitte schön ;)
 
Ui, bist ein Schatz :kiss:

Ich guck nachher mal ob ich damit weiterkomme ... ist net ganz kompatibel zu Flex/AS3..
 
Hm, bringt mich leider auch nicht weiter, der Code ist eigentlich gleich zu dem was ich auch hatte.. nur beim umbasteln in Flex bzw. durch offenbar leicht geänderte Sachen in Flex im Gegensatz zu Flash/AS3 hat das nicht hin wie oben beschrieben :S

Weiß noch jemand Rat?