当前位置: 代码迷 >> 综合 >> jrtplib+p2p实验结果
  详细解决方案

jrtplib+p2p实验结果

热度:98   发布时间:2024-01-10 23:18:01.0

本来自己写过p2p模式的视频传输,不过都是完全手写的代码,有些地方代码不够规范。听说jrtplib写的很好,前一段时间也分析清楚了,今天拿过来做下测试。

使用jrtplib3.7.1的主要工作有两个:

一是发送接收数据需要分片和重组。开始采集双向链表,后来发现处理不够好,内存总出错(好久没研究数据结构了)。后来直接采用分配缓冲,发送数据时标志offset,接收数据 按offset直接填充,非常简单。当然接收时判断一下,有没有重复的数据。代码有时间整理一下传上来。

二是继承RTPSession,写一个响应类,在这里接收和发送。

然后,写一个对话框程序,用 DirectShow调用摄像头, 用SampleGrabber的方式抓数据,然后用libavcodec压成264;用DirectSound采集声音,用Speex压缩。先在内网测试,两台PC(或虚拟机)之间,直接向对方IP和端口发音视频,收到后解码,效果非常好。

到此为止,jprtlib表现的非常完美,另外代码质量也非常。

不过再下一步就有点问题,我用jrtplib再写服务器端,协助双方打洞。比较奇怪的是,客户端和服务器端只不过发送很少的命令字,双方反应都相当慢。看了看jrtplib代码,修改了一下socket接收发送的缓冲也不行。时间有限,没有完全看下去。估计是rtp和rtcp做协调时影响了效率。

简单地总结一下:如果使用jrtplib传送音视频媒体数据,非常理想。但如果使用它用来做服务器处理命令,效率肯定不行(当然修改其源码也能解决问题)。

也有变通的方法:可以自己写一个简单的可靠UDP,专门用来负责命令通信,用它得到对方的IP和端口后,送给jrtplib,然后jrtplib向这个IP端口发送数据就可以了。

不过,这样一样,还不如参考jrtplib源码,自己封装一个更好一些的UDP传输库。

传输音视频,因为数据量大,基本上不需要重传,只要做好丢包控制和同步就行了,所以完全可以不用jrtplib.

jrtplib主要的问题就是重组。

重组算法后面附上,虽然是测试代码,不过也稳定。

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn