Create cool AIR / Flash apps with video recording.

Record AIR / Flash content such as Stage3D, webcam, Movieclips and output mp4 videos!


FlashyWrappers iOS powering Ray Ban #CAMPAIGN4CHANGE by ANTIDOTO Design demonstrates video frame composing.

"Whenever you need a quick app with webcam recording or are working on a creative app with user created content, adding video capture can either become the core of your app or provide means to promote your app through user shared videos."

Key features

  • Capture videos from Flash & AIR: Develop apps with user-generated content, kiosk apps, record game replays etc.
  • Capture individual DisplayObjects: MovieClips, Sprites, BitmapData, Stage3D(on desktop) in case you don't want to capture the UI or other app elements
  • Capture realtime or in post-processing: You can decide to send the video frames later on, if needed - FW doesn't work only in realtime mode
  • Create videos from scratch: Send raw video frames in simple ByteArrays to create MP4's. Don't just capture, create
  • Designed for AIR & Flash: We are also AIR / AS3 devs. FW was built for Adobe platforms to offer AIR / Flash specific features
  • Full video file control: Full access to mp4 files you produce, you can save the mp4 file, send it to your server etc.
  • Crossplatform: One source for AIR iOS / Android* / Mac / Windows and Flash
  • 100% local: No media server is needed, video is encoded by Flash / AIR, provided as ByteArray for your use
  • Audio recording: Record playing sounds(Sound class) & microphone through FWSoundMixer and mix with video
  • MP4 export option on all platforms: Native MP4 encoding on mobile, desktop (for Flash see licensing table for details)
  • OGV export option in Flash Player: Free & open codec alternative for FP
  • NOT FFmpeg based: FFmpeg based solutions are mostly slow software encoders, we use direct access to fast hardware accelerated encoders on iOS and Android.
  • Optimized for iOS: Hardware accelerated video encoding & accelerated fullscreen capture (direct OpenGL ES to video), encoding powered by AVFoundation
  • Optimized for Android: Hardware accelerated video encoding & accelerated fullscreen capture (direct OpenGL ES to video), encoding powered by MediaCodec *
  • Optimized for Flash Player: C++ code crosscompiled to optimized AVM2 bytecode to squeeze out everything Flash got, powered by FFmpeg
  • Optimized for Windows: C++ code compiled to Windows native code, encoding powered by MediaCodec Windows API
  • Optimized for Mac: C++ code compiled to Mac native code, encoding powered by AVFoundation
  • Simple and explained: Quickstart step-by-step guide in PDF, examples with source code (basic, webcam and Starling game)
  • Multithreading: Supports Workers in Flash Player and native multithreading on other platforms when encoding videos
  • FREE option: FlashyWrappers is free or commercial (with full source code access)
  • * currently in alpha

    Features comparsion

    Quick overview of the free and full version features.

    FW "Free" FW "Standard" FW "Premium"
    Recording time 30 seconds Unlimited Unlimited
    Flash Player OGV / MP4 encoder X X
    Android MP4 encoder (alpha) X X
    iOS, Mac, Win video encoders X X X
    Capture individual DisplayObjects, Stage3D or from ByteArrays X X X
    Realtime and non-realtime video encoding X X X
    Hardware acceleration on mobile
    (FW Android requires 4.3+)
    X X X
    Fast fullscreen GLES capture from AIR on mobile X X X
    Export video as MP4 ByteArray X X X
    Use in commercial apps X X
    No FlashyWrappers logo in videos X X
    Free basic support & updates 1 year
    X X
    Latest builds & betas X
    Full source code X

    Get it (16MB)
    Request download link

    Flash & MP4 licensing

    If your target is AIR (desktop or mobile) there are no issues and you can skip this. FlashyWrappers is middleware SDK connecting AIR with OS specific MP4 encoders(like AVFoundation or MediaFoundation). For Flash Player where FW can't connect to the native OS, we piggyback bunch of encoders inside SWF file. Keep in mind that H.264 and AAC encoders, when embedded like that, are subject to patents & royalty payments to the patent holders. To avoid any licensing issues, we're providing also Flash encoders for the completely free OGV codecs.

    Using MP4 encoding in your Flash app is solely under your own responsibility including any royalty payments to H.264 / AAC patent holders.

    Performance

    Our goal is to make FlashyWrappers as effective and stable as possible. This is an ongoing proccess, as we are learning more about the target platforms and also sometimes changes in AIR / Flash Player make the job a little harder. Here's a quick overwiew of how things are now and what you can expect in the future in terms of improvement.

    Android iOS desktop
    (i5 - i7 laptop)
    Flash Player
    (recording at half resolution compared to desktop ANE)
    right now fast (4.3+) very fast very fast bearable / ok
    potential very fast (4.3+) super fast super fast ok
    reason HW accelerated encoding HW accelerated encoding (room for more multithreading) strong CPU's (room for OpenGL / DirectX capturing) running on Flash VM (stuck in non-native Flash sandbox, slow VM)

    Flash Player is the most problematic platform right now because we're stuck in security sandbox. Sometimes users have unrealistic expectations of what FlashyWrappers can do in the web Flash Player. On mobile there's a great potential because of all the hardware acceleration FW can take advantage of(despite the weaker CPU's). But Flash Player is a virtual machine (similar to Java), and there's no way to capture OpenGL / DirectX. We're stuck without any acceleration AND non-native code.

    Online demos (Flash Player)


    This demo shows webcam & microphone capturing. Keep in mind this is the slowest platform (Flash Player), so test it on decent hardware (i5-i7 laptop at least). On AIR desktop / AIR iOS the same demo performs with much higher performace which allows ito to capture at 100% resolution.



    This demo focuses on the way audio & microphone is captured through FWSoundMixer in Flash Player. Keep in mind this is demo of the slowest platform (Flash Player), so if you can try it on "decent" hardware (i5-i7 laptop is fine).


    Hello world!

    Sample code shows how easy it is to generate a video in AS3 (FW 2.4 API)

    
    		    
    
    
    
    package  {       
    
    	
    
    	import com.rainbowcreatures.*;
    
    	import com.rainbowcreatures.swf.*;
    
    	import flash.events.*;
    
    	import flash.net.FileReference;
    
    	import flash.display.MovieClip;
    
    	
    
    	public class Helloworld extends MovieClip {
    
    		
    
    		var myEncoder:FWVideoEncoder;
    
    		var frameIndex:Number = 0;
    
    		var maxFrames:Number = 50;
    
    		
    
    		public function Helloworld() {
    
    			// init FlashyWrappers!
    
    			myEncoder = FWVideoEncoder.getInstance(this);			
    
    			myEncoder.addEventListener(StatusEvent.STATUS, onStatus);
    
    			myEncoder.load();
    
    		}
    
    		
    
    		private function onStatus(e:StatusEvent):void {
    
    			if (e.code == "ready") {
    
    				// FlashyWrappers ready, capture in non-realtime mode(realtime set to false), with no audio
    
    				myEncoder.start(20, FWVideoEncoder.AUDIO_OFF, false);	
    
    			}
    
    			if (e.code == "started") {
    
    				addEventListener(Event.ENTER_FRAME, onFrame);
    
    			}
    
    			if (e.code == "encoded") {
    
    				// save the video
    
    				var saveFile:FileReference = new FileReference();
    
    				saveFile.save(myEncoder.getVideo(), "video.mp4");
    
    			}
    
    		}
    
    		
    
    		private function onFrame(e:Event):void {
    
    			// animate 
    
    			somethingInstance.x++;
    
    			
    
    			// capture the whole stage every frame - you can also capture individual DisplayOjects
    
    			myEncoder.capture();
    
    			frameIndex++;
    
    			if (frameIndex >= maxFrames - 1) {
    
    				// we've had enough of that, let's finish up!
    
    				removeEventListener(Event.ENTER_FRAME, onFrame);				
    
    				myEncoder.finish();
    
    			}
    
    		}							
    
    	}	
    
    }