Flash: Snapshot eines WebCam-Video auf einem WebServer speichern

In Flash kann man Videosignale einer WebCam wunderbar einfach anzeigen lassen. Natürlich kann man (Unterstützung durch den Browser beim Besucher vorausgesetzt) diese Technik dann auch online einsetzen und auf diese Weise Bilder der WebCam hochladen lassen oder anders verarbeiten. Um von einem Videostream einer WebCam in Flash ein einzelnes Bild (Snapshot) zu speichern, hilft folgender Code weiter. Es überträgt einen Snapshot des Videobildes an einen WebServer mithilfe eines PHP-Scriptes (sh. unten). Dabei ist "video" das Videoelement, in welchem der Datenstream der WebCam angezeigt wird.

var fn = "beispiel.jpg";
var url = "http://www.yourhelpcenter.de/beispiel/upload.php?filename=" + fn;

// Snapshot aufnehmen
var snapShot:BitmapData = new BitmapData(video.width,video.height);
snapShot.draw(stage);

// Bild in das JPG (JPEG) Format konvertieren
var bitmapData:BitmapData = snapShot;
var jpgEncoder:JPGEncoder = new JPGEncoder(80); // 80 = Kompressionsrate für JPEG

// Hier wird nur ein Bildausschnitt gespeichert.
// Wenn das vollständige Bild gespeichert werden soll, dann:
// var jpgStream:ByteArray = jpgEncoder.encode(bitmapData);
var jpgStream:ByteArray = jpgEncoder.encode(cropBitmap(bitmapData,new Point(26,28),1096,1556));

// Upload zum WebServer
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var jpgURLRequest:URLRequest = new URLRequest(url);
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = URLRequestMethod.POST;
jpgURLRequest.data = jpgStream;
var loader:URLLoader = new URLLoader();
var l:EncapsulatedURLLoader = new EncapsulatedURLLoader(url,header,jpgStream,loaderComplete);
Entscheidend ist die Abnahme der Bilddaten von "stage" (Zeile 6). Von anderen Quellen / Objekten hat die Bildabnahme nicht einwandfrei funktioniert und gab Fehlermeldungen. Das entsprechende Upload-Script (hier in PHP) sorgt für die Bildspeicherung auf dem Server:
$filename = $_REQUEST["fn"];
$result = file_put_contents($filename . ".jpg", $GLOBALS["HTTP_RAW_POST_DATA"]);

if (!$result) {
        print "Fehler: Kann Datei $filename nicht schreiben. Berechtigungen prüfen.";
}