Pyro : a video player API for Flash

video player API for flash


Pyro is the name of the class set we have been using internally at Turbulent to build all the media players for our many corporate web clients. It’s the results of over 10 rewrites and many many revisions.

“Why build yet another video player?” you ask. Pyro only integrates the core logic of playing video using flash. Yea, sure, you can build your own thing using NetStream/NetConnection, hey , that’s basically what Pyro does and that’s what professionnals do. They do it over and over again. So why waste time with all the same problems like size handling, duration, bandwidth detection, etc? It’s from this question that Pyro was born.

It bundles all core functionalities of standard flash video players but leaves out defined design aspects to the developers while leveraging a common, simple and direct AS3 API for handling progressive http, proxied http and rtmp (rtmps, etc..) streams.

So we wrote some code and documented it.
You can find all the latest versions at our google code repo, right HERE.

For now this is a first release to see if there is interest in the community of using and contributing to Pyro. We use Pyro in a number of commercial applications and we keep adding and supporting the small but very functionnal codebase.

Here’s a basic usage example:

1. Create a Pyro instance, insert width then height as arguments and add your pyro instance to the child list. If you don’t pass it width / height, Pyro will adjust it’s size to the stream you want to play.

“Do one thing but do it well”

Pyro is already at the heart of many of web projects that we have produced in the past few years and such is the case of the National Film Board of canada (NFB). The video player we built for the NFB uses Pyro to implement features like closed-captioning and voice over tracks as well as support 3 modes of streaming. You can see it in action on the www.NFB.ca website.

NFB / ONF player -  built on Pyro

Here is a dumb list of what the API provides:

- Support for progressive download (duh)
- Support for progressive download with time offsets ( for streaming from a specific time offset in a file)
- Support for RTMP streaming
- Bandwidth detection
- Automatic bufferTime adjustment based on client bandwidth
- Play / Pause / Buffer state management
- Volume control and mute state
- Many resizing options including ratio, fixed or auto-detect.
- Simple queue point integration and support.
- Duration handling as well as progress ratio
- Load ratio

Hey we’re not reinventing the wheel here. Just making a small solid video player API that implements what we keep repeating all the time. We’ve been pretty careful with memory leaks as well, so hopefully the API is not leaking :)

PATIENCE PLEASE
Please be indulgent, Pyro is always evolving and is far from beeing perfect. It might be missing features you were desperately hoping for , if that’s the case, we’re DEFINITLY opened to developing them. Drop us a comment!

Give it a shot , see if it’s useful, and if it is, please let us know!

Here’s the docs, and source…again.

Stay tuned for more examples !

Eric
pyrosmalllogo1

