使用JRTPLIB接收数据,通常的做法是:
sess.BeginDataAccess();
if (sess.GotoFirstSourceWithData()){
do{
RTPPacket *pack;
while ((pack = sess.GetNextPacket()) != NULL){
//处理数据
sess.DeletePacket(pack);
}
} while (sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
而RTPSession提供了一个虚函数OnRTPPacket, 可以更加方便快捷地接收到数据包:
virtual void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime, const RTPAddress *senderaddress)
满以为通过重载它可以轻松替代之前的接收方法, 并且简单、高效, 经过一番折腾, 发现并不那么回事,
1、重载OnRTPPacket替代之前的接收方法, 会出现严重的内存泄漏, 因为数据处理完后, 无法调用DeletePacket
2、即便能通过修改部分源码, 释放内存, 这种方式也不可取, 因为OnRTPPacket收到的数据包是即时的, 没经过排序的
希望能帮助到有同样想法的朋友!