Recently I wanted to do some simple video slicing in AS3 with FLV's. I did not found any library for that so here is FLVSlicer !
FLVSlicer allows you to extract a "slice" of an FLV at runtime, but also merge multiple slices if you need to. The library may be really useful if you want to get a specific part from an FLV with no server involved. Ley's say for instance that you are looking for a specific text content in a video and you would like to save it on your hard disk or post it on youtube.
The API is really simple :
//create the FLVSlice object var slicer:FLVSlicer = new FLVSlicer(new flvBytes()); // listen for the SlicedEvent.COMPLETE event slicer.addEventListener( SlicedEvent.COMPLETE, onSliced ); // extract the slice with the specific timing (in ms) and save it var firstSlice:FLVSlice = slicer.slice(1000, 3000); // extract another slice with the specific timing (in ms) and save it var secondSlice:FLVSlice = slicer.slice(7200, 8900); // create a FLVSlice vector var slices:Vector.<FLVSlice> = new Vector.<FLVSlice>(); // store the slices slices.push ( firstSlice ); slices.push ( secondSlice ); // merge them as a single FLV stream var merged:FLVSlice = slicer.merge( slices );
The tricky thing was to update each frame timestamp (NetStream.time) without creating any backward timestamp. Then, the onMetaData duration tag is modified so that the sliced FLV works smoothly in the Flash Player. When calling the slice() method from the FLVSlicer API, it will automatically find the nearest keyframe and cut from there. For the ending point, it will slice it with no nearest keyframe behavior.
To illustrate its usage, here is a little demo of the slice() method :
Merging multiple slices will be available in the next release
Merging multiple slices is available since version 0.3.
The current limitation right now with the Flash Player is that you cannot inject the new generated FLV in the NetStream class you have to send it to a server and load it again, damn, do you remember a similar story ? This is now possible with Flash Player 10.1 (NetStream.appendBytes).
Other limitation, when loading a video through the NetStream class, you cannot access the video bytes, so you have to load the video twice : Embed tag to access the video stream and use the traditional NetStream.play() method to play the video.
So please, vote for adding byte access to the NetStream class.
This request has been opened by Benjamin Dobler who created RichFLV a very cool AIR app which does some FLV editing.
Update : Version 0.3 adds a merge(slices:Vector.<FLVSlice) method to merge multiple FLVSlice objects into a single FLV stream.