Generating thumbnail previews using progressive flvs
Added 29 Jul 2008
nc = new NetConnection();
nc.connect(null);
ns = new NetStream(my_nc);
ns.setBufferTime(0.1); // small buffer to limit motion in preview
my_video.attachVideo(ns); // my_video is a video object on stage
ns.play(thefile);
To turn this example into a thumbnail preview of the actual flv you could do this:
ns.onStatus = function (info) {
if(info.code == "NetStream.Buffer.Full"){
ns.pause();
}
};
There's even a way of surpressing the sound resulting in a silent preview:
// soundholder is a simple movieclip on stage
soundholder.attachAudio(ns);
audio = new Sound(soundholder);
audio.setVolume(0);
But what's not so obvious is the fact that even if you pause the video, the flv file will load in its entirety in the background, potentially clogging up a user's connection. This is even more of an issue if you want to display many previews at once.
I found out about this behaviour using a neat little program called Netlimiter. It allows you to see which applications are using what kind of bandwidth and it also enables you to throttle a fast connection on a per application basis, emulating dialup users for example.
I thought it would be easy enough to stop the flv downloading by killing the NetConnection or close the NetStream similar to how this would work using Flashcom. Unfortunately I had no success with that approach, the flv would continue downloading come what may.
Furtunately the workaround was suprisingly easy: try loading a non-existing flv. Here's the code I used:
ns.onStatus = function (info) {
if(info.code == "NetStream.Buffer.Full"){
my_video.attachVideo(null);
ns.pause();
ns.play("nonexist.flv");
}
};
This seems to do the trick quite nicely, showing one frame of the previously loaded flv without clearing the video object. A typical preview only consumed about 5kB to 10 kB of data - a big saving over a whole flv file which is potentially several MB in s