Werken met camera's

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Een camera die op de computer van de gebruiker is aangesloten, kan fungeren als bron van videogegevens die u met ActionScript kunt weergeven en manipuleren. De klasse Camera is het in ActionScript geïntegreerde mechanisme voor het werken met de camera van een computer of apparaat.

Op mobiele apparatuur kunt ook de klasse CameraUI gebruiken. De klasse CameraUI start een afzonderlijke cameratoepassing waarmee de gebruiker een foto of video kan vastleggen. Wanneer de gebruiker klaar is, kan de toepassing de afbeelding of de video benaderen door middel van een MediaPromise -object.

De klasse Camera

Met het Camera-object kunt u verbinding maken met de lokale camera van de gebruiker en de video lokaal (terug naar de gebruiker) of extern naar de server (zoals Flash Media Server) uitzenden.

Wanneer u de klasse Camera gebruikt, hebt u toegang tot de volgende soorten informatie over de camera van de gebruiker:

  • Welke op de computer of het apparaat van de gebruiker geïnstalleerde camera's beschikbaar zijn

  • Of een camera is geïnstalleerd

  • Of Flash Player toegang heeft tot de camera van de gebruiker

  • Welke camera op dit moment actief is

  • De breedte en hoogte van de video die wordt vastgelegd

De klasse Camera bevat verschillende nuttige methoden en eigenschappen die bij het werken met Camera-objecten kunnen worden gebruikt. De statische eigenschap Camera.names bevat bijvoorbeeld een array van namen van camera’s die op dit moment op de computer van de gebruiker zijn geïnstalleerd. U kunt ook de eigenschap name gebruiken om de naam weer te geven van de camera die momenteel actief is.

Opmerking: Tijdens het streamen van videobeelden van een camera via het netwerk, dient u netwerkonderbrekingen altijd af te handelen. Er kunnen vele redenen zijn voor netwerkonderbrekingen, vooral op mobiele apparatuur.

Camera-inhoud op het scherm weergeven

Wanneer u verbinding maakt met een camera, hoeft u minder code te schrijven dan wanneer u de klassen NetConnection en NetStream gebruikt om een videobestand te laden. Het gebruik van de klasse Camera kan ook vaak lastig zijn omdat u met Flash Player toestemming van de gebruiker nodig hebt om verbinding te maken met de camera voordat u toegang tot de camera kunt krijgen.

De volgende code geeft aan hoe u de klasse Camera kunt gebruiken om verbinding te maken met de lokale camera van de gebruiker:

var cam:Camera = Camera.getCamera(); 
var vid:Video = new Video(); 
vid.attachCamera(cam); 
addChild(vid);
Opmerking: De klasse Camera bevat geen constructormethode. Wanneer u een nieuwe Camera-instantie wilt maken, gebruikt u de statische methode Camera.getCamera() .

Cameratoepassingen ontwerpen

Wanneer u een toepassing schrijft die verbinding maakt met de camera van de gebruiker, moet u in uw code met het volgende rekening houden:

  • Controleer of de gebruiker een camera heeft geïnstalleerd. Handel het geval af als geen camera beschikbaar is.

  • Alleen voor Flash Player: controleer of de gebruiker expliciet toegang tot de camera heeft toegestaan. De speler geeft uit veiligheidsoverwegingen het dialoogvenster Instellingen Flash Player weer, waarmee de gebruiker toegang tot de camera kan toestaan of weigeren. Hierdoor wordt voorkomen dat Flash Player verbinding maakt met een camera van de gebruiker en een videostream uitzendt zonder dat hiervoor toestemming is gegeven. Wanneer de gebruiker op Toestaan klikt, mag uw toepassing verbinding maken met de camera van de gebruiker. Wanneer de gebruiker op Weigeren klikt, heeft uw toepassing geen toegang tot de camera van de gebruiker. In uw toepassingen moeten beide gevallen altijd netjes worden afgehandeld.

  • Alleen AIR: controleer of de Camera-klasse wordt ondersteund voor de apparaatprofielen die door uw toepassing worden ondersteund.

  • De Camera-klasse wordt niet ondersteund in mobiele browsers.

  • De Camera-klasse wordt niet ondersteund in mobiele AIR-toepassingen die de GPU-rendermodus gebruiken.

  • Op mobiele apparaten kan slechts één camera tegelijkertijd actief zijn.

Verbinding maken met de camera van een gebruiker

Bij de eerste stap voor het maken van verbinding met de camera van de gebruiker, maakt u een nieuwe Camera-instantie door een variabele van het type Camera te maken en deze te initialiseren op de geretourneerde waarde van de statische methode Camera.getCamera() .

