Flex 迷你教程 — 基于Stratus 2的P2P一对多视频直播 (NetGroup, Multicast实例)

Posted by Kevin Luo at 24 February 2010

Category: Flex 迷你教程, P2P, 未分类

Tags: , , ,

终于有时间试下Strtaus 2的p2p多播功能了。之前看的视频介绍中,Adobe描述一个非常理想的多人P2P数据共享方式。但是今天试了一下后发现视频的速度非常慢(视频的发布和接收端都在一台机器上),感觉上视频被发送到了什么地方后才传了回来。这这……好吧,就当是BETA的问题了,WAIT AND SEE. (2/25日更新,2/23日发布的Flash player 10.1 beta 3 看来解决了这个问题,Demo的速度现在非常正常)

准备工作:

先了解一下什么是stratus以及什么是RTMFP,你可以到http://labs.adobe.com/technologies/stratus/看下官方的解释或者直接看我原来的 Flex 迷你教程 — 基于Stratus的P2P网络电话 (1)(2)(3) 先学习一下Flash p2p的基础. 简单的说原来的Stratus 实现了flash player之间点对点的传输数据,而今天要讲的stratus 2 不仅支持单个的点对点数据传说,还引入了多播的概念。

在原来的stratus中如果我们要做一个多人同时在线的应用,比如多人视频。那么我们需要把在线的所有人都链接起来,类似蜘蛛网的结构,网中的每个人需要与其他所有人链接,这样数据才能在所有人中共享。这种模式在多人连线中是不可取的。假设我们用户A发布一个视频想让其他10个用户观看,那么10个用户都需要链接到他。就中国的普通用户的网络带宽来说,这就是极限了。而Stratus 2 中 “组” 的概念解决了这个问题。用户A发布视频让同一个组中的其他10个人观看。他们并都从A处获取视频。而有可能通过组中的其他用户获取A的视频。这也就是P2P的模式了,每个人都可以作为数据的发出者,数据以最优的方式被观看者收到,参与的人越多,数据的副本就越多。视频的速度也就越快。

  1. 确定你安装了 Flex SDK3.2 以上的SDK (现在最新的是3.5). 这里下载
  2. 确定安装了flash payer 10.1 debug version (开发环境最好用debug version)  这里下载
  3. 申请一个 Stratus develper key 这里申请
  4. 下载flash player 10.1 的 Player Global SWC  这里下载,放到你的SDK3.2目录下面吧
  5. 导入下面的Demo源文件,编辑项目属性 — Flex compiler — Require Flash player version 到 10:1:0
  6. 编辑项目属性 — Flex Builder Path — Library Path — Add SWC. 添加你刚才下载的playerglobal.swc —- 添加后双击playerglobal.swc — 双击Link Type — 切换Link Type到External

好了,准备工作到此结束。

Demo操作

Demo 是一个视频共享的程序,用户A发布一个视频,其他进入相同组的用户可以观看视频,观看视频的同时大家可以文字聊天

  1. 先运行Publisher.mxml. 点击链接 (记住Group 名字,一会要用)
  2. 运行Viewer.mxml, 输入刚才的Group 名字,点链接。
  3. 你可以运行多个Viewer,输入相同的Group名,链接进去同一个组
  4. 链接成功后Viewer可以看见Publisher发布的视频。下面的聊天框可以和所有人聊天。

代码说明

具体的代码说明大家下载源文件看注释就好了(看Publisher的注释)。这里只说一下Publisher和Viewer的区别,Publisher是作为视频的发布者以及Group的参与者(注意他并不是Gruop的”老大”,Group对这里的任何人来说都是平等的,Publisher只是在里面发布了视频而已)。Viewer是视频的接收者以及Group的参与者。下面的代码指出了Viewer和Publisher的不同

Publisher发布视频

?View Code ACTIONSCRIPT3
           /**
            *
            * NetStraeam链接到用户组后触发
            * */
            private function onNetStreamConnect():void
            {
            	//加载话筒
                netStream.client = this;
                var mic:Microphone = Microphone.getMicrophone();
                if(mic)
                {
                    mic.codec = SoundCodec.SPEEX;
                    mic.setSilenceLevel(0);
 
                    netStream.attachAudio(mic);
 
                    updateStatus("话筒设置完毕\n");
                }
                //加载视频,并发布视频和话筒
                publishVideo()
 
            }

Viewer接收视频

