技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

SlySeal源码与架构

youku这类的视频网站都是用flash作为展现的前端,那么它们又是怎么播放视频的呢?是否视频文件是随着页面一起下载的呢?其实视频并非是完全下载才能播放的,只要缓冲几秒,几乎就可以边下载边看了,这种视频播放叫做流媒体

flash 是adobe的技术(收购的micromedia)adobe设计了一种流媒体协议叫RTMP,这种协议可以支持用户边下载边播放,可以任意拖拽到播放列 表的某个时刻,那么播放器可以把当前时间作为数据发送给服务端,服务端根据时间计算应该seek到什么位置进行传输(不好意思,上面的过程是我乱扯的,因为我虽然读了一点源码,但是没读过协议和处理协议的源码,根据自己的理解猜测的)

现在说SlySeal,这个是老外写的轻量级的流媒体服务器, 实现了RTMP协议,在了解到flash视频播放用的是RTMP协议以后,我就去找,哪些开源的项目实现了RTMP协议,很幸运的,发现了python有 这种开源项目,于是下载回来,需要说明一下的是项目的开发环境是python2.6, 而我的环境是python2.7(ubuntu10.10)于是很被催的发现,2.6的项目运行在2.7下会出现一些运行时错误(主要是io方面API的 错误,貌似进行二进制数据的read,write,包括一些os下取系统环境信息的API会取不到数据)因此周六晚上测试时没通,不过看到前端发起请求 时,程序向LOG文件里写了错误消息,至少,我知道程序是运行了的,幸运的是ubuntu同时有python 2.6,2.7两个版本,因此使用下面的命令可以启动SlySeal
$ python2.6 slyseal.py start
默认目录是程序所在目录,也可以在程序里进行设定,可以在目录下建立vedio目录,把MP4等文件放入video下,jwplayer中请求file进行设定

OK,下面讲一下SlySeal的架构
SlySeal 启动时,用主线程生成一个数据结构handlers,每个handler都是一个对象,对象在初始化的时候都启动了一个线程,因此handlers实际是 一个线程池,每个handler都有自己的queue,clients,每个线程有自己的select 调用

主线程创建server对 象,server对象创建socket,绑定端口,进行监听(select模型)一旦有客户连上来,找一个client最少的handler进行处理,把 socket扔到这个hander的queue里,hanlder的线程函数会循环读取自己的queue,一旦发现数据,就读出来。判断是新的 socket,就生成一个client对象,放进自己的clients集合和select监听中(client集合实际上是一个python字典,用 socket作为key)

hander的某个socket发生变化,select会进行提示,通过socket找到client,调用client的readmessageAPI,进行具体的协议处理过程,之后的代码未读,从上面的描述中可以得到几个概念:
1 RTMP是长连接的,一旦服务器受理了客户端请求,中间一直保持一条通信链路
2 每个handler都有自己的队列,我觉得很好,可以降低为了抢一个公共资源而锁住的概率
3 主线程的select是为了处理新的socket,各个hander的select才具体处理数据的收发,这个很有意思,改天自己写个程序玩玩

前端我用的是jwplayer,传说youtube在发迹之前用的是这个,我觉得很好,资源链接
http://code.google.com/p/slyseal/
http://www.longtailvideo.com/players/jw-flv-player/

前端源码

<script type="text/javascript" src="jwplayer/jwplayer.js"></script>
<div id="container">Loading the player ...</div>
<script type="text/javascript">
jwplayer(
"container").setup({
height:
270,
width:
480,
modes: [
{ type:
"flash",
src:
"jwplayer/player.swf",
config: {
file:
"vedio/video.mp4",
streamer:
"rtmp://127.0.0.1",
provider:
"rtmp"
}
},
{ type:
"download" }
]
});
</script>



posted on 2012-01-13 18:39  codestyle  阅读(716)  评论(0编辑  收藏  举报