流媒体数据。SendPacket() 是 RTPSession 类提供的一个重载函数
对于同一个 RTP 会话来讲,负载类型、标识和时戳增量通常来讲都是相同的,jrtplib 允许将它们设置为会
话的默认参数,这是通过调用 RTPSession 类的 SetDefaultPayloadType()、SetDefaultMark() 和
SetDefaultTimeStampIncrement() 方法来完成的。为 RTP 会话设置这些默认参数的好处是可以简化数据的发
送,例如,如果为 RTP 会话设置了默认参数:
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
之后在进行数据发送时只需指明要发送的数据及其长度就可以了:
sess.SendPacket(buffer, 5);
在真正的语音传输中,上面的buffer就是我们录音时所得到的buffer。使用上面的函数可以简单的发送,但无法真正的实现RTP传输,我们需要调用另一个接口:sess.SendPacket((void *)buffer,sizeof(buffer),0,false,8000);详细的说明可以查看jrtplib的说明文档。
e、对于流媒体数据的接收端,首先需要调用 RTPSession 类的 PollData() 方法来接收发送过来的 RTP 或者
RTCP 数据报。
jrtplib-3.7中修改PollData()方法为Poll(),使用都一样
由于同一个 RTP 会话中允许有多个参与者(源),你既可以通过调用 RTPSession 类的
GotoFirstSource() 和 GotoNextSource() 方法来遍历所有的源,也可以通过调用 RTPSession 类的
GotoFirstSourceWithData() 和 GotoNextSourceWithData() 方法来遍历那些携带有数据的源。在从 RTP 会
话中检测出有效的数据源之后,接下去就可以调用 RTPSession 类的 GetNextPacket() 方法从中抽取 RTP 数
据报,当接收到的 RTP 数据报处理完之后,一定要记得及时释放。
jrtplib 为 RTP 数据报定义了三种接收模式,其中每种接收模式都具体规定了哪些到达的 RTP 数据报将会被
接受,而哪些到达的 RTP 数据报将会被拒绝。通过调用 RTPSession 类的 SetReceiveMode() 方法可以设置
下列这些接收模式:
RECEIVEMODE_ALL缺省的接收模式,所有到达的 RTP 数据报都将被接受;
RECEIVEMODE_IGNORESOME除了某些特定的发送者之外,所有到达的 RTP 数据报都将被接受,而被拒绝
的发送者列表可以通过调用 AddToIgnoreList()、DeleteFromIgnoreList() 和 ClearIgnoreList() 方法来进
行设置;
RECEIVEMODE_ACCEPTSOME除了某些特定的发送者之外,所有到达的 RTP 数据报都将被拒绝,而被接受
的发送者列表可以通过调用 AddToAcceptList ()、DeleteFromAcceptList 和 ClearAcceptList () 方法来进
行设置。 下面是采用第三种接收模式的程序示例。
if (sess.GotoFirstSourceWithData()) {
do {
sess.AddToAcceptList(remoteIP, allports,portbase);
sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
RTPPacket *pack;
pack = sess.GetNextPacket(); // 处理接收到的数据
delete pack; }
while (sess.GotoNextSourceWithData());
}
完整的代码中,首先需调用Poll()方法接收RTP数据报,然后在BeginDataAccess()和EndDataAccess()之间进行数据接收的操作。此时,我们设定程序一直do-while等待并处理数据
do{
#ifndef RTP_SUPPORT_THREAD
error_status = sess_client.Poll();
checkerror(error_status);
#endif // RTP_SUPPORT_THREAD
sess_client.BeginDataAccess();
// check incoming packets
if (sess_client.GotoFirstSourceWithData())
{
printf("Begin play/n");
do
{
RTPPacket *pack;
while ((pack = sess_client.GetNextPacket()) != NULL)
{
// You can examine the data here
printf("Got packet !/n");
timestamp1 = pack->GetTimestamp();
lengh=pack->GetPayloadLength();
RawData=pack->GetPayloadData(); //得到数据
printf(" timestamp: %d lengh=%d/n",timestamp1,lengh);
// we don't longer need the packet, so
// we'll delete it
//Begin play
int fd = open("/dev/dsp", O_RDWR);
int status = write(fd, RawData,lengh );
printf("Play bytes:%d/n",status);
if (status != lengh)
perror("wrote wrong number of bytes");
status = ioctl(fd, SOUND_PCM_SYNC, 0);
if (status == -1)
perror("SOUND_PCM_SYNC ioctl failed");
printf("Play end/n");
close(fd);
sess_client.DeletePacket(pack);
}
} while (sess_client.GotoNextSourceWithData());
//return 0;
}
sess_client.EndDataAccess();
}while(1);
(2)程序流程图
发送:获得接收端的 IP 地址和端口号 创建 RTP 会话 指定 RTP 数据接收端 设置 RTP 会话 默认参数 发送流媒体数据
接收:获得用户指定的端口号 创建RTP会话 设置接收模式 接受RTP数据 检索RTP数据源 获取RTP数据报 删除RTP数据报
因为是关于jrtplib的文章,所以贴出的录音和放音代码不多。需要的朋友可以留下邮箱。
posted @
以上就是关于jrtplib的全部内容,相信你一定会非常满意。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-3637-2.html
请你给我画一只绵烊吧