(轉)Peercast简介、分析及常见问题处理

上一篇 / 下一篇  2008-04-18 15:56:06 / 个人分类:Net

fromhttp://yits2004.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet

一。简介 

    PeerCast.org成立于2002年四月,它是一个非盈利性的站点,提供免费的P2P电台软件。这个项目的目标是创建一个容易使用、简单的和可靠的软件客户端,从而使任何人都可以广播流媒体,而不必耗费昂贵的服务器或者带宽。

    PeerCast为广播者提供相当可观的节省,因为他们不必提供带宽给所有的接听者。一个单独的56K调制解调器即可用来为整个网络广播一个电台。

    PeerCast是一个健壮的网络,因为不存在中心服务器,每个用户可以是客户,也可是服务器,也可以是流的广播者。它为广播者提供了匿名服务,因为要追踪到源文件流并不是件简单的事。甚至可能的是,可以让一个不同国家的客户收听广播,而这个客户可作为整个网络的源。

    PeerCast是一个把音频/视频服务器和客户端集合在一起的软件。你可以通过PeerCast来收听众多的网络电台,也可以自己广播。PeerCast头等的特性是你不需要一个有庞大带宽的服务器来为众多听众提供广播服务,你所需要的只是PeerCast和一个外部的广播工具。

   Peercast和其他P2P文件共享软件的工作方式大部分相同,除了一点,用户下载的不是文件而是流。然后这些流实时地与其他用户进行交换。对于任何连接到网络的机器来说,没有任何数据会被存储到本地机上。

   公司可以让一个PeerCast客户端为整个本地网提供音频流。或者你也可以和你的朋友们在因特网上建立一个私人网络来收听音乐。是否直接连接到PeerCast网络,这取决于你自己的选择。


二。如何用Peercast发布和收听电台 

如何实时广播MP3:
所需软件:Peercast + Winamp + ShoutcastDSP