Bij de tweede stap moet u een nieuw Video-object maken en het Camera-object hieraan koppelen.

Bij de derde stap voegt u het Video-object aan de weergavelijst toe. De stappen 2 en 3 moeten worden uitgevoerd omdat de klasse Camera de klasse DisplayObject niet uitbreidt. Hierdoor kan deze niet direct aan de weergavelijst worden toegevoegd. Wanneer u de vastgelegde video van de camera wilt afspelen, maakt u een nieuw Video-object en roept u de methode attachCamera() op.

De volgende code geeft deze drie stappen weer:

var cam:Camera = Camera.getCamera(); 
var vid:Video = new Video(); 
vid.attachCamera(cam); 
addChild(vid);

Als de gebruiker geen camera heeft geïnstalleerd, geeft de toepassing niets weer.

In de praktijk moet u mogelijk aanvullende stappen aan uw toepassing toevoegen. Zie Controleren of camera's zijn geïnstalleerd en Bevoegdheden detecteren voor cameratoegang voor meer informatie.

Controleren of camera's zijn geïnstalleerd

Voordat u probeert methoden of eigenschappen voor een Camera-instantie te gebruiken, controleert u of de gebruiker een camera heeft geïnstalleerd. Er zijn twee manieren om te controleren of de gebruiker een camera heeft geïnstalleerd:

  • Controleer de statische eigenschap Camera.names , die een array bevat van namen van camera’s die beschikbaar zijn. Deze array bevat normaal gesproken één of minder tekenreeksen, omdat de meeste gebruikers waarschijnlijk niet meer dan één camera tegelijk hebben geïnstalleerd. De volgende code toont hoe u de eigenschap Camera.names kunt controleren om te bepalen of de gebruiker beschikbare camera’s heeft:

    if (Camera.names.length > 0) 
    { 
        trace("User has at least one camera installed."); 
        var cam:Camera = Camera.getCamera(); // Get default camera. 
    } 
    else 
    { 
        trace("User has no cameras installed."); 
    }
  • Controleer de geretourneerde waarde van de statische methode Camera.getCamera() . Wanneer er geen camera’s beschikbaar of geïnstalleerd zijn, retourneert deze methode null ; anders retourneert de methode een verwijzing naar het Camera-object. De volgende code toont hoe u de methode Camera.getCamera() kunt controleren om te bepalen of de gebruiker beschikbare camera’s heeft:

    var cam:Camera = Camera.getCamera(); 
    if (cam == null) 
    { 
        trace("User has no cameras installed."); 
    } 
    else 
    { 
        trace("User has at least 1 camera installed."); 
    }

Omdat de klasse Camera de klasse DisplayObject niet uitbreidt, kan deze niet direct aan de weergavelijst worden toegevoegd met de methode addChild() . Wanneer u de vastgelegde video van de camera wilt afspelen, moet u een nieuw Video-object maken en de methode attachCamera() op de Video-instantie aanroepen.

In dit fragment wordt weergegeven hoe u de camera kunt aansluiten, als die bestaat. Als dat niet het geval is, geeft de toepassing niets weer:

var cam:Camera = Camera.getCamera(); 
if (cam != null) 
{ 
    var vid:Video = new Video(); 
    vid.attachCamera(cam); 
    addChild(vid); 
}

Camera's op mobiele apparatuur

De klasse Camera wordt in mobiele browsers niet ondersteund in de Flash Player-runtime.

In AIR-toepassingen op mobiele apparatuur kunt u de camera of camera's op het apparaat benaderen. Op mobiele apparaten kunt u zowel de naar voren als de naar achteren gerichte camera gebruiken, maar de uitvoer van slechts één camera kan tegelijkertijd worden weergegeven. (Wanneer u een tweede camera aansluit, wordt de eerste losgekoppeld.) De naar voren gerichte camera wordt horizontaal gespiegeld op iOs, maar op Android is dit niet het geval.

Bevoegdheden detecteren voor cameratoegang

In de AIR-toepassingssandbox kan de toepassing zonder toestemming van de gebruiker toegang krijgen tot elke camera. Op Android moet de toepassing echter de Android CAMERA-bevoegdheid opgeven in het descriptorbestand van de toepassing.

Voordat Flash Player de uitvoer van een camera kan weergeven, moet de gebruiker Flash Player expliciet toegang tot de camera geven. Wanneer de methode attachCamera() wordt aangeroepen, geeft Flash Player het dialoogvenster Instellingen Flash Player weer, waarin de gebruiker wordt gevraagd Flash Player toegang tot de camera en de microfoon te verlenen of te weigeren. Als de gebruiker op de knop Toestaan klikt, geeft Flash Player de uitvoer van de camera weer in de Video-instantie op het werkgebied. Wanneer de gebruiker op de knop Weigeren klikt, heeft Flash Player geen toegang tot de camera en geeft het Video-object niets weer.