?View Code ACTIONSCRIPT3
            /**
            *
            * NetStraeam链接到用户组后触发
            * */
            private function onNetStreamConnect():void
            {
                netStream.client = this;
 
                if(null != video)
                {
                    videoDisplay.removeChild(video);
                    video = null;
                }
 
                video = new Video();
                video.smoothing = true;
                video.attachNetStream(netStream);
                videoDisplay.addChild(video);
 
                //播放视频
                netStream.play("stream");
                netStream.bufferTime = 1.0;
            }

Demo截图

Publisher

a

Viewer

b

源代码下载

Stratus2Demo (480)

23 Comments

  1. noone says

    为什么连接数服务器及创建组的时间很久?

    Reply

    Kevin Luo Reply:

    链接到stratus 服务器比较耗时间(貌似这几天特别慢)

    Reply

  2. asker says

    如何在一个实例中实行发送和接受音频呢?

    Reply

    Kevin Luo Reply:

    这个实例包括了视频和音频

    Reply

    asker Reply:

    啊,我的意思是在一个运行的实例中,可以发送也可以接受组内的音频,就是不只是Publisher可以说话,而是任何一个人都可以说话,求解!~ 0 0

    Reply

    Kevin Reply:

    每一个参与者都可以通过netStream发送流,根据原来p2p的方法。你需要不同的两个netStream,一个负责发送,一个负责接收。发送stream时的id要各不相同 (netstream.publish(“stream”)这个stream是id). 我还没试。不过应该是这样的,你可以试试。

    asker Reply:

    好的,非常感谢,我去试试!~

    继续关注你blog -^ ^

    kevin Reply:

    有没有只加入group中就能发送也可以接受组内的音频?

  3. luming says

    博主你好,
    看了你写组播的教程,很受益。
    有个问题想问一下,之前的教程是支持flash player 10的,组播的教程是不是必须用10.1的版本呢?
    目前ie6浏览器好像不支持10.1的版本呢!
    必须是Ie7以上才可以进行组播的实施呢?
    谢谢。

    Reply

    Kevin Luo Reply:

    你好,是的,组播教程必须使用FP10.1, 现在fp10.1是beta 3版。可以到我上面提供的地址去下载。 我不太清楚IE6是不是支持10.1, 你装了10.1for windows在ie下没反应吗? 注意现在不能直接从ie自动升级到10.1,因为还是beta, 不能通过升级功能获得,只能下载安装。

    Reply

    luming Reply:

    我去下载了IE版本的10.1 现在可以正常使用了,谢谢Kevin,持续关注ing!

    Reply

  4. shenxing says

    请问player10 的API在哪里有下载,光看代码看不懂。另外还有一个问题是视频的延时比较严重,大概有3-5秒左右,请教高人指导一下,我的QQ:594103943,谢谢

    Reply

    tuiliu Reply:

    是啊,延迟严重,怎么回事?

    Reply

  5. jocole says

    我将这个实例应用在air2.0上,想做个桌面版,却老是出现VerifyError: Error #1014: Class flash.net::NetGroup could not be found.这个错误,配置那些都跟您提到的一样,不知道是什么原因?是不是需要特别的配置或特别的辅助文件?不知道您是否研究过,能否给我解惑?谢谢

    Reply

    Kevin Luo Reply:

    这是因为AIR 2.0 SDK现在还不支持这个方法。SDK里没有包含NETGROUP类,在Flex中我们需要导入新的playerglobal.swc,但是现在没有发现有新的airglobal可以使用.

    Reply

    jocole Reply:

    哦,谢谢博主!

    Reply

  6. jiao says

    您好,我想问下怎样才能 播放 一个 我事先选着好的一个视频。
    这个视频可能在 FMS 的流媒体服务器上,怎么通过我自己的选择
    然后 通过 P2P播放给所有人

    Reply

  7. [...] 2的文章中给大家简单介绍了Stratus 2 一对多视频直播,今天给大家演示一下如何在NetGroup中共享文件。在原来的Strtuas 1 [...]

  8. [...] 2的文章中给大家简单介绍了Stratus 2 一对多视频直播,今天给大家演示一下如何在NetGroup中共享文件。在原来的Strtuas 1 [...]

  9. 吴灌楚 says

    我看了好多stratus搭建的p2p视频聊天,但是不知道play()方如何获得对方的nearID。因为play方的netStream = new netStream(nc, 对方的nearID).

    Reply

    Kevin Luo Reply:

    这个需要另写一个服务端来维护,用于逻辑上的处理,Stratus只是提供了p2p的连接方式而已

    Reply

  10. loomo says

    我想实现从FMS接收一个rtmp流,然后再通过P2P给所有人播放,可以实现么。

    Reply

Leave a Reply

Leave a Reply
  • (required)
  • (required) (will not be published)