1.安装Peercast(下载地址http://www.peercast.org/download.php
2.安装Winamp
3.安装ShoutCastDSP
4.打开Peercast
5.配置ShoutcastDSP。在Winamp中点击选项->参数,在参数面版左边选择插件中的DSP音效,可以在右边看见Nullsoft SHOUTcast Source DSP,双击弹出SHOUTcast窗口。在ouput中的Address填上localhost,Port填7144(与Peercast相同),Password一栏填上在Peercast中设置的密码(初始为空)。在Yellowpages选项中可自己设置自己电台的相关信息。
6.使用Winamp播放你想播放的Mp3文件,在SHOUTcast中点击Connect
7.若连接成功,Peercast在Relay窗口中显示你广播的电台
8.yp.peercast.org会自动收录你的电台地址。

如何收听:
1.安装Peercast
2.点击yp.peercast.org
3.选择你想收听的电台,或者也可以在右上角通过关键字进行搜索
4.点击play,peercast会自动调用默认的播放器进行播放

(相关讨论)
Q:不知版主有没有研究过peercast的root模式?我真的不知道root模式有什么用.因为我不用root模式,而用normal,它同样可以发挥yellow page的作用,只要把另一个peercast上的yp的IP设成这个root下的peercast IP,这个root下的peercast channel信息上,就有另一个peercast广播频道源上的信息.所以,root不root,并不重要.只要看YP是谁,就成.YP的作用,还是很明显,就是提供发现所以以此为YP的peercast上的频道源的集成,若是有一个CGI程序对这个集成xml作一个解析,得到channel ID后,就可以做成一个像yp.peercast.org那样的网站了... 
不知版主对上有何高见?欢迎讨论...我对源码研究不多,正在看C++语言呢,不久就要深入源码分析了,请多指教!
A:按Peercast开发者的解释,作为YP的网站确实是要设在root模式下的。 
对于如何做一个yp.peercast.org的网站,你的说法是完全正确的。 
至于只作为normal模式能否接收到广播频道源的信息,我这两天做测试看看。 
关于源码的分析,你可以看看我博客上发表的源码分析文章,希望对你有所帮助并就我的错误和改进之处多提意见。 
希望我们合作愉快!


Q:peercast的启动参数有-kill, -multi...但-url是什么意义,我看了一下源码,不能确定,版主有没有知道啊?我觉得好像是用-urlmyform.://这种形式,用myform.://来取代peercast://的,不知对不对?
A:-url方式是这样使用的,假设你知道JOKV-FM(TEST)这个电台的URL地址为: 
peercast://pls/6618AD6E10CD60AF27307AFFF0401345?tip=220.157.200.33:7144peercast -url 
那么使用以下命令peercast -url peercast://pls/6618AD6E10CD60AF27307AFFF0401345?tip=220.157.200.33:7144 
也可以直接访问到这个电台

四。局域网中的Peercast网络架设 

前面介绍的Peercast发布和收听是基于公网的,如果你是在一个小型局域网内,想在局域网内架设一个广播电台网络,那么该如何设置呢?

1.选择一台机器作为服务器端,安装Peercast并将其设置工作在root模式下(在setting中修改)。编写一个动态网页读取XML信息,显示现有的网络电台,设置其网页访问地址例如yp.cuc.edu.cn。
2.其他机器均作为客户端,安装Peercast,默认设置于normal模式下,并将其中的YP address项改为服务器端的IP地址。
3.按上文介绍的方式发布网络电台
4.收听时访问服务器网页地址,点击Play即可播放

(yp.peercast.org就是这样的一个例子 
在另外一台机器上输入http://ip/admin?cmd=viewxml可以读取XML,这意味着你可以通过发送HTTP的GET请求来获取XML信息)


五。Peercast的PUSH实现方式 

防火墙后的客户机   

并非总是在初始化一个文件下载后都可以与Gnutella客户机建立直接连接。客户机可能在防火墙后并不允许通过它的Gnutella端口进入的连接。如果一个直接连接不能建立,客户机若想下载文件可能会请求共享文件的客户机采用“推送”方式来代替。一个客户机可以通过发送一个Push文件推送请求到发送QueryHit请求的客户机处来实现。作为Push请求目标的客户机(在客户机标志区标示一个Push的描述符)应该接收Push描述符,尝试建立一个新的TCP/IP连接到请求客户机(在Push描述符中标示有IP地址和端口)。如果直接连接不能建立,那么可能发起Push请求的客户机自己也在防火墙后。这种情况,文件传输将不能进行。

 Peercast实现:if (hit.firewalled) strcat(flstr,"Push,");   

如果一个直接连接可以从防火墙后的客户机建立到发起Push请求的客户机,防火墙后的客户机应该立刻发送以下的:

 GIV :/\n\n 这里的:和是Push请求头中的的文件索引和客户机标示,是本地文件表中文件索引为的文件。客户机收到GIV请求头(Push请求者)应该从头中取出和并构造一个如下的HTTP GET请求: GET /get/// HTTP/1.0\r\n Connection: Keep-Alive\r\n Range: bytes=0-\r\n User-Agent: Gnutella\r\n3 \r\n 余下的下载过程和上面所述的“文件下载”内容一致。 可允许的用户-代理字符串由HTTP标准定义。客户机开发者不能对这里使用的值做自己的假定。其中的值“Gnutella”只是用来演示举例而已。

 Peercast实现:s->initGIV(h,c->info.id);

六。如何用peercast实现转播 

如果你想转播一个在网上已经存在的音频或视频流,那么这个操作非常简单。

首先在peercast菜单中选择Advanced->Broadcast

在弹出的页面中填上相关的信息,最重要的URL项填上已经存在的音视频流地址,例如http://ccd.zjonline.com.cn/mp3/agtbw.mp3,再填上其他的相关信息

点击Create Relay,创建成功后你可以在GUI窗口中看到你正在转播的频道

十九。Peercast的命令行使用方式 

Peercast也可以从命令行启动,有如下几种参数选择

Peercast:正常方式启动

Peercast -inifile:启动,并设置配置文件参数

Peercast -kill:启动后立即关闭

Peercast -url:按照频道的URL地址启动Peercast并播放相应电台

Peercast -multi:以非互斥方式启动

二十二。用Peercast广播视频文件(WMV格式) 

1.安装Windows media encoder

2.新建会话中选择自定义会话

3.源来自选择文件,在文件名中点击浏览选择要广播的视频(WMV)

4.在输出中选择自编码器拉传递,端口号填8080

5.点击应用

6.在Peercast的Broadcast页面中URL填入http://localhost:8080,其他项根据你的选择设置,然后点击Create Relay

7.在WIndows media encoder中菜单中选择控制->开始编码

8.若广播建立成功,在Relays页面中可以看见刚刚建立的频道,点击Play即可播放

 

二十三。Peercast整体架构分析 

现在的P2P流媒体主要有两种架构:

1.基于树的架构。这是由流媒体的多播演化而来的,也就是播放同一频道的节点组成一棵树,提供广播的源节点为这棵树的根。每个节点可以为下层几个节点提供数据。但这种架构仍然会对上层的结点造成太大的负担,而且在节点动态加入和退出的情况下树不易维护。另外还存在传输延迟问题,所以树的高度不能太大。

2.基于图(MESH)的架构。通过邻居发现寻找相关的节点。这种架构可以实现完全非中心化。

Peercast采用的是基于图的架构。所有Peercast节点都在同一网络中,而且一个Peercast可以同时转播多个频道。由于Peercast集合了客户端和服务器功能,所以一个Peercast可以同时是广播者、转播者和收听者。

Peercast网络架构可分为三层。

第一层是YP。
YP(yp.peercast.org)从广播者中收集频道信息,是整个网络的根。

第二层是广播者。
广播者向YP发送频道信息,这样YP就能有一个完整的广播者的列表。

第三层是转播者
转播者收听频道,每个广播者维护一份转播者的列表。

P2P流媒体的运行模式
视频/音频输入+编码器+Peercast+播放器

视/音频输入:这是频道的来源,可以是实时事件(电视),也可以是文件(MP3/WMV)
编码器:用于将文件编码成更易于传输的流格式,可以是SHOUTcast DSP和windows media encoder等
播放器:播放编码后传输的文件

Peercast:根据其完成的功能可分为下列几个模块:
1.获取媒体数据:作为广播者读取编码器发送过来的流数据
2.用户界面:以GUI和网页方式提供控制
3.数据传送:在节点间传递控制信息和频道流具体数据
4.节点选择:选择要进行传输的最佳节点
5.缓冲管理:管理流缓冲以实现流媒体下载和播放
6.HTTP服务器。将流数据用HTTP方式送往播放器

节点的加入与退出:

当一个Peercast节点第一次加入Peercast网络时(点击yp.peercast.org中特定频道的PLAY按钮),例如访问地址是peercast://pls/EF49346D72FD05F234D3DA2C33FF3A9C?ip=61.213.94.129:2010 。它会先与广播这个电台的IP(61.213.94.129:2010)建立连接。由于这个广播者是不变的,所以至少会有一个特定的连接。如果广播者是满负荷的,那么这个节点可以通过这个广播者同其他转播同一电台的节点建立连接。
通常会建立8个连接。


在这点上是与Gnutella网络不同的,由于必定存在一个广播者,所以不必实现Gnutella中关于节点第一次加入网络的机制(GWebCache),而此时广播者相当于BT软件的一个原始种子。

与本节点转播同一频道的节点(也就是邻居)的信息保存在ChanHitList中,其中ChanHitList是一份ChanHit的链表,每个ChanHit保存一个相关结点的信息。Hit的意思是你想收听的频道的广播者或转播者。

拥塞控制:

当output队列超过50%时进入拥塞控制模式。系统丢弃一些incoming包,并根据包类型和跳树来给outgoing包区分优先值。当output队列降到25%时,系统会关闭拥塞控制模式。

转播时间更久的节点比刚开始转播的节点拥有更高的优先权,这体现在TTL上。刚开始转播的节点广播的包的TTL值为1,而这个TTL值每5分钟会递增1。这样转播时间超过35分钟的结点会有着最高的TTL值7。

节点间的通信:
节点间的通信通过发送和接收控制信息包来实现。Peercast专用协议PCP规定了控制信息包的类型和格式。
ServMgr负责分配、删除和使用servent对象,每个servent对象负责一个具体的连接,而其中包的发送、接收和解析工作由PCP Stream来实现。

传输者的选择:

在建立初始连接之后,节点需要选择一个最佳的节点来传输频道数据。
选择的顺序依次如下:
1.本地转播者
2.邻居转播者
3.本地广播者
4.邻居转播者

比如说如果找到邻居转播者就不用继续往下找,然后从其中选取出最佳的节点作为传输对象,其他作为备用传输者。
这个最佳可从以下三个方面来衡量:


如果这个传输者退出网络,那么必须重新按上次方法选择下一个传输者。
由于备用传输者较多,所以当节点动态退出网络时不会造成太大的影响。


缓冲机制:

流(stream):流在Peercast中是一个非常重要的概念。所谓流,就是字符串的集合。所以无论是包、视/音频数据都可以看做是一个流。

Peercast的缓冲机制是通过ChanPacketBuffer实现的,里面包含有多个ChanPacket,每个ChanPacket封装了实际的数据。

二十六。Peercast的电视直播测试 

硬件设备:服务器+视频采集卡+普通电视

软件设备:Windows XP + Windows Media Encoder 9.0 + Peercast

实现步骤:

1.用视/音频线将电视AV输出连接到视频采集卡上。

2.在Windows media encoder中新建会话选择广播实时事件,设备选项中选取相应的视频采集卡,广播方法中选择自编码器拉传递,广播连接端口选择8080(其他未用端口也行),编码选项选择282Kbps(越高越清晰,有多种选项),282属于较低画质,但是还勉强可以接受的编码率,点击完成。

3.配置Peercast。选择Broadcast,URL中填入http://localhost:8080,TYPE选择WMV,点击Create relay。

4.在控制中选择开始编码。

 

局域网内延时应该在15秒左右。

二十七。Peercast的改进分析 

Peercast可以说是一个实验的产品,而不是一个稳定的商业版本。所以无论在稳定性还是在性能上都存在一定的问题。这里提出Peercast存在的一些问题,并考虑相应的改进方法。希望可以为大家改进Peercast提供一些帮助。

先解释几个名词:
父节点:也就是此时你在向别人传输数据。一个节点可以同时是父节点和子节点。
子节点:也就是此时你在接收父节点传输给你的数据。

基于文件传输的流媒体传输:
    Peercast是在Gnutella协议的基础上发展而来的。Gnutella是一个P2P的文件共享系统,可以传输任何类型的文件。Peercast传输的文件是视/音频流,传输方式通过HTTP方式进行。但Peercast没有考虑到流媒体传输的特性,只是简单地用HTTP方式来传输视/音频文件。
    改进:可以考虑采用RTP/RTSP方式来传输流媒体数据

单点传输:
    Peercast每个节点的数据只能来源于单一的节点。这样的好处在于模型简单,缓冲机制容易处理,传输过程中不会产生太多的控制信息。在传输音频时没有任何问题,但是在传输视频数据时,由于视频数据量大,所以会经常出现缓冲很久的情况。
    单点传输还存在的一个问题是如果父节点退出网络,会对子节点造成很大的影响。其实单点传输可以理解为基于转播的传播方式,每个节点向其他结点转播频道。但这样的话无法发挥出一般P2P软件使用的用户越多传输速度越快的优势,这时候结点多只意味着你选择最佳节点的空间大而已,一旦确定一个传输节点,速率可以认为就是固定的。
    改进:采用多点传输的一种称为SwarmStreaming的方式。

节点的动态加入:
    有新节点加入时似乎其他节点也会受到相应的影响,如出现缓冲或声音出错等情况。
    这个问题尚在研究之中。

节点的动态退出:
    由于Peercast只能从一个结点传输数据,那么当你的传输节点退出网络的时候,就无法再连接到另一个传输节点了,而只能选择重新输入频道地址。这是由于Peercast并没有做相应的处理。如果节点动态加入和退出频繁的话,会带来很大的问题。
    改进:在一个节点要退出网络的时候,它先向它的子节点发出要退出的消息,子节点收到这个消息后,根据它的ChanHit再去寻找下一个传输者。如果在读完缓冲前能与另一个节点建立连接,就不会出现中断的情况。

电台发布:
    由于要支持各种各样的数据来源,如静态MP3文件、实时编码,各种不同类型的文件,所以电台发布繁琐。
    改进:可以在Peercast中内置电台发布功能。可以做成类似向导形式,也就是让你一步步地去选择发布的来源、方式、编码率等等。这样可以使软件更易使用。

YP:
    目前大多数的P2P软件都需要一个目录服务器,YP就相当于这样的一个目录服务器。
    也可以把显示频道的功能集成在Peercast软件中,只需要使客户端去读取YP上的频道信息就可以了。不过这样会增加Peercast的CPU使用率,而且由于电台的动态变化比较大,所以可以考虑在这边只显示YP上第一页的电台。

播放器集成:
    其实是否集成播放器各有各的好处。
    不集成播放器的好处在于用户可以使用他们喜欢的媒体播放器去播放相应的文件。
    集成播放器的话用户界面会更友好,可以显示出错和连接信息,而且看起来更像一个完整的软件。
    这个功能可以根据需要而定。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-10  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 9920
  • 日志数: 21
  • 建立时间: 2007-10-08
  • 更新时间: 2008-08-06

RSS订阅

Open Toolbar