我写了一个小的OSMF播放器,通过RTMP从Amazon Cloudfront流媒体。有一个已知的问题,mp3持续时间没有从元数据中正确读取,因此seek功能不起作用。我知道有一个变通方法隐含着使用NetConnection的getStreamLength函数,我在以前的一个非OSMF播放器中成功地实现了这个函数,但现在我不知道如何以及何时调用它,就OSMF事件和特征而言。此代码不起作用:
protected function initApp():void
{
//the pointer to the media
var resource:URLResource = new URLResource( STREAMING_PATH );
// Create a mediafactory instance
mediaFactory = new DefaultMediaFactory();
//creates and sets the MediaElement (generic) with a resource and path
element = mediaFactory.createMediaElement( resource );
var loadTrait:NetStreamLoadTrait = element.getTrait(MediaTraitType.LOAD) as NetStreamLoadTrait;
loadTrait.addEventListener(LoaderEvent.LOAD_STATE_CHANGE, _onLoaded);
player = new MediaPlayer( element );
//Marker 5: Add MediaPlayer listeners for media size and current time change
player.addEventListener( DisplayObjectEvent.MEDIA_SIZE_CHANGE, _onSizeChange );
player.addEventListener( TimeEvent.CURRENT_TIME_CHANGE, _onProgress );
initControlBar();
}
private function onGetStreamLength(result:Object):void {
Alert.show("The stream length is " + result + " seconds");
duration = Number(result);
}
private function _onLoaded(e:LoaderEvent):void
{
if (e.newState == LoadState.READY)
{
var loadTrait:NetStreamLoadTrait = player.media.getTrait(MediaTraitType.LOAD) as NetStreamLoadTrait;
if (loadTrait && loadTrait.netStream)
{
var responder:Responder = new Responder(onGetStreamLength);
loadTrait.connection.call("getStreamLength", responder, STREAMING_PATH);
}
}
}发布于 2011-06-24 12:22:10
简单的答案
此方法不支持传入全流url STREAMING_PATH : loadTrait.connection.call("getStreamLength",responder,STREAMING_PATH);
您只需使用流名称,即FMS实例右侧的路径
因此,如果url (或connection.uri)是: rtmp://example.com:80/_myfms/mp3:the/stream/name/foo
您只想传递流名称,而不是服务器实例:'mp3: the / stream / name /foo‘
复杂的答案(扩展NetLoader类):
package{
// You can extend the NetLoader class to have it automatically ask for duration
// and dispatch an event when it is received.
// This is a super simple, partial example, but the stub should get you going
// TODO: define imports here (omitted for example's sake)
class MyNetLoader extends NetLoader
{
// useful for adding an event listener outside
public static const GOT_STREAM_DURATION:String = "gotStreamDuration";
// constructor
public function MyNetLoader(factory:NetConnectionFactoryBase = null)
{
super( factory );
}
// override the parent method that creates the actual NetStream
override protected function createNetStream( connection:NetConnection, resource:URLResource) : NetStream
{
// usually you pass just the stream name, not the full uri
// there is likely a cleaner way to extract the stream name...
var streamName:String = resource.url.replace('rtmp://example.com:80/_myfms/', '');
// request duration from FMS
connection.call('getStreamLength', new Responder( this.onResult ), streamName);
return super.createNetStream(connection, resource);
}
// receives the getStreamLength callback from FMS
protected function onResult( info:Object ):void
{
_duration = Number(info) * 1000; // duration, in ms
dispatchEvent( new Event(GOT_STREAM_DURATION) );
trace('Duration is: ' + _duration);
}
// read-only getter for duration
public function get duration():uint
{
return _duration as uint;
}
}
}然后,在您的其他代码中:
...
// create the resource
var resource:URLResource = new URLResource('rtmp://example.com:80/_something/the/stream/name/foo');
// create your custom loader, adding a listener for the duration callback
var loader:MyNetLoader = new MyNetLoader();
// listen for the duration event
loader.addEventListner(MyNetLoader.GOT_STREAM_DURATION, function(event:Event):void{
trace('Got the duration outside: ' + (event.target as MyNetLoader).duration);
});
// I use an AudioElement here, but it could be any of the typed or generic elements
// as long as the constructor accepts (resource, loader)
// You dont want to use the factory to create the element, because (to my knowledge)
// you cant pass a custom loader to the factory (unless you extended it)
var myElement:AudioElement = new AudioElement( resource, loader );
// pass the element to the player. I dont pass to the constructor in this example because
// in most real-world cases, you would already have an instance of MediaPlayer
player = new MediaPlayer();
player.media = myElement;
...https://stackoverflow.com/questions/6264125
复制相似问题