如何在Flex中使用VideoDisplay显示实时流式视频

时间:2008-09-03 19:15:55

标签: flex video streaming

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

Flex3 docs建议这是可能的:

  

视频显示...支持通过HTTP进行渐进式下载,从Flash Media Server流式传输以及从Camera对象进行流式传输。

但是,稍后在文档中我可以看到的是attachCamera()方法。似乎没有像旧的Video对象那样的attachStream()方法。

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

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

我发现this blog post显示了如何使用常规的Video对象,但我更喜欢使用VideoDisplay(或其他可直接放在MXML中的内容)。

5 个答案:

答案 0 :(得分:15)

VideoDisplayVideoPlayer的包装器,后者一个Video子类。不幸的是,包装器阻止您将现有的NetStream附加到Video对象。

但是,在mx_internal命名空间中保留了对该组件的引用,因此以下内容应该可以解决问题:

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

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

答案 1 :(得分:6)

不幸的是,您只能在Video对象上附加NetStream()。因此,如果您想从FMS获取数据,那么您注定要使用em。

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

答案 2 :(得分:4)

它有效。

mx:VideoDisplay live =“true”autoPlay =“true”source =“rtmp://server.com/appname/streamname”/>

将通过视频显示为您提供实时视频...问题是它不会使用现有的netconnection对象,它会创建它自己的...这就是我正在努力找到解决方法。

答案 3 :(得分: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>

答案 4 :(得分: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 );

但我实际上无法让自己工作。如果我能弄明白的话,我会稍后发布。