FMS3系列(五):通过FMS实现时时视频聊天(Flash|Flex)

来源:互联网 发布:php类库有哪些 编辑:程序博客网 时间:2024/05/17 07:44

转载自:http://www.pin5i.com/showtopic-23895.html

本系列的前几篇文章中分别介绍了,连接FMS服务器、建立播放程序以及在线视频录制以及回放等功能的实现。相信看过前面几篇文章的朋友已经对FMS有了一定的认识,并熟悉了常用的编程模式。本文将结合前面几篇文章所出现的技术点,来实现一个时时视频聊天程序。


      通过FMS实现视频时时聊天其实很简单,也就是操作时时流。如果是单向视频聊天,则两端一边一边为发布端一边为订阅端,如果是双向视频聊天,则两边都分别是发布端和订阅端。

      如果从技术实现上来分析,单向视频聊天就是一边发布流另一边播放流,双向视频聊天则是两边都需要提供两个流,一个负责发布流,一个负责播放流。在说专业点就是一个创建流并且发送到服务器的客户端叫发布,一个创建流来接受内容的客户端叫订阅,当同一个客户端同是发布和订阅时,它必须创建两个流,一个是输出流,一个是接受流。

      说了这么多下面看看具体是怎么实现的,要实现视频聊天上面分析过,就是一边发布时时视频流一边播放,这同样离不开连接FMS,代码如下:
  1. private function onPublishClick(evt:MouseEvent):void
  2. {
  3.       nc = new NetConnection();
  4.       nc.connect("rtmp://localhost/LiveStreams");
  5.       nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  6. }
复制代码
通过点击按扭连接(NetConnection)FMS服务器,然后向FMS发布(publish)视频流,达到视频发布的目的。这里需要注意一点,在发布方法publish()中后一参数为“live”,表示时时视频流。以live的形式发布的流不会在FMS里生成.fla文件,不同于“record”录制视频流生成.flv的视频文件。
  1. private function onNetStatusHandler(evt:NetStatusEvent):void
  2. {
  3.       trace(evt.info.code);
  4.       if(evt.info.code=="NetConnection.Connect.Success")
  5.       {
  6.           ns=new NetStream(nc);
  7.           ns.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  8.           ns.client=new CustomClient();
  9.           ns.attachCamera(cam);
  10.           ns.attachAudio(mic);
  11.           ns.publish(txtInput.text,"live");
  12.       }
  13. }
复制代码
实现视频发布的核心技术点就是获取视频、音频数据,分别通过Camera和Microphone的静态方法实现。参考代码:
  1. public function PublishStream():void
  2. {
  3.     btnPublish.label="发布视频";
  4.     btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);
  5.             
  6.     //获取视频和声音,并将视频显示到Flash界面
  7.     cam = Camera.getCamera();
  8.     mic = Microphone.getMicrophone();
  9.     video = new Video(320,240);
  10.     video.attachCamera(cam);
  11.     video.x=20;
  12.     video.y=20;
  13.     addChild(video);
  14. }
复制代码
通过以上步骤就完成了视频聊天的视频流发布端的开发,完整的示例代码如下:
  1. package
  2. {
  3.     import flash.net.*;
  4.     import flash.events.*;
  5.     import flash.display.*;
  6.     import flash.media.*;
  7.     import fl.controls.*;
  8.     
  9.     public class PublishStream extends Sprite
  10.     {
  11.         private var video:Video;
  12.         private var nc:NetConnection;
  13.         private var ns:NetStream;
  14.         private var cam:Camera;
  15.         private var mic:Microphone;
  16.         
  17.         public function PublishStream():void
  18.         {
  19.             btnPublish.label="发布视频";
  20.             btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);
  21.             
  22.             //获取视频和声音,并将视频显示到Flash界面
  23.             cam = Camera.getCamera();
  24.             mic = Microphone.getMicrophone();
  25.             video = new Video(320,240);
  26.             video.attachCamera(cam);
  27.             video.x=20;
  28.             video.y=20;
  29.             addChild(video);
  30.         }
  31.         
  32.         private function onPublishClick(evt:MouseEvent):void
  33.         {
  34.             nc = new NetConnection();
  35.             nc.connect("rtmp://localhost/LiveStreams");
  36.             nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  37.         }
  38.         
  39.         private function onNetStatusHandler(evt:NetStatusEvent):void
  40.         {
  41.             trace(evt.info.code);
  42.             if(evt.info.code=="NetConnection.Connect.Success")
  43.             {
  44.                 ns=new NetStream(nc);
  45.                 ns.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  46.                 ns.client=new CustomClient();
  47.                 ns.attachCamera(cam);
  48.                 ns.attachAudio(mic);
  49.                 ns.publish(txtInput.text,"live");
  50.             }
  51.         }
  52.     }
  53. }
复制代码
视频接收端相对发布端更简单,提供一个NetConnetion连接到发布端的FMS,通过NetStream播放时时视频流就完成。代码很简单,基本上都是在本系列前几篇文章中出现过的代码片段整合而成,详细见下代码块:
  1. package
  2. {
  3.     import flash.net.*;
  4.     import flash.events.*;
  5.     import flash.display.*;
  6.     import flash.media.*;
  7.     
  8.     public class LiveStream extends Sprite
  9.     {
  10.         private var video:Video;
  11.         private var nc:NetConnection;
  12.         private var ns:NetStream;
  13.         
  14.         public function LiveStream():void
  15.         {
  16.             nc = new NetConnection();
  17.             nc.connect("rtmp://localhost/LiveStreams");
  18.             nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  19.         }
  20.         
  21.         private function onNetStatusHandler(evt:NetStatusEvent):void
  22.         {
  23.             if(evt.info.code=="NetConnection.Connect.Success")
  24.             {
  25.                 ns=new NetStream(nc);
  26.                 ns.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
  27.                 ns.client=new CustomClient();
  28.                 video=new Video();
  29.                 video.attachNetStream(ns);
  30.                 ns.play("1111");//1111为流的名字,对应于视频流发布端的publish("1111","live").
  31.                 addChild(video);
  32.             }
  33.         }
  34.     }
  35. }
复制代码
OK,到这里视频聊天的两端都完成了,如果需要做双向视频聊天,只需要在每一边多提供一个流就可以了,两端都实现发布视频流和接收视频流数据。

      或许看完文章的朋友回问到CustomClient是那里来的,CustomClient是为了处理元数据的,可以通过元数据向实况视频添加一些格外的属性,本文暂时不讨论,有兴趣的朋友可以查看官方文档了解。
0 0
原创粉丝点击