Preview Frames

Preview Frames

Once you have connected to a camera device you are most likely going to want to show a preview to your users.

Preview frames are provided through the CameraEvent.VIDEO_FRAME event. This is dispacted from a camera device whenever a preview frame is available. The event indicates that bitmap data representing the current view through the camera device is available.

device.addEventListener( CameraEvent.VIDEO_FRAME, camera_videoFrameHandler );

When you receive the event you can then query the extension for the frame buffer using the getFrameBuffer function. This function takes a ByteArray which will be filled with the bitmap data of the preview frame.

A ByteArray is used to ensure we can transfer the data from the native side to your AS3 quickly, attempting to keep the frame rate of your preview frame as high as possible.

To render the data you should create an appropriately sized BitmapData object and use the setPixels to update the bitmap data from the ByteArray.

Firstly lets create the bitmap data:

var _previewBitmapData:BitmapData = new BitmapData( 1, 1, false );
var _previewBitmapRect:Rectangle = new Rectangle( 0, 0, 1, 1 );
//
// Check we have an appropriately sized bitmapdata and texture
// Recreate if not
if (_previewBitmapData.width != device.width || _previewBitmapData.height != device.height)
{
trace( "resizing to: (" + device.width +", "+ device.height +")" );
_previewBitmapData.dispose();
_previewBitmapData = new BitmapData( device.width, device.height, false );
_previewBitmapRect = new Rectangle( 0, 0, _previewBitmapData.width, _previewBitmapData.height );
}

Then in our event handler we update from the frame buffer.

private function camera_videoFrameHandler( event:CameraEvent ):void
{
if (-1 != device.getFrameBuffer( _previewData ))
{
try
{
//
// Update the bitmapdata and texture
_previewBitmapData.setPixels( _previewBitmapRect, _previewData );
// For Starling 1.x
// flash.display3D.textures.Texture(_previewTexture.base).uploadFromBitmapData( _previewBitmapData );
// For Starling 2.x
flash.display3D.textures.RectangleTexture(_previewTexture.base).uploadFromBitmapData( _previewBitmapData );
}
catch (e:Error)
{
trace( e );
}
finally
{
_previewData.clear();
_lastFrameProcessed = frame;
}
}
}

We also suggest you rotate the container of your bitmap data to match the orientation of the camera device. You should use the device.info.orientation value to rotate appropriately.

See the example applications for demonstrations of this, and the following gists: