
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.
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




















January 21st, 2009 at 11:06 am
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???
January 21st, 2009 at 12:30 pm
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.
January 21st, 2009 at 2:14 pm
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”);
}
January 21st, 2009 at 4:06 pm
Thanks guys, I see it is Open source under the BSD License. Cool!
January 21st, 2009 at 5:34 pm
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
January 21st, 2009 at 5:57 pm
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.
January 22nd, 2009 at 9:01 am
[...] 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) [...]
January 22nd, 2009 at 12:26 pm
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????
January 22nd, 2009 at 3:53 pm
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.
January 22nd, 2009 at 6:50 pm
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…..
January 22nd, 2009 at 9:55 pm
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.
January 22nd, 2009 at 10:13 pm
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.
January 22nd, 2009 at 11:05 pm
OK I got smoothing to work cool, How do you get the bytesTotal Property I found the bytesLoaded???
Thanks in advance.
January 22nd, 2009 at 11:20 pm
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;
January 23rd, 2009 at 1:41 am
Got it thanks again.
January 23rd, 2009 at 11:44 am
[...] > Pyro : a video player API for Flash at Agit8 [...]
January 25th, 2009 at 6:22 pm
[...] NFB is using the open-source Pyro video player API for Flash, from Turbulent Web Development in Montreal. These icons link to social bookmarking [...]
January 25th, 2009 at 9:02 pm
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.
January 26th, 2009 at 1:59 pm
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
January 28th, 2009 at 7:51 pm
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.
January 28th, 2009 at 11:13 pm
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.
January 29th, 2009 at 10:55 pm
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
January 29th, 2009 at 11:40 pm
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.
January 30th, 2009 at 6:53 am
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?
January 30th, 2009 at 1:03 pm
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.
January 30th, 2009 at 1:24 pm
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.
January 30th, 2009 at 10:54 pm
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
February 1st, 2009 at 12:03 pm
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.
February 11th, 2009 at 10:32 am
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!
February 11th, 2009 at 11:32 am
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.
February 12th, 2009 at 3:41 am
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
February 12th, 2009 at 11:13 am
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,
February 13th, 2009 at 4:50 am
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
February 13th, 2009 at 9:08 am
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).
February 19th, 2009 at 10:47 am
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.
February 20th, 2009 at 2:13 am
Sure thing,
That will come up very soon.
February 21st, 2009 at 4:34 am
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!
February 22nd, 2009 at 2:09 pm
Hey thanks
Funny, I noticed this yeasterday night as I am preparing the next release.
This will be fixed.
Thanks again.
February 24th, 2009 at 8:13 am
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
February 24th, 2009 at 11:31 am
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.
February 25th, 2009 at 6:31 am
(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
February 25th, 2009 at 12:49 pm
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.
March 4th, 2009 at 10:12 am
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/
March 4th, 2009 at 2:06 pm
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?
March 4th, 2009 at 2:19 pm
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
March 4th, 2009 at 2:27 pm
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?
March 4th, 2009 at 3:10 pm
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.
March 4th, 2009 at 3:15 pm
Now I see what you mean.
Now thats really retarded coming from me.
hehehe!
I’ll fix it right away.
March 4th, 2009 at 3:46 pm
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
March 4th, 2009 at 4:02 pm
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.
March 6th, 2009 at 2:13 pm
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?
March 6th, 2009 at 2:28 pm
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 ?
March 6th, 2009 at 2:48 pm
My friend. If you continue this way, I will have to pay you !! =)
March 6th, 2009 at 3:12 pm
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.
May 7th, 2009 at 10:01 am
Hi,
first, congratulation great work.
Im looking for an example with visual states and stream progress… im googling but i cant find it !!
thanks
May 9th, 2009 at 9:57 pm
[...] parte más aburrida de esta tarea, la podemos simplificar con el uso de la clase Pyro Player que ha creado Turbulent. PLAIN TEXT [...]
May 11th, 2009 at 10:08 pm
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.
January 9th, 2010 at 4:44 pm
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
March 16th, 2010 at 2:22 pm
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