59 Responses to “Pyro : a video player API for Flash”

  1. ssandy Says:

    I am currently looking for a easy to use video solution, I am looking at the Open video (openvideoplaye.com), I use flex Would this work in flex???

  2. Benoit Beausejour Says:

    Hi ssandy, Pyro will definitely work inside Flex since it simply uses the flash core NetStream/NetConnection and is really in the end a simple DisplayObject. We do not yet have component wrappers for it though, that’s something that will definitely come later down the line for us.

  3. Eric Poirier Says:

    Just a small addon to what Benoit was previously answering..

    You can instanciate a pyro instance in flex by doing something like this:

    Pyro in flex
    import mx.core.UIComponent;
    import mx.core.IUIComponent;
    import ca.turbulent.media.Pyro;

    public var pyro:Pyro;

    public function initE(e:*=null):void
    {
    pyro = new Pyro(300, 300);
    var helloPyroComp:UIComponent = new UIComponent();
    helloPyroComp.addChild(pyro);
    addChild(helloPyroComp);

    pyro.play(”yourflvURLflv”);

    }

  4. ssandy Says:

    Thanks guys, I see it is Open source under the BSD License. Cool!

  5. r_bartoli Says:

    Hi guys,
    thank you for sharing this useful api.

    I’m testing it now to use it in the next projects involving a video player. I can’t understand this part of your example:

    /* or use a middleware script to start streaming at a defined offset, in which case
    Pyro will take care of feeding your front-end the right data for progress bars etc.
    */
    pyroInstance.play(”http://myvideosite.com/videos/gratton.flv?start=34.454″);

    What kind of middleware script I need?

    Cheers

  6. Eric Poirier Says:

    It is meant to be used with server side scripts that do flash video streaming without the need of a full fledge media server.

    You can find such scripts here :
    http://blog.lighttpd.net/articles/2006/03/09/flv-streaming-with-lighttpd
    http://www.flashcomguru.com/index.cfm/2005/11/2/Streaming-flv-video-via-PHP-take-two

    This approach allows video streams to start or seek at any point in time, whereas regular progressive downloads only allow flash videos to be seeked in time points that are already buffered.

    Best way to look at it is that you can start a stream at a particular point without having to wait for that time point to be buffered.

    Lets say I want my video to start playing at the 34th second, I would call the play method like so:
    pyroInstance.play(”http://myvideosite.com/videos/gratton.flv?start=34

    Hope that answers your question. :)
    Cheers.

    We are working on detailed exemples to that will help understand how to use all of Pyro’s functionalities properly. Shouldnt be too long.

  7. links for 2009-01-22 « Brent Sordyl’s Blog Says:

    [...] Pyro : a video player API for Flash at Agit8 “Why build yet another video player?” you ask. Pyro only integrates the core logic of playing video using flash. Yea, sure, you can build your own thing using NetStream/NetConnection, hey , that’s basically what Pyro does and that’s what professionnals do. They do it over and over again. So why waste time with all the same problems over and over again like size handling, duration, bandwidth detection, etc? It’s from this question that Pyro was born. (tags: flash api video) [...]

  8. ssandy Says:

    Hi guys worked Gr8 I have one problem and it is design related I will like to add my controls on top of the video instead of below but the addChild brings the video to front even when on another state, any tips on how I could work around this????

  9. Eric Poirier Says:

    Hey ssandy.

    I have a small exemple I put together for you integrating a pyroInstance inside a stated flex application.
    It should give you hints as to how you can approach this matter.

    It is very simple and easy to implement.

    I’ll send it by email.

  10. ssandy Says:

    THANKS A MILLION!
    That did it made it easy for the code challenged, creating a component did the trick I am now able to place the toolbar over the video, state or no state, maybe would have figured it out sooner or later.. more later, but you were right I am on a time-line…

    I must say I am impressed by the number features in PYRO, it makes designing players in flex a joy!

    Notes I made

    The smoothing property throws an error [ nestedPyro.pyro.smoothing = true; ] am I using it wrong??

    I couldn’t find a progress event to update the video time(s) displays so i used an EnterFrame Event with the formattedDuration, formatted… properties, I was wondering if this would be a problem.

    Thanks for everything…..

  11. Eric Poirier Says:

    Hey no problem.

    I’ll check the smoothing issue for you as quick as I can.

    For the progress monitoring we decided, after much discussion, to leave it to developpers to implement that kind of behaviour, so you made the good assumption, and there is no problem with that technique.

    And you found the formatted time stamps properties. Excellent.

  12. Eric Poirier Says:

    Unfortunately the way I integrated the smoothing mechanism is not right and it throws an error if pyro’s video instance is not already instanciated.

    My mistake :(

    You can easily get it working by setting the smoothing once your positive the video is instanciated. Best way to do it would be to listen to the PyroEvent.STARTED Event and set your smoothing once received.

    Thanks.

  13. ssandy Says:

    OK I got smoothing to work cool, How do you get the bytesTotal Property I found the bytesLoaded???

    Thanks in advance.

  14. Eric Poirier Says:

    You probably need a progressBar and bufferingBar (or loading status bar) right ?

    Pyro has 2 very cool properties called progressRation and loadRatio. Both are based on 1. So values of those 2 are always in between 0 and 1.

    Usually, I use it like so:

    progressBar_mc.scaleX = pyro.progressRatio;
    bufferingBar_mc.scaleX = pyro.loadRatio;

  15. ssandy Says:

    Got it thanks again.

  16. localToGlobal » Blog Archive » news review -> 4th week of 2009 Says:

    [...] > Pyro : a video player API for Flash at Agit8 [...]

  17. Neil Sanderson / NFB puts Canadian films online Says:

    [...] NFB is using the open-source Pyro video player API for Flash, from Turbulent Web Development in Montreal. These icons link to social bookmarking [...]

  18. sinewafer Says:

    Eric,
    Is it possible that I could get a copy of the Flex example that you knocked up for Ssandy - to show how to set up Pyro in Flex? I would really appreciate it as your playre looks great. Thank you.

  19. Eric Poirier Says:

    Well for those inquiring about the flex exemple I did…. here it is.
    Note this is only a quick thing I put together, it might not be the best way to approach this, but hey, it works A1 from what I can see.

    http://agit8.turbulent.ca/source/pyro/PyroFlex.zip

  20. xleon Says:

    First, I want to thank you for the really good job you´re done here. I really apreciate it.
    I´ve tried the player on a normal scenario (displayList) and everything is ok. Very easy. But I found a problem when trying to add a pyro instance to a Papervision3D MovieMaterial. I saw some of your code and I realised you just start the video stuff after “added_to_stage” event is triggered. So I guess that´s the main reason it doesn´t run on PV.
    ¿Did you know about this issue?
    Maybe you guys could make a way to play a video without adding it to stage, or maybe some other way to make it run in a MovieMaterial.

  21. Eric Poirier Says:

    Thanks xleon,

    The initializing on the Event.ADDED_TO_STAGE will disapear in the next build.
    My bad, I didnt properly think this thru.

    Thats what I get for going fancy pants on instanciation. ;)

    I could tell you to go on and hack it by commenting line 541 and replacing it with a direct call to the initialize() method.
    But I’m guessing errors will pop here and there since the code contains references and depencies to the stage.

    I’ll tackle this FOR SURE in a near future.

    Thanks again for this constructive remark. I appreciate this a lot.

  22. r_bartoli Says:

    Hi guys,
    how do you use the STREAM_TYPE_PROXIED_PROGRESSIVE mode?
    How can I set the address of the middleware php file?

    In the example I’ve seen this used:
    pyroInstance.play(”http://myvideosite.com/videos/gratton.flv?start=34.454″);

    How can you call a flv file without using the php file?
    I’ve read all the code and comments in the classes but I have seen anything.

    Thanks a lot for the help

  23. Eric Poirier Says:

    First and foremost, there is no other way to start streams than the play() method

    Under a well integrated middleware flash video streaming solution, you should not have to do anything else but calling play with your url as argument. Its transparent to the API.

    Usually with lighty it would be something like : pyroInstance.play(”httpd://videosite.com/streams/videos/gratton.flv?start=34.343″);

    If by calling an flv without using the php file, you mean no PHP at ALL, and you cant use an RTMP stream, well it’s all up to you to come up with an inventive way to do this with the good old http progressive download (STREAM_TYPE_PROGRESSIVE).

    This means you wont be able to append the url with a “start” variable.

    The basics of such a concept would be:
    – Pause the video ( pyroInstance.pause(); ) If autoPlay==true .
    – Code a function that checks if your “time point” is buffered.
    – Once buffered as desired, then call seek() with the “time point” as argument, ( pyroInstance.seek(timePoint); )
    – Finally unpause ( pyroInstance.play(); ) the stream.

    I have used this method a few times but was never fully satisfied with it, mainly because the higher the timepoint, the higher the wait.

  24. r_bartoli Says:

    Hi Eric,
    I was asking about the php file because I’m using the xmoov-php method. A lot of the metadata parameters injected by flvmdi.exe inside the flv file are used for the streaming purpose, but I think that them are not passed inside the info obj during the onMetaData event.

    Am I right?

  25. Eric Poirier Says:

    I had this issue before. I will not go into details as to why it does that, but in a very odd way, it makes sense.

    There is something really important I forgot to mention. Try calling play without your start param appended at the end, then, once the flv is in, call play again with the same url with your start param.

    The reason behind this is Pyro needs the real duration of the stream in order to work properly.

    Your best bet to make it work from Pyro would be the following:

    - set your pyroInstance autoPlay to false.
    - Load your stream without the start param. Just the url.
    - Once loaded, set your autoPlay back to true (if you want your stream to start playing obviously).
    - Call the play method with the same URL, but with your start param appended this time.

    This way Pyro will try to be intellligent and cache the original duration. Otherwise it gets lost, either because metadata is absent, or empty, or, even worst, throws you a metadata with a new duration that represents : original duration - the time point you queried for. In that case, kiss your progress and buffering logic goodbye.

    You probably noticed now that managing time and metadata with this type of stream is a major bitch.
    Also, remember this, if you never get any duration in the metadata, when using any types of stream, things will get ugly. Pyro needs a valid duration tag.

  26. Eric Poirier Says:

    Btw, I just never thought of it like that. I always expected people to use the start param for seeking purposes once the stream is loaded, like clicking on the progressbar outside of the already buffered area.

    To be able to start a stream at another timepoint than 0, that’s a feature for future releases.

    Always handy to have other peoples need in mind.

  27. r_bartoli Says:

    Hi Eric,
    thanks for the long reply. I understand what you are talking about, but before reading your reply I’ve built a prototype of a PyroPlayer that uses both a 2 line added version of Pyro.as and an as3 ported version of the example provided with the xmoov-php class.

    I used the FLV MetaData Injector (http://www.buraks.com/flvmdi/) to inject an object containg two arrays into the flv’s metadata. It contains the exact starting position in bytes and timecode of each keyframe. So I added the relative code to Pyro.as (line 1062, line 1616).

    It’s working but when I move the progress scrubber to start playing a new position of the video the audio work perflectly but the video appear after some second. I cannot understand why, because I suppose that if the audio is loaded the video is loaded as well.

    I’ve uploaded the source code here: http://www.rblab.com/videoPlayer.zip

  28. Eric Poirier Says:

    Well, you are at the point right now, where I decided to leave this particular php script behind as I had too many issues with encoding, synchronization and what seemed like invalid time stamps. Since I’m not the most savy php guy nor do I have a deep understanding of video encoding and codec bytecodes, I felt like things were not as stable as I has hoped for, or needed them to be.

    However, I admit I didn’t spend too much time trying to solve those issues. If you ever get things to behave properly from xmoov-php, let me know as this would be great news.

    I digg how you took Pyro and build your own Player on top. Exactly what I coded it for.

  29. thomiko Says:

    First of all many thanks to the Pyro people for making Pyro available!

    I’m currently testing Pyro in a Flex application with both the Adobe Flash Media and Wowza Pro servers (the free 10 user versions, running locally). When I test it with Wowza everything works fine! With the Adobe Flash Media server, however, it stops immediately (in Flex builder, debug mode) after loading the Flex app and assigning an rtmp stream via pyro.play([rtmp url]);
    I get then the following error message:
    Error #1069: Property onBWDone not found on flash.net.NetConnection and there is no default value.

    Has anyone already come across this problem? Any suggestions to solve it?

    Thanks in advance!

  30. Eric Poirier Says:

    Thanks Thomiko.

    This is something that happens on FMS 3 and over, and this issue will be addressed in the next release.

    However, you can quickly fix this by adding the following method to Pyro:

    public function onBWDone():void { }

    A good place to add this would be right after the onMetaData method around line 1061. So in the class it would look like this:

    public function onMetaData(info:Object, …rest):void
    {
    _metadataReceived = true;
    _metadata = info;
    if (rest) { _metadata['rest'] = rest; }
    if (info['duration']) { _duration = Number(info['duration']); }
    if (info['cuePoints']) { _cuePoints = info['cuePoints']; }
    dispatchEvent(new PyroEvent(PyroEvent.METADATA_RECEIVED, bubbleEvents, cancelableEvents));
    }

    public function onBWDone():void { }

    Hope this solves it for you.

  31. thomiko Says:

    Hi Eric,

    thanks for your fast reply! Just adding the empty onBWDone function didn’t solve it for me. I still got the same error message. I found some info on this problem at http://www.toybot.nl/blog/?p=28 so I added _nConnection.client = this; on line 791 of Pyro.as.
    This made the error message disappear but it’s still far from perfect because the video stream either never appears or it takes about 15 secs to appear and then it also ignores my pyro.autoPlay = false; setting starting directly after having been loaded.

    Any suggestions?

    Cheers, Thomas

  32. Eric Poirier Says:

    Oups. Forgot to mention to reference the netConnection to the class sorry.

    As for FMS, there is a few issues that I need to address for FMS 3.5 and future releases.
    I will have a look into it and come back as soon as I get it down.

    Gotta remember that Pyro was released before FMS 3.5 made its way in the community.

    You might want to try forceMP4Extension = false; before calling play.
    But really the fact that is starts playing even if autoplay is set to false as gotten me wandering. This is a first for me, I never had this happened.

    Email (epoirier@turbulent.ca) me with more details and I’d be more than happy to help. well, thats if you want help. Otherwise, I’ll look into this more closely.

    As I mentionned earlier, I released it and tested it on FMS 3 and it worked beautifully. As you can see there: http://nfb.ca ,FMS 3 rtmp streaming worked really really well under a Pyro instance.

    Luckily for you (well maybe) I really need to have a FMS3.5 compatible version out for February 19th 2009, as the nfb.ca ’s site will make the switch. So it wont be that long.

    Thanks for using Pyro. And so sorry about the troubles your having,

  33. thomiko Says:

    Hi Eric,

    thanks for offering your help! Fortunately I (or my company) do not fully depend on this Pyro-FMS interaction as we haven’t made a final decision on a certain streaming server product. Of course it would be great to have two fully working alternatives to test but if one solution has those unforeseeable hiccups then the decision will perhaps even be made easier. Pyro works great with wowza and before doing the Pyro tests I was already inclined to use wowza as I found its seeking performance better. btw: I’ve been using FMS 3.0.1 for testing.
    The Flex application I’m developing is pretty complex so it’s rather difficult to break it down to smaller parts to find out what the FMS problem could be.

    Anyway, I’ll have a go with your forceMP4Extension suggestion and send some feedback here if it solves the problem.

    Cheers, Thomas

  34. thomiko Says:

    Setting forceMP4Extension to false didn’t solve the problem. With this setting the whole FMS issue even became a bit more unpreditable because sometimes the video did not start after being loaded (as intended), sometimes it started running. The delay in loading the video is pretty much the same as before (see one of my previous posts).

  35. dmunkee Says:

    Firstly thanks for all your hard work, we’re really interested in using PYRO but wondered if you had an example source file (.fla) with some example functions for play/pause, rewind, etc etc. I know this will trigger groans but we’ve not yet made the move to AS3 and it’s proving more than tricky to jump into with your system.

    Thanks in advance for any assistance you can offer with this.

  36. Eric Poirier Says:

    Sure thing,
    That will come up very soon.

  37. j Says:

    Receiving cue points unfortunately didn’t work, but changine line 1047 in Pyro.as from

    protected function onCuePoint(infoObject:Object):void

    to

    public function onCuePoint(infoObject:Object):void

    did the trick. Thanks for sharing this great class!

  38. Eric Poirier Says:

    Hey thanks

    Funny, I noticed this yeasterday night as I am preparing the next release.
    This will be fixed.

    Thanks again.

  39. thomiko Says:

    Hi all,

    I just wanted to let you know that there is a small bit missing in Pyro.as if you are using wowza and want to stream using the RTMPT (RTMP tunneling) protocol. With the current pyro version, nothing happens when you try to stream from wowza with the “necessary” wowza URL:
    rtmpt://[domain]:1935/[applicationname]
    The onStreamStatus event will have an info code of “NetStream.Play.StreamNotFound”.
    I don’t know if the same problem arises with other streaming servers but I guess so.

    To fix it:

    In Pyro.as (version “pyro1_0_0_API”) inside the function initConnection (lines 776-821) change the code in lines 812 to 816 from

    ====================
    case “rtmp:/”:
    case “rtmps:/”:
    _streamType = Pyro.STREAM_TYPE_TRUE_STREAM;

    break;
    ====================

    to:

    ====================
    case “rtmp:/”:
    case “rtmps:/”:
    case “rtmpt:/”:
    _streamType = Pyro.STREAM_TYPE_TRUE_STREAM;

    break;
    ====================

    Regards,

    Thomas

  40. Eric Poirier Says:

    Hey Thomas, nice to see you back in here.

    Thanks for this, I covered it already, but I’m always glad to see people helping out. This is so cool.

    And btw, sent you a consolation prize to your email adress you use in here. :)

  41. Alex sanchez Says:

    (sorry for my bad english)

    hey! congrats for this great player.
    the only problem i found with the library is that flvs with XMP Data throws an error when i attempt to play that kind of videos. It can be fixed implementing callback onXMPData.

    One suggestion… ¿why dont you post this great package to google code?
    It would be great to check updates with my subversive client

  42. Eric Poirier Says:

    Hi Alex,

    Thnaks a lot for taking time to comment.

    I will answer two things, first, I will check into integrating onXMPData ASAP.

    And 2, http://code.google.com/p/pyro-player/

    The reason we didnt go public yet with the google code repo is because we are coming up with version 1.1.2, a major step up for the API, and we feel that just subversioning it just as is would not do it justice.

    Along with the release we will release a more offcial API documentation and exemples.

  43. xleon Says:

    Pyro within 3D content. (added to stage stuff)
    http://www.xinterface.net/en/2009/03/04/pyro-video-player-for-3d-contentpyro-video-player-para-contenidos-3d/

  44. xleon Says:

    Hi Eric, thanks for answering. I didn´t know about the google code project. I cheked out the last svn version and tried it with no successfull. This is my new code:

    var pyro:Pyro = new Pyro(320, 240);
    pyro.stageEventMechanics = Pyro.STAGE_EVENTS_MECHANICS_ALL_OFF;
    pyro.volume = 0.1;
    pyro.smoothing = true;
    pyro.play(”assets/media/big/madonna.flv”);

    var material:MovieMaterial = new MovieMaterial(pyro, false, true, false);
    material.doubleSided = true;
    plane = new Plane(material, 320, 240, 2, 2);

    The video doesn´t start, but it does with “my modified version”. Do I need to do anything else?

  45. xleon Says:

    I guess I know what´s happening here. In the Pyro constructor you wrote this code:

    if (stageEventMechanics == Pyro.STAGE_EVENTS_MECHANICS_ALL_ON)
    {
    addEventListener(Event.ADDED_TO_STAGE, addedToStage, captureEvents, eventsPriority, useWeakReferences);
    addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage, captureEvents, eventsPriority, useWeakReferences);
    }
    else
    {
    initialize();
    }

    but we can only set the “stageEventMechanics” property after instantiating it. You could make “stageEventMechanics” static so we could make it like this:

    Pyro.stageEventMechanics = Pyro.STAGE_EVENTS_MECHANICS_ALL_OFF;
    var pyro:Pyro = new Pyro(320, 240); // now the conditional statement will work

  46. xleon Says:

    Finally I did it by myself. It works but I don´t like it because if I need other player instance in the display list in the same application it could generate an error.
    So I think the best way to solve it is to add a parameter in the constructor that defaults to “allOn”.

    public function Pyro(_width:Number=undefined, _height:Number=undefined, _stageEventMechanics=”allOn”)

    What do you think?

  47. Eric Poirier Says:

    This was written before seeing the prior posts

    Hey xleon, thanks for your proposal.

    A few things I have to mention on this matter.

    First, every pyroInstance is self contained and has no Static dependencies.
    All static members in Pyro are used as value setters for instance properties.
    ALL of Pyro’s static members are defined as constants.

    Theorically you could have 3 pyro instances on stage with different values for stageEventMechanics and it wouldnt really matter.

    pyroInstance1.stageEventMechanics = Pyro.STAGE_EVENTS_MECHANICS_ALL_OFF;
    pyroInstance2.stageEventMechanics = Pyro.STAGE_EVENTS_MECHANICS_ALL_ON;
    pyroInstance2.stageEventMechanics = Pyro.STAGE_EVENTS_MECHANICS_ONLY_FS;

    I tested it without problems, let me know if you encounter problems with this.

    Now, as for the proposal for the constructor parameter, this is going to wreck havoc inside our little purist coder’s nest. ;) No I’m kidding, we will have a discussion about this internally, but we feel strongly about not bloating the constructor.

    However, it’s not a bad idea.

    I’ll let you know.

    Thansk again.

  48. Eric Poirier Says:

    Now I see what you mean.
    Now thats really retarded coming from me.

    hehehe!

    I’ll fix it right away.

  49. Eric Poirier Says:

    Well you won.

    We didnt have much choice but to insert it into the constructor, due to the ‘lowlevelness” of stage related events.

    The codebase has been updated to 1.1.5
    I tested it quickly, it seems to behave really well.

    Thanks for spotting this so quick.
    Let me know if there is anything else.

    Eric

  50. xleon Says:

    Yeahhh! It´s working perfect now. Thanks a lot for supporting. In a while I´ll show you a 3D gallery API example that I´m doing, and it makes use of Pyro.

  51. xleon Says:

    Hi, it´s me bothering again. I need to call “kill” method from outside because in the case we were talking about there´s no stage or removing from stage. Any reason to make it protected?

  52. Eric Poirier Says:

    Hmmm… you’ve got a point.

    Well, yes there was a reason for the kill method to be protected. But all the new stage mechanics stuff has rendered that totally useless and frankly stupid.

    I updated the subversioned version already.

    Thanks.

    Now thats customer service. hey wait a minute, what do you mean I dont get paid ?
    ;)

  53. xleon Says:

    My friend. If you continue this way, I will have to pay you !! =)

  54. xleon Says:

    In fact, I like the work you guys do. If you need any help any time, just tell me and I´ll do my best.
    Thanks again.

  55. ramon c Says:

    Hi,
    first, congratulation great work.
    Im looking for an example with visual states and stream progress… im googling but i cant find it !!
    thanks

  56. Tendremos vídeo para rato Says:

    [...] parte más aburrida de esta tarea, la podemos simplificar con el uso de la clase Pyro Player que ha creado Turbulent. PLAIN TEXT [...]

  57. Eric Poirier Says:

    Hello ramon, right now we have this exemple out.
    http://code.google.com/p/nfb-video-player/

    You might want to have a look at the ControllerView class, you shoud find progress related methods in there.

  58. Paolo Says:

    Fantastic API and incredible work.
    I’ve a problem with a f4l file.
    How can extract the cuepoint from this file?
    Thank’s for help me.
    p

  59. Allan Says:

    Hi,
    I wanted to let you know that I used Pyro successfully for building a custom video player. I was using PureMVC, and I have posted the source code for the Pyro mediator at http://snipplr.com/view/29838/pyro-mediator-for-puremvc/
    Thanks for the great tool!
    -Allan Dowdeswell, Confidant Communications

