Rilevamento dell'input da videocameraFlash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive In aggiunta ai file video esterni, potete utilizzare una videocamera collegata al computer dell'utente come origine di dati video visualizzabili e manipolabili mediante ActionScript. La classe Camera è il meccanismo incorporato in ActionScript per l'utilizzo di una videocamera. Nozioni fondamentali sulla classe CameraL'oggetto Camera consente di collegarsi alla videocamera locale dell'utente e trasmettere il video a livello locale (cioè, all'utente stesso) oppure a livello remoto a un server (ad esempio, Flash Media Server). Grazie alla classe Camera, è possibile accedere ai seguenti tipi di informazioni relative alla videocamera dell'utente:
La classe Camera fornisce diversi metodi e proprietà per eseguire operazioni con gli oggetti Camera. Ad esempio, la proprietà Camera.names statica contiene un array dei nomi di videocamera attualmente installati sul computer dell'utente. È anche possibile utilizzare la proprietà name per visualizzare il nome della videocamera attualmente attiva. Nota: se eseguite lo streaming di un video sulla rete, gestite sempre le interruzioni di rete. Le interruzioni di rete si possono verificare per molti motivi, in particolare su dispositivi mobili.
Visualizzazione sullo schermo del contenuto della videocameraIl collegamento di una videocamera può richiedere una quantità di codice minore rispetto a quando si utilizzano le classi NetConnection e NetStream per caricare un video. La classe Camera può tuttavia diventare rapidamente complicata, dal momento che con Flash Player per accedere a una videocamera è necessaria l'autorizzazione da parte dell'utente per connettersi alla videocamera. Il codice seguente dimostra come usare la classe Camera per collegarsi alla videocamera locale di un utente: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Nota: la classe Camera non contiene un metodo di costruzione. Per creare una nuova istanza Camera si utilizza il metodo statico Camera.getCamera().
Progettazione di un'applicazione per la videocameraQuando create un'applicazione che si collega alla videocamera di un utente, dovete eseguire le seguenti operazioni relative al codice:
Collegamento alla videocamera di un utenteLa prima operazione da eseguire quando ci si collega alla videocamera di un utente consiste nel creare una nuova istanza di una variabile di tipo Camera in base al valore restituito dal metodo statico Camera.getCamera(). Quindi, è necessario creare un nuovo oggetto video e associare a esso l'oggetto Camera. La terza operazione consiste nell'aggiungere l'oggetto video all'elenco di visualizzazione. Le operazioni 2 e 3 sono necessarie, dal momento che la classe Camera non estende la classe DisplayObject e pertanto non può essere aggiunta direttamente all'elenco di visualizzazione. Per visualizzare il video acquisito dalla videocamera, create un nuovo oggetto video e chiamate il metodo attachCamera(). Le tre operazioni sono illustrate nel codice seguente: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Notate che se per un utente non è installata una videocamera, l'applicazione non visualizza nulla. Nella realtà, è necessario eseguire delle operazioni supplementari per l'applicazione. Per ulteriori informazioni, vedete Verifica dell'installazione delle videocamere e Rilevamento delle autorizzazioni per l'accesso alla videocamera. Verifica dell'installazione delle videocamerePrima di tentare di usare qualunque metodo o proprietà su un'istanza Camera, è necessario verificare che per l'utente sia installata una videocamera. A tale scopo, potete utilizzare uno dei due metodi seguenti:
Dal momento che la classe Camera non estende la classe DisplayObject, non può essere aggiunta direttamente all'elenco di visualizzazione mediante il metodo addChild(). Per visualizzare il video acquisito dalla videocamera, create un nuovo oggetto Video e chiamate il metodo attachCamera() sull'istanza Video. Questo snippet di codice mostra come associare la videocamera (se presente); in caso contrario, l'applicazione non visualizza nulla: var cam:Camera = Camera.getCamera();
if (cam != null)
{
var vid:Video = new Video();
vid.attachCamera(cam);
addChild(vid);
}
Rilevamento delle autorizzazioni per l'accesso alla videocameraNella sandbox dell'applicazione AIR, l'applicazione può accedere a qualsiasi videocamera senza l'autorizzazione dell'utente. In Android, tuttavia, l'applicazione deve specificare l'autorizzazione Android CAMERA nel descrittore dell'applicazione. Per consentire a Flash Player di visualizzare l'output della videocamera, l'utente deve consentire in maniera esplicita l'accesso alla videocamera. Quando il metodo attachCamera() viene chiamato, Flash Player visualizza la finestra di dialogo Impostazioni di Flash Player, che richiede all'utente di consentire o negare a Flash Player di accedere alla videocamera e al microfono. Se l'utente ha consentito l'accesso, Flash Player visualizza l'output della videocamera nell'istanza Video sullo Stage. Se l'utente non consente l'accesso, Flash Player non è in grado di collegarsi alla videocamera e l'oggetto Video non visualizza nulla. Per rilevare se l'utente ha consentito o negato l'accesso alla videocamera, potete intercettare l'evento status della videocamera (StatusEvent.STATUS), come mostrato nel codice seguente: 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"
}
La funzione statusHandler() viene chiamata non appena l'utente fa clic su Consenti o Nega. Mediante uno dei due metodi seguenti potete rilevare su quale pulsante l'utente ha fatto clic:
Verificando l'avvenuto invio dell'evento status, potete scrivere del codice che gestisce l'accettazione o il rifiuto da parte dell'utente dell'accesso alla videocamera ed eseguire la pulizia appropriata del codice. Ad esempio, se l'utente fa clic sul pulsante Nega, potete visualizzare un messaggio che avvisa che è necessario fare clic su Consenti per partecipare a una chat video oppure potete fare in modo che l'oggetto Video nell'elenco di visualizzazione venga eliminato per liberare risorse di sistema. In AIR, un oggetto Camera non invia eventi status poiché l'autorizzazione per utilizzare la video camera non è dinamica. Ottimizzazione della qualità videoPer impostazione predefinita, le nuove istanze della classe Video sono larghe 320 pixel e alte 240 pixel. Per poter ottimizzare la qualità video, è necessario garantire sempre che l'oggetto video abbia le stesse dimensioni del video restituito dall'oggetto Camera. Potete ottenere la larghezza e l'altezza dell'oggetto Camera utilizzando le proprietà width e height della classe Camera, quindi potete impostare le proprietà width e height dell'oggetto Video in modo che corrispondano alle dimensioni dell'oggetto Camera oppure potete passare la larghezza e l'altezza della videocamera al metodo di costruzione della classe Video, come mostrato nello snippet di codice seguente: var cam:Camera = Camera.getCamera();
if (cam != null)
{
var vid:Video = new Video(cam.width, cam.height);
vid.attachCamera(cam);
addChild(vid);
}
Dal momento che il metodo getCamera() restituisce un riferimento a un oggetto Camera (oppure null se non è disponibile alcuna videocamera), potete accedere ai metodi e alle proprietà della videocamera anche se l'utente nega l'accesso alla propria videocamera. In questo modo potete impostare le dimensioni dell'istanza video mediante l'altezza e la larghezza native della videocamera. 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);
}
Per informazioni sulla modalità a schermo intero, vedete la relativa sezione in Impostazione delle proprietà dello stage. Monitoraggio delle condizioni di riproduzioneLa classe Camera contiene alcune proprietà che consentono di monitorare lo stato corrente dell'oggetto Camera. Ad esempio, il codice seguente visualizza diverse delle proprietà della videocamera mediante un oggetto Timer e un'istanza di campo di testo nell'elenco di visualizzazione: 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");
}
Ogni 1/10 di secondo (100 millisecondi) l'evento timer dell'oggetto Timer viene inviato e la funzione timerHandler() aggiorna il campo di testo nell'elenco di visualizzazione. |
|