Wanneer u wilt controleren of de gebruiker Flash Player toegang tot de camera heeft verleend, kunt u naar de gebeurtenis status ( StatusEvent.STATUS ) van de camera luisteren. Dit wordt in de volgende code geïllustreerd:

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" 
}

De functie statusHandler() wordt aangeroepen zodra de gebruiker op Toestaan of Weigeren klikt. U kunt controleren op welke knop de gebruiker heeft geklikt door een van de volgende twee methoden te gebruiken:

  • De parameter event van de functie statusHandler() bevat de eigenschap code, die de tekenreeks ‘Camera.Muted’ of ‘Camera.Unmuted’ bevat. Wanneer de waarde ‘Camera.Muted’ is, heeft de gebruiker op de knop Weigeren geklikt en heeft Flash Player geen toegang tot de camera. U ziet een voorbeeld in het volgende fragment:

    function statusHandler(event:StatusEvent):void 
    { 
        switch (event.code) 
        { 
            case "Camera.Muted": 
                trace("User clicked Deny."); 
                break; 
            case "Camera.Unmuted": 
                trace("User clicked Accept."); 
                break; 
        } 
    }
  • De klasse Camera bevat de alleen-lezen eigenschap muted , die aangeeft of de gebruiker cameratoegang heeft geweigerd ( true ) of heeft toegestaan ( false ) via het deelvenster Privacy van Flash Player. U ziet een voorbeeld in het volgende fragment:

    function statusHandler(event:StatusEvent):void 
    { 
        if (cam.muted) 
        { 
            trace("User clicked Deny."); 
        } 
        else 
        { 
            trace("User clicked Accept."); 
        } 
    }

Door de statusgebeurtenis te controleren die wordt verzonden, kunt u code schrijven die het toestaan of weigeren van cameratoegang door de gebruiker afhandelt en vervolgens systeemresources opschoont. Als de gebruiker bijvoorbeeld op de knop Weigeren klikt, kunt u een bericht aan de gebruiker weergeven waarin wordt aangegeven dat op de knop Toestaan moet worden geklikt als de gebruiker aan een videochat wil deelnemen. U kunt er ook voor zorgen dat het Video-object uit de weergavelijst wordt verwijderd zodat systeemresources kunnen worden opgeschoond.

In AIR verzendt een Camera-object geen statusgebeurtenissen, aangezien de bevoegdheid om de camera te gebruiken niet dynamisch is.

Videokwaliteit van de camera optimaliseren

Nieuwe instanties van de klasse Video zijn standaard 320 pixels breed en 240 pixels hoog. Wanneer u de videokwaliteit wilt optimaliseren, moet u er altijd voor zorgen dat het Video-object dezelfde afmetingen heeft als de video die door het Camera-object wordt geretourneerd. U kunt de breedte en hoogte van het Camera-object ophalen met de eigenschappen width en height van de klasse Camera. Vervolgens kunt u de eigenschappen width en height van het Video-object instellen op de afmetingen van de Camera-objecten, zodat deze overeenkomen met die van de Camera-objecten. Ten slotte kunt u de breedte en hoogte van de camera doorgeven aan de constructormethode van de klasse Video. Dit wordt in het volgende fragment geïllustreerd:

var cam:Camera = Camera.getCamera(); 
if (cam != null) 
{ 
    var vid:Video = new Video(cam.width, cam.height); 
    vid.attachCamera(cam); 
    addChild(vid); 
}

Aangezien de methode getCamera() een verwijzing aan een Camera-object doorgeeft (of null als er geen camera’s beschikbaar zijn), hebt u toegang tot de methoden en eigenschappen van de camera, zelfs als de gebruiker cameratoegang weigert. Hierdoor kunt u de grootte van de Video-instantie met de native hoogte en breedte van de camera instellen.

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

Zie de sectie over de modus Volledig scherm onder De eigenschappen van Stage instellen voor informatie over de modus Volledig scherm.

Toezicht houden op de status van de camera

De klasse Camera bevat verschillende eigenschappen waarmee u de huidige status van het Camera-object kunt controleren. De volgende code geeft bijvoorbeeld verschillende eigenschappen van de camera in de weergavelijst weer met een Timer-object en een tekstveldinstantie:

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"); 
}

Elke 1/10 van een seconde (100 milliseconden) wordt de gebeurtenis timer van het Timer-object verzonden en wordt het tekstveld door de functie timerHandler() in de weergavelijst bijgewerkt.