Leave a Reply


capsule omeprazole cialis rx buy ultram free levitra samples treatment for herpes buy cialis cheap loss of hair buy body building supplement pharmacy lipitor buy cialis on line augmentin doses new levitra ultram information healthy immune system allergic benadryl synthroid tablets antibiotics and dogs purchase cialis online without prescription how to treat flu xanax interactions with other medicines claritin pill hoodia order buy cialis without prescription ranitidine pregnancy cialis online without prescription herpes cures that work augmentin doses cheapest generic cialis online online stores hair loss products levitra without prescription vitamin c buy cheap amoxil without prescription online pharmacy viagra buy cialis on line buy levitra approved cialis fda about cialis viagra order online cialis prescription buy phentermine nausea cure toprol 50mg antibiotic chlamydia cialis levitra viagra menopause gum buy cialis online now buy buspar prednisone 10mg dogs weight buy cheap cialis dogs antidepressants buy cheap tadalafil uk cialis without rx clomid buy viagra online australia famotidine 20mg stomach parasites free samples viagra high blood calcium levels effexor dose hyaluronic acid buy buy cialis online serevent generic ibuprofen withdrawal otc claritin cialis and purchase coumadin side effects total health solutions buy tramadol cheap fertility in women purchase cialis online without prescription cialis without a prescription buy bone maker strontium cheap alcoholism treatment risperdal anxiety buy buspar can i get a viagra today levitra effect augmentin doses prozac antidepressants ways to make your penis bigger buy phentermine without prescription drug zithromax buyviagra cialis how do you treat lung cancer purchase meds without prescription how to purchase cialis drugs for diabetes valium and alcohol generic viagra on line how to white teeth motilium buy alternative treatment arthritis levitra cialis viagra cheap impotence drug generic cialis delivery phentermine by fedex sale levitra cialis prescription online order on line medicine without prescriptions abscess infection cats buy celexa how buy viagra lasix side effects chronic heart failure cheap msm buy lasuna cheap viagra order online promethazine tablets how to get viagra purchase levitra online pain meds without prescriptions stop hair loss buspar online viagra experience increase your erection clonazepam overdose xanax dosages order phentermine alavert drug how to cure acne viagra online usa cialis canadian pharmacy buy precose cialas on line buy amiodarone drug contraception pill levitra overnight buy zovirax finasteride prescription claritin 10mg levitra cheap online viagra for sex all natural antibiotics pain in left side home treatment for edema glucophage cialis canada pharmacy buy cialis online vpxl herbal levitra without prescription levitra online online prescription for cialis rx-viagra cat skin disorders how to treat prostate cancer yeast diflucan what does viagra do to females zyban how to use cialis advice viagra online without prescription