Camera-invoer vastleggenFlash Player 9 of hoger, Adobe AIR 1.0 of hoger Naast externe videobestanden kunt u een camera die op de computer van de gebruiker is aangesloten, gebruiken als bron van videogegevens en met ActionScript weergeven en manipuleren. De klasse Camera is het mechanisme dat in ActionScript is ingebouwd voor het werken met een computercamera. De klasse CameraMet 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:
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 weergevenWanneer 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 ontwerpenWanneer u een toepassing schrijft die verbinding maakt met de camera van de gebruiker, moet u in uw code met het volgende rekening houden:
Verbinding maken met de camera van een gebruikerBij 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ïnstalleerdVoordat 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:
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); } Bevoegdheden detecteren voor cameratoegangIn 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:
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 optimaliserenNieuwe 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. Voorwaarden voor afspelen controlerenDe 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. |
![]() |