Let's face it, Flash is almost dead and AIR situation isn't the best. However, FlashyWrappers video recording core doesn't depend on Flash / AIR. FW has always been C++ based. This makes it very possible to port FW to other platforms. The only question is your demand.
Currently, you can take a survey to tell us which port you'd prefer. You might also contact us directly.
NOTE: Whenever the above happens depends on your demand / interest. We're currently not in a position to port FW to new platforms with uncertain / non-existing demand.
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 | ||
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.
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.
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).
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();
}
}
}
}