Tuesday, February 13, 2007

Flex Builder cut me

Wait, didn't I say I liked Flex Builder? Yes I did, but they could make things a hell of a lot better. I talked about some of the things I wish Flex builder had in an earlier post, but I recently come across a couple other things. When debugging dynamic expressions cannot be evaluated in watches. This was very frustrating when doing some xml parsing as the attributes of an xml snip are accessed via dynamic methods on the xml object. It goes something like this:

var xml:XML = < r>< e1 >< a1 >< /a1 >< /e1>< /r>
xml.e1


Now, if I put a watch on something like 'xml.element1' Flex Builder says that it can't evaluate the expression because of an exception. This was very frustrating as I thought there actually was a problem with my xml or syntax. The real problem was with Flex builder not being able to evaluate the dynamic expression when in debug mode. To get around this all I did was assign the value of 'xml.element1' to a variable, then put a watch on that variable.

Videos don't have to tell you how long they are

There is really no surefire way to tell how long an flv is. If you search the web or post something on flexcoders someone will quickly point out that if you hook into the onMetaData handler of the stream you can get the duration of the video. How nice of them. Then you try it out and find that it doesn't work at all for you, those liars! Well, they weren't fibbing, they were just making assumptions about what you were doing. The fact is that onMetaData only works if the flv has metadata associated with it. Yes, that makes, but why wouldn't they have it set? Simple answer is no idea, I think earlier versions of flash didn't requiare it, or maybe something was used to convert the file to flash, either way it doesn't work. Fortunately there are some tools out there that will inject the metadata into the flv so that you can use that convenient onMetaData handler everyone pointed out. FLVTool2 is pretty good at this, and comes in command line and UI covered flavors. There is also a library written in Ruby that slips my mind at the moment, though I've heard it's quite good.

You cannot set the playhead time

Well, you can, but you better hope it is on or just after a keyframe or else you have no idea where the video will start playing from. I thought it would be cool to add a frame stepper to my player, then could do some neat jitter effects or something, but no. Apparently when you do a seek or set the playhead time of a video it will only navigate to the closest keyframe of the video. This sucks if you're trying to work with flvs that you do not have control over, as the keyframes could be set anywhere. The one video I was testing didn't even have them at regular intervals (keyframes were between 0.01 and 7 seconds apart). This is what ended up killing my frame stepping idea.