打算造一个基于bt播放的流媒体播放器. 于是简单的分析了下目前正是基于bt播放的流媒体播放器qvod.
qvod总体实现比较简单, 从软件设计上大致可以看出分成三大部分:
1. tracker, 这个服务器在qvod发布的种子里可以看到, 不过使用协议有加密, 所有其它bt软件是无法使用它的种子正常下载的, 关于是如何加密的, 我就没有具体去做分析了.
2. seed server, 这个其实也就一个做种的bt客户端而已, 提供数据服务.
3. bt client, 在qvod里是QvodTerminal.exe这个程序.
现在我打算针对QvodTerminal.exe进行简单的分析.
QvodTerminal.exe是提供数据给播放器的一个bt客户端下载组件, qvod的播放器是基于dshow实现的, 基本上是抄用开源mpc那些filter完成, 除了自己实现了一个source filter吧, 整体来说, 除了做了个ui, qvod并没有做什么工作, 垃圾一个.
学过dshow的朋友都知道, source filter是提供数据给播放器下游filter的, 关于source filter是如何和QvodTerminal.exe来获得数据的呢? 我简单的分析了它的二个重要的协议.
qvod是使用播放器组件来进行下载bt种子的, 这一步是用户不可见的, 下载好后, 将bt数据使用tcp协议8080端口发送到QvodTerminal.exe,然后由它去完成bt完成. 貌似在客户端发送种子到QvodTerminal.exe时, 还重新把Bt种子编码了一次, 这一步我没做具体分析了.
qvod跟source filter的数据通信协议一般是通过本地tcp端口8081进行的, 基本格式就是:
<整个数据包长度><协议Id>[协议内容]
如请求当前下载位图协议:
请求位图(c -- s):
<length:4byte><(00 00 04 19):4byte><filehash:40byte><unknow:8bytes>
返回位图(s -- c):
<length:4byte><(00 00 04 19):4byte><piece length:4byte><piece num:4byte><unknow:4byte><downloaded size:4byte><bitfield>
请求数据(c -- s):
<length:4byte><(00 00 04 22):4byte><filehash:40byte><request length:4byte><offset:8byte>
返回数据(s -- c):
<length:4byte><(00 00 04 22):4byte><length:4byte><data>
暂时只帖出这么多了. 看文档就可以了, 可见如果真要盗用QvodTerminal.exe来二次开发一个bt播放器, 是很容易的事...