2008-09-03 77 views
13

我想知道如何使用VideoDisplay对象(在MXML中定义)显示通过NetStream从FMS流式传输的视频。如何在Flex中使用VideoDisplay显示实时流式视频

Flex3 docs表明这是可能的:

视频显示...支持通过HTTP渐进式下载,从Flash Media Server的流媒体和从相机对象流。

但是,后来在文档中我只能看到一个attachCamera()方法。似乎没有像旧视频对象那样的attachStream()方法。

看起来您可以使用source属性播放通过HTML提供的固定文件,但我没有看到有关如何附加NetStream的任何内容。

旧的Video对象似乎仍然存在,虽然它不基于UIComponent并且看起来在MXML中不可用。

我发现this blog post显示如何使用普通的Video对象,但我更喜欢使用VideoDisplay(或其他可直接放入MXML的东西)。

回答

6

不幸的是,您只能在视频对象上附加NetStream()。所以如果你想从FMS获取数据,你注定要使用em。

顺便attachCamera()方法发布本地摄像机视频服务器,所以要小心;)

4

它的工作原理。

MX:活的VideoDisplay = “真正的” 将autoPlay = “真实” 来源= “的RTMP://server.com/appname/streamname”/>

,会给您视频直播通过的VideoDisplay ...问题是它不会使用现有的netconnection对象,它会创建它自己的...这正是我试图找到的工作。

+0

也可以编辑飞源 my_vid.source =“rtmp://server.com/appname/”+ stream_name; 像这样...仍然不修复每个显示问题的新NC。 – 2008-11-14 18:02:58

2

我见过的示例代码,其中是这样工作的:

// Connect to the video stream in question. 
var stream:NetStream = new NetStream(chatNC); 
stream.addEventListener(NetStatusEvent.NET_STATUS, handleStreamStatus); 
stream.addEventListener(IOErrorEvent.IO_ERROR, handleIOError); 

// Build the video player on the UI. 
var video:Video = new Video(246, 189); 
var uiComp:UIComponent = new UIComponent(); 
uiComp.addChild(video); 
uiComp.width = 246; 
uiComp.height = 189; 
stream.play(streamName); 
video.attachNetStream(stream); 
video.smoothing = true; 
video.width = 246; 
video.height = 189; 
view.videoPlayerPanel.removeAllChildren(); 
view.videoPlayerPanel.addChild(uiComp); 

但我不能真正得到它的工作我自己。如果我能弄明白,我会在后面发帖。

15

VideoDisplayVideoPlayer的包装,这又是一个Video子类。不幸的是,包装阻止你将现有的NetStream附加到Video对象。

然而,该组件的引用在mx_internal命名空间举行,所以下面应该做的伎俩:

videoDisplay.mx_internal::videoPlayer.attachNetStream(incomingStream); 
videoDisplay.mx_internal::videoPlayer.visible = true; 

(你需要导入mx.core.mx_internal命名空间)

+0

这完美的作品!真的应该是被接受的答案。谢谢Cosma。 – 2010-09-04 20:14:38

4

这里的链接示例如何使用视频: http://blog.flexexamples.com/2008/03/01/displaying-a-video-in-flex-using-the-netconnection-netstream-and-video-classes/

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    verticalAlign="middle" 
    backgroundColor="white" 
    creationComplete="init();"> 

<mx:Script> 
<![CDATA[ 
    import mx.utils.ObjectUtil; 

    private var nc:NetConnection; 
    private var ns:NetStream; 
    private var video:Video; 
    private var meta:Object; 

    private function init():void { 
    var nsClient:Object = {}; 
    nsClient.onMetaData = ns_onMetaData; 
    nsClient.onCuePoint = ns_onCuePoint; 

    nc = new NetConnection(); 
    nc.connect(null); 

    ns = new NetStream(nc); 
    ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv"); 
    ns.client = nsClient; 

    video = new Video(); 
    video.attachNetStream(ns); 
    uic.addChild(video); 
    } 

    private function ns_onMetaData(item:Object):void { 
    trace("meta"); 
    meta = item; 
    // Resize Video object to same size as meta data. 
    video.width = item.width; 
    video.height = item.height; 
    // Resize UIComponent to same size as Video object. 
    uic.width = video.width; 
    uic.height = video.height; 
    panel.title = "framerate: " + item.framerate; 
    panel.visible = true; 
    trace(ObjectUtil.toString(item)); 
    } 

    private function ns_onCuePoint(item:Object):void { 
    trace("cue"); 
    } 
]]> 
</mx:Script> 

<mx:Panel id="panel" visible="false"> 
    <mx:UIComponent id="uic" /> 
    <mx:ControlBar> 
    <mx:Button label="Play/Pause" click="ns.togglePause();" /> 
    <mx:Button label="Rewind" click="ns.seek(0); ns.pause();" /> 
    </mx:ControlBar> 
</mx:Panel> 
</mx:Application> 
相关问题