Onyx version 1 source code released

November 27th, 2006

I’ve finally gotten around to releasing version one of Onyx, the one released for the Flex Developer Derby (http://www.onyx-vj.com/demo). Keep in mind this source was a total hack job — and took a total of about 2 and a half weeks. This source is not intended for re-use, though you can play around with it if you like. Not pretty, but hey, it got me the job. The license for the source is similar to the BSD license.

I will be releasing the source for the new onyx (located at http://www.onyx-vj.com/demo2/) in the next couple days after I get more of the documentation and swc packages in order.

Lemme know what you think, flames included.

Onyx version 1: Demo | Source Code | SVN
Onyx version 2: Demo

On a similar note — anyone with the Flex Beta 2.0.1 have problems exporting their ASDOCs?

Related Item: Stock Control Software – Wasp Barcode ofers stock control software packages to provide small businesses the efficiency of large companies at prices that are affordable.

The future of FLV?

November 13th, 2006

Flash video is increasingly becoming THE standard on the web, and it is arguably the best (because it is standard) movie format — yet it leaves a lot more to be desired. I’m not sure where Adobe stands on changing the FLV format or adding functionality into the Flash Player to deal with extended FLV features, but if certain functions were added to the player we would see even more dynamic applications built using the FLV Video. I’m just putting out my list of functionality that I wish were added to the FLV Format and the Flash Plugins that run the video.

FLV caching.
Most of the larger video sites on the web progressively stream their videos, yet there is no way to cache an FLV if a user comes back to the page. I understand why they chose not to cache FLVs before, but I think there are plenty of usage scenarios now where the ability for developers to cache FLVs might help reduce some bandwidth usage for some video providers.

Dynamic FrameRates and Playback Speed
I’m sure pretty much everyone can agree on this one. We can change perceived frame rate, but there’s no way we can actually do a fast forward or slow motion effect to FLVs. Whenever we see these sort of effects, it’s either through a hacked version of multiple FLVs or the slow motion is actually done within the video itself. Reverse playing would awesome as well.

More information in the metadata header
# of frames, keyframe list, would be nice.
Client side smart keyframing
No one wants to create their videos with too many keyframes, as it increases the size of the exported video. However, purchasing FMS to get actual keyframes seems a bit hokey — why can’t the Flash Player Plug-in dynamically retrieve a full image without having a keyframe?
DRM
TV is currently making it’s move into the FLV world, and some day movies will too. A DRM model is necessary to purchased video.

A mix between FMS playback and Progressive playback
FMS is great for a lot of things, but I don’t think it fits into a model for public viewing of video. The extra RTMP handshake makes it harder on providers to scale. There is always the dynamic FLV header php hack, but having an FMS solution where bits are saved is extremely import to video-based applications — most notably, saving bits to that real-time scrubbing support is possible …

BitmapData.draw on RTMP Sources
The security model put around RTMP sources, Actionscript 3, and BitmapData.draw is flawed. A video can be drawn if the netstream is detached from the video source, and then the stream is re-attached.(thanks Chris Chen) I think it makes more sense to have that security method being sent via FMS to the client player.

Please release an Adobe version of an FLV Player
This I think, just makes a whole hell of a lot of sense.

A simple Flex Component that contains a video
There is currently only a VideoDisplay component, I think a very simple Video UIComponent makes sense (even though it is really easy to make your own)

Sneak peek at Onyx 3.0 beta 1

November 2nd, 2006

A lot of you might have seen the older version of Onyx in the Flex Developer Derby, well, it’s about time I put out a new version … you can take a peek here:

http://www.onyx-vj.com/demo2/

onyx-screen.jpg

This is an entire re-write, and have most of the model objects in place, I just need to wrap them in nice little ui objects. Most notably what is new in this version:

- Addition of Loop Point Markers
- Transitions (right now there is no UI to change the loaded transition yet)
- Support of MovieClips (you can now change the rate of the movie)
- Support of Generated Sprites (load funinthesun.swf)
- Filters that respond to Music Peak (I’lld add the new filters this weekend)

What was in the last version that I need to add back in:

- Camera Support

The UI has changed a little bit – most notably the filters. Click on a filter once it’s been added to change it’s properties.

Just a little something to play around with, I’m shooting for a time next week to have a full list of filters, transitions, as well as some tutorials. You’ll notice the loading times are longer, just cause the files are now a lot bigger (uncompressed is better for doing live video)
1024×768+ with a fast computer recommended.

Convert *some* Flash 8 Movies to Flash9 Movies at runtime

November 1st, 2006

I don’t know how long I’ve been frustrated with the AVM1Movie Class — finally I’ve gotten around to trying to get around the class by modifying the byte header order … I have been able to successfully switch any Flash8 Movie that doesn’t have actionscript in it, just pure frame data … This might not be a huge help for too many of you, but it’s nice for people (like me) that still use uncompressed swfs.
How it works: Change byte 23 to a value of 8. That’s it. I didn’t have to change the 4th byte (which is the version 8 or 9 byte). I have no idea why, but hey, it works, and that’s all that matters. Code is below: (here’s an example swf as well (right click save as))

The output: [object MovieClip] lovely.
package {

import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;

public class ByteHeader extends Sprite {

public function ByteHeader():void {

var convertMovie:Boolean = true;

var request:URLRequest = new URLRequest(‘flash8_movie.swf’)

if (convertMovie) {

var urlloader:URLLoader = new URLLoader();
urlloader.dataFormat = URLLoaderDataFormat.BINARY;
urlloader.addEventListener(Event.COMPLETE, _convertF8Movie);
urlloader.load(request);

} else {

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoaderComplete);
loader.load(request);
addChild(loader);

}

}

private function _convertF8Movie(event:Event):void {

var urlloader:URLLoader = event.currentTarget as URLLoader;
var f8bytes:ByteArray = urlloader.data;

// set version — not necessary
// f8bytes[3] = 9;

// no idea what this byte does, but it’s important
f8bytes[22] = 8;

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoaderComplete);
loader.loadBytes(f8bytes);
addChild(loader);

}

private function _onLoaderComplete(event:Event):void {

var info:LoaderInfo = event.target as LoaderInfo;
trace(info.content);

}

}
}