Erfassen von KameraeingabenFlash Player 9 und höher, Adobe AIR 1.0 und höher Neben externen Videodateien kann auch eine Kamera, die an einen Benutzercomputer angeschlossen ist, als Quelle für Videodaten dienen, die Sie mithilfe von ActionScript anzeigen und bearbeiten können. Die Camera-Klasse ist der in ActionScript integrierte Mechanismus zum Arbeiten mit einer an den Computer angeschlossenen Kamera. Camera-KlasseMit dem Camera-Objekt können Sie eine Verbindung zu einer lokalen Kamera herstellen und das Video entweder lokal (zurück an den Benutzer) senden oder remote an einen Server (z. B. an Flash Media Server) übertragen. Mithilfe der Camera-Klasse können Sie auf die folgenden Arten von Informationen zur Benutzerkamera zugreifen:
Die Camera-Klasse umfasst mehrere nützliche Methoden und Eigenschaften für die Verwendung von Camera-Objekten. Beispielsweise enthält die statische Camera.names-Eigenschaft ein Array mit den Namen der Kameras, die derzeit auf dem Benutzercomputer installiert sind. Mit der name-Eigenschaft können Sie auch den Namen der aktuellen aktiven Kamera anzeigen. Hinweis: Beim Streaming von Kameravideo über das Netzwerk sollten Netzwerkunterbrechungen immer verarbeitet werden. Die Netzwerkverbindung kann aus zahlreichen Gründen unterbrochen werden, besonders auf Mobilgeräten.
Anzeigen des Kamerainhalts auf dem BildschirmFür das Anschließen einer Kamera kann weniger Code erforderlich sein als für das Verwenden der NetConnection- und NetStream-Klasse zum Laden einer Videodatei. Andererseits kann die Camera-Klasse auch schnell kompliziert werden, da Sie mit Flash Player eine Genehmigung des Benutzers für eine Verbindung zu dessen Kamera benötigen, bevor Sie darauf zugreifen können. Mit dem folgenden Code wird gezeigt, wie Sie mit der Camera-Klasse eine Verbindung zu einer lokal angeschlossenen Benutzerkamera herstellen können: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Hinweis: Das Camera-Klasse hat keine Konstruktor-Methode. Um eine neue Camera-Instanz zu erstellen, müssen Sie die statische Camera.getCamera()-Methode verwenden.
Entwerfen der Kamera-AnwendungBeim Schreiben einer Anwendung, die eine Verbindung mit einer Benutzerkamera herstellt, muss im Code Folgendes berücksichtigt werden:
Herstellen einer Verbindung mit der Kamera eines BenutzersDer erste Schritt beim Herstellen einer Verbindung mit einer Kamera ist das Erstellen einer neuen Camera-Instanz. Dazu erstellen Sie zunächst eine Variable des Typs Camera und initialisieren diese dann mit dem Rückgabewert der statischen Camera.getCamera()-Methode. Der nächste Schritt ist das Erstellen eines neuen Video-Objekts und das Anhängen des Camera-Objekts an das Video-Objekt. Der dritte Schritt ist das Hinzufügen des Video-Objekts zur Anzeigeliste. Sie müssen die Schritte 2 und 3 ausführen, da die Camera-Klasse die DisplayObject-Klasse nicht erweitert und somit nicht direkt zur Anzeigeliste hinzugefügt werden kann. Um das von der Kamera erfasste Video anzuzeigen, erstellen Sie ein neues Video-Objekt, und rufen Sie die attachCamera()-Methode auf. Diese drei Schritte werden im folgenden Beispielcode gezeigt: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Wenn ein Benutzer keine Kamera installiert hat, wird in der Anwendung keine Ausgabe angezeigt. In der realen Welt müssen Sie zusätzliche Schritte für Ihre Anwendung ausführen. Weitere Informationen finden Sie unter Prüfen auf installierte Kameras und Erfassen der Zugriffsberechtigungen für eine Kamera. Prüfen auf installierte KamerasBevor Sie versuchen, Methoden oder Eigenschaften an einer Camera-Instanz anzuwenden, sollten Sie überprüfen, ob der Benutzer eine Kamera installiert hat. Es gibt zwei Möglichkeiten, um zu überprüfen, ob der Benutzer eine Kamera installiert hat:
Da die Camera-Klasse die DisplayObject-Klasse nicht erweitert, kann sie der Anzeigeliste nicht direkt mit der addChild()-Methode hinzugefügt werden. Um das von der Kamera erfasste Video anzuzeigen, müssen Sie ein neues Video-Objekt erstellen und die attachCamera()-Methode der Video-Instanz aufrufen. Im folgenden Codeausschnitt wird gezeigt, wie Sie eine Verbindung mit einer vorhandenen Kamera herstellen. Wenn keine Kamera vorhanden ist, wird in der Anwendung keine Ausgabe angezeigt: var cam:Camera = Camera.getCamera();
if (cam != null)
{
var vid:Video = new Video();
vid.attachCamera(cam);
addChild(vid);
}
Erfassen der Zugriffsberechtigungen für eine KameraIn der AIR-Anwendungs-Sandbox kann die Anwendung ohne Berechtigung des Benutzers auf alle Kameras zugreifen. Doch unter Android muss die Anwendung die Android-Berechtigung CAMERA im Anwendungsdeskriptor angeben. Bevor die Ausgabe einer Kamera angezeigt werden kann, muss der Benutzer Flash Player den Zugriff auf die Kamera explizit gestatten. Wenn die attachCamera()-Methode aufgerufen wird, wird in Flash Player das Dialogfeld Flash Player-Einstellungen angezeigt, in dem der Benutzer aufgefordert wird, den Zugriff auf die Kamera und das Mikrofon zuzulassen oder zu verweigern. Klickt der Benutzer auf die Schaltfläche „Zulassen“, zeigt Flash Player die Ausgabe der Kamera in der Video-Instanz auf der Bühne an. Klickt der Benutzer auf die Schaltfläche „Verweigern“, kann Flash Player keine Verbindung zur Kamera herstellen und das Video-Objekt bleibt leer. Um festzustellen, ob der Benutzer Flash Player den Zugriff auf die Kamera erlaubt oder verweigert hat, können Sie das status-Ereignis der Kamera überwachen (StatusEvent.STATUS), wie im folgenden Code dargestellt: var cam:Camera = Camera.getCamera();
if (cam != null)
{
cam.addEventListener(StatusEvent.STATUS, statusHandler);
var vid:Video = new Video();
vid.attachCamera(cam);
addChild(vid);
}
function statusHandler(event:StatusEvent):void
{
// This event gets dispatched when the user clicks the "Allow" or "Deny"
// button in the Flash Player Settings dialog box.
trace(event.code); // "Camera.Muted" or "Camera.Unmuted"
}
Die statusHandler()-Funktion wird aufgerufen, sobald der Benutzer entweder auf „Zulassen“ oder „Verweigern“ klickt. Auf welche Schaltfläche der Benutzer geklickt hat, können Sie mit einer der folgenden beiden Methoden feststellen:
Indem Sie überprüfen, ob das status-Ereignis ausgelöst wurde, können Sie Code schreiben, der das Zulassen oder Verweigern des Zugriffs auf die Kamera verarbeitet und entsprechend reagiert. Wenn der Benutzer auf die Schaltfläche „Verweigern“ klickt, können Sie den Benutzer in einer Meldung darauf hinweisen, dass er auf „Zulassen“ klicken muss, wenn er an einem Video-Chat teilnehmen möchte, oder Sie können sicherstellen, dass das Video-Objekt aus der Anzeigeliste gelöscht wird, um Systemressourcen freizugeben. In AIR löst ein Camera-Objekt keine status-Ereignisse aus, da die Berechtigung zur Verwendung der Kamera nicht dynamisch ist. Maximieren der VideoqualitätStandardmäßig sind neue Instanzen der Video-Klasse 320 Pixel breit und 240 Pixel hoch. Zur Maximierung der Videoqualität müssen Sie sicherstellen, dass Ihr Video-Objekt den Abmessungen des vom Camera-Objekt zurückgegebenen Videos entspricht. Sie können die Breite und Höhe des Camera-Objekts mithilfe der Eigenschaften width und height der Camera-Klasse abrufen. Sie können dann die Eigenschaften width und height des Video-Objekts so festlegen, dass sie den Abmessungen des Camera-Objekts entsprechen, oder Sie können die Breite und Höhe der Kamera an die Konstruktormethode der Video-Klasse übergeben. Dies wird im folgenden Codeausschnitt gezeigt: var cam:Camera = Camera.getCamera();
if (cam != null)
{
var vid:Video = new Video(cam.width, cam.height);
vid.attachCamera(cam);
addChild(vid);
}
Da die getCamera()-Methode einen Verweis auf ein Camera-Objekt zurückgibt (oder null, wenn keine Kameras verfügbar sind), können Sie auch dann auf die Methoden und Eigenschaften der Kamera zugreifen, wenn der Benutzer den Zugriff auf die Kamera verweigert hat. Auf diese Weise können Sie die Größe der Video-Instanz mithilfe der nativen Höhe und Breite der Kamera einstellen. var vid:Video;
var cam:Camera = Camera.getCamera();
if (cam == null)
{
trace("Unable to locate available cameras.");
}
else
{
trace("Found camera: " + cam.name);
cam.addEventListener(StatusEvent.STATUS, statusHandler);
vid = new Video();
vid.attachCamera(cam);
}
function statusHandler(event:StatusEvent):void
{
if (cam.muted)
{
trace("Unable to connect to active camera.");
}
else
{
// Resize Video object to match camera settings and
// add the video to the display list.
vid.width = cam.width;
vid.height = cam.height;
addChild(vid);
}
// Remove the status event listener.
cam.removeEventListener(StatusEvent.STATUS, statusHandler);
}
Informationen zum Vollbildmodus finden Sie unter Festlegen der Stage-Eigenschaften. Überwachen der WiedergabebedingungenDie Camera-Klasse enthält verschiedene Eigenschaften, mit denen Sie den aktuellen Status des Camera-Objekts überwachen können. Der folgende Code beispielsweise zeigt verschiedene Eigenschaften der Kamera an. Dazu wird ein Timer-Objekt und eine Textfeld-Instanz in der Anzeigeliste verwendet: var vid:Video;
var cam:Camera = Camera.getCamera();
var tf:TextField = new TextField();
tf.x = 300;
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);
if (cam != null)
{
cam.addEventListener(StatusEvent.STATUS, statusHandler);
vid = new Video();
vid.attachCamera(cam);
}
function statusHandler(event:StatusEvent):void
{
if (!cam.muted)
{
vid.width = cam.width;
vid.height = cam.height;
addChild(vid);
t.start();
}
cam.removeEventListener(StatusEvent.STATUS, statusHandler);
}
var t:Timer = new Timer(100);
t.addEventListener(TimerEvent.TIMER, timerHandler);
function timerHandler(event:TimerEvent):void
{
tf.text = "";
tf.appendText("activityLevel: " + cam.activityLevel + "\n");
tf.appendText("bandwidth: " + cam.bandwidth + "\n");
tf.appendText("currentFPS: " + cam.currentFPS + "\n");
tf.appendText("fps: " + cam.fps + "\n");
tf.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n");
tf.appendText("loopback: " + cam.loopback + "\n");
tf.appendText("motionLevel: " + cam.motionLevel + "\n");
tf.appendText("motionTimeout: " + cam.motionTimeout + "\n");
tf.appendText("quality: " + cam.quality + "\n");
}
Alle 100 Millisekunden wird das timer-Ereignis des Timer-Objekts ausgelöst, und die timerHandler()-Funktion aktualisiert das Textfeld in der Anzeigeliste. |
|