加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:23:59 所属栏目:百科 来源:网络整理
导读:转载自:http://www.pin5i.com/showtopic-23895.html 本系列的前几篇文章中分别介绍了,连接FMS服务器、建立播放程序以及在线视频录制以及回放等功能的实现。相信看过前面几篇文章的朋友已经对FMS有了一定的认识,并熟悉了常用的编程模式。本文将结合前面几篇

转载自: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. ? ? ? trace(evt.info.code);
  3. ? ? ? if(evt.info.code=="NetConnection.Connect.Success")
  4. ? ? ? {
  5. ? ? ? ? ? ns=new NetStream(nc);
  6. ? ? ? ? ? ns.addEventListener(NetStatusEvent.NET_STATUS,serif; font-size:12px"> ? ? ? ? ? ns.client=new CustomClient();
  7. ? ? ? ? ? ns.attachCamera(cam);
  8. ? ? ? ? ? ns.attachAudio(mic);
  9. ? ? ? ? ? ns.publish(txtInput.text,"live");
  10. ? ? ? }
  11. 实现视频发布的核心技术点就是获取视频、音频数据,分别通过Camera和Microphone的静态方法实现。参考代码:
    1. public function PublishStream():void
    2. ? ? btnPublish.label="发布视频";
    3. ? ? btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);
    4. ? ? ? ? ? ??
    5. ? ? //获取视频和声音,并将视频显示到Flash界面
    6. ? ? cam = Camera.getCamera();
    7. ? ? mic = Microphone.getMicrophone();
    8. ? ? video = new Video(320,240);
    9. ? ? video.attachCamera(cam);
    10. ? ? video.x=20;
    11. ? ? video.y=20;
    12. ? ? addChild(video);
    13. 通过以上步骤就完成了视频聊天的视频流发布端的开发,完整的示例代码如下:
      1. package
      2. ? ? import flash.net.*;
      3. ? ? import flash.events.*;
      4. ? ? import flash.display.*;
      5. ? ? import flash.media.*;
      6. ? ? import fl.controls.*;
      7. ? ??
      8. ? ? public class PublishStream extends Sprite
      9. ? ? {
      10. ? ? ? ? private var video:Video;
      11. ? ? ? ? private var nc:NetConnection;
      12. ? ? ? ? private var ns:NetStream;
      13. ? ? ? ? private var cam:Camera;
      14. ? ? ? ? private var mic:Microphone;
      15. ? ? ? ??
      16. ? ? ? ? public function PublishStream():void
      17. ? ? ? ? {
      18. ? ? ? ? ? ? btnPublish.label="发布视频";
      19. ? ? ? ? ? ? btnPublish.addEventListener(MouseEvent.CLICK,serif; font-size:12px"> ? ? ? ? ? ? //获取视频和声音,serif; font-size:12px"> ? ? ? ? ? ? cam = Camera.getCamera();
      20. ? ? ? ? ? ? mic = Microphone.getMicrophone();
      21. ? ? ? ? ? ? video = new Video(320,serif; font-size:12px"> ? ? ? ? ? ? video.attachCamera(cam);
      22. ? ? ? ? ? ? video.x=20;
      23. ? ? ? ? ? ? video.y=20;
      24. ? ? ? ? ? ? addChild(video);
      25. ? ? ? ? }
      26. ? ? ? ? private function onPublishClick(evt:MouseEvent):void
      27. ? ? ? ? ? ? nc = new NetConnection();
      28. ? ? ? ? ? ? nc.connect("rtmp://localhost/LiveStreams");
      29. ? ? ? ? ? ? nc.addEventListener(NetStatusEvent.NET_STATUS,serif; font-size:12px"> ? ? ? ? private function onNetStatusHandler(evt:NetStatusEvent):void
      30. ? ? ? ? ? ? trace(evt.info.code);
      31. ? ? ? ? ? ? if(evt.info.code=="NetConnection.Connect.Success")
      32. ? ? ? ? ? ? {
      33. ? ? ? ? ? ? ? ? ns=new NetStream(nc);
      34. ? ? ? ? ? ? ? ? ns.addEventListener(NetStatusEvent.NET_STATUS,serif; font-size:12px"> ? ? ? ? ? ? ? ? ns.client=new CustomClient();
      35. ? ? ? ? ? ? ? ? ns.attachCamera(cam);
      36. ? ? ? ? ? ? ? ? ns.attachAudio(mic);
      37. ? ? ? ? ? ? ? ? ns.publish(txtInput.text,serif; font-size:12px"> ? ? ? ? ? ? }
      38. ? ? }
      39. 视频接收端相对发布端更简单,提供一个NetConnetion连接到发布端的FMS,通过NetStream播放时时视频流就完成。代码很简单,基本上都是在本系列前几篇文章中出现过的代码片段整合而成,详细见下代码块:
        1. ? ? public class LiveStream extends Sprite
        2. ? ? ? ? public function LiveStream():void
        3. ? ? ? ? ? ? ? ? video=new Video();
        4. ? ? ? ? ? ? ? ? video.attachNetStream(ns);
        5. ? ? ? ? ? ? ? ? ns.play("1111");//1111为流的名字,对应于视频流发布端的publish("1111","live").
        6. ? ? ? ? ? ? ? ? addChild(video);
        7. OK,到这里视频聊天的两端都完成了,如果需要做双向视频聊天,只需要在每一边多提供一个流就可以了,两端都实现发布视频流和接收视频流数据。
          ? ? ? 或许看完文章的朋友回问到CustomClient是那里来的,CustomClient是为了处理元数据的,可以通过元数据向实况视频添加一些格外的属性,本文暂时不讨论,有兴趣的朋友可以查看官方文档了解。

        (编辑:李大同)

        【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读