Как отобразить потоковое видео в реальном времени с помощью VideoDisplay во Flex - PullRequest
13 голосов
/ 03 сентября 2008

Мне интересно, как использовать объект VideoDisplay (определенный в MXML) для отображения потокового видео из FMS через NetStream.

Документы Flex3 предполагают, что это возможно:

Дисплей видео ... поддерживает последовательную загрузку по HTTP, потоковую передачу с Flash Media Server и потоковую передачу с объекта Camera.

Однако позже в документах все, что я вижу, это метод attachCamera (). Кажется, что нет метода attachStream (), как у старого объекта Video.

Похоже, что вы можете воспроизводить фиксированный файл, обслуживаемый через HTML, используя свойство source, но я не вижу ничего о том, как прикрепить NetStream.

Старый объект Видео , похоже, все еще существует, хотя он не основан на UIComponent и, по-видимому, не может использоваться в MXML.

Я нашел это сообщение в блоге , в котором показано, как это сделать с обычным объектом Video, но я бы предпочел использовать VideoDisplay (или что-то еще, что можно поместить непосредственно в MXML).

Ответы [ 5 ]

15 голосов
/ 25 июня 2010

VideoDisplay - это оболочка для VideoPlayer, которая, в свою очередь, является Video подклассом. К сожалению, оболочка не позволяет вам присоединить существующий NetStream к объекту Video.

Однако ссылка на этот компонент хранится в пространстве имен mx_internal, поэтому следующие действия должны помочь:

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

(вам необходимо импортировать пространство имен mx.core.mx_internal)

6 голосов
/ 04 сентября 2008

К сожалению, вы можете прикрепить NetStream () только к объекту Video. Так что вы обречены использовать em, если хотите получать данные из FMS.

Кстати, метод attachCamera () публикует видео с локальной камеры на сервере, поэтому будьте осторожны;)

4 голосов
/ 16 августа 2010

Вот ссылка на пример использования видео: 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 голосов
/ 14 ноября 2008

работает.

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

, который даст вам живое видео через видеодисплей ... проблема в том, что он не будет использовать существующий объект сетевого соединения, он создаст свой собственный ... что я пытаюсь найти обходной путь. *

2 голосов
/ 18 апреля 2009

Я видел пример кода, где что-то вроде этого работает:

// 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 );

Но я не могу заставить его работать самостоятельно. Я опубликую здесь позже, если смогу разобраться.

...