博主已经使用live555近10年,用作客户端可以每个线程一路live555 rtsp client,但是用作服务端,一直是单个线程处理,并发能力受限。
今年笔者所在公司对并发量有要求,200路,不得不研究对其进行多线程改造。
经过1个月的开发调试,终于实现,现在把基本思路分享一下:
1. 不改动live555的处理框架和逻辑
2. 处理sdp的生成函数,把同步等待修改为定时器等待。(不修改会导致新的请求导致前一路视频可能卡顿)
3. 增加N个Rtp发送线程,处理rtcp和rtp的发送
4. 修改类MultiFramedRTPSink,增加rtp发送线程的派发处理:
MultiFramedRTPSink::continuePlaying函数中:
把MultiFramedRTPSink::buildAndSendFirst异步调度到rtp发送线程进行调用(回调函数 + 类指针)
MultiFramedRTPSink::sendPacketIfNecessary函数中:
增加异步调用MultiFramedRTPSink::sendNext,把sendNext函数调度到rtp线程进行调用(回调函数 + 类指针)。
5. 修改类RTPInterface,增加发送超时后保存剩余的未发送rtp数据,待下次重新发送。
6. sendNext和buildAndSendFirst函数触发的发送下一个包的timer事件,继续发回给live555主线程处理,io驱动的动力还是来自主线程的select。
rtp线程(执行调度:类指针->buildAndSendFirst, 类指针->sendNext) <==> live555主线程(select, accept, timer处理,把调用旧的buildAndSendFirst和sendNex修改为分派回调函数+指针给各个rtp线程)
注意,sendNext在live555中就是一个timer,反复调用的。