b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

JRTPLIB使用实例(2)

电脑杂谈  发布时间:2016-05-01 18:01:13  来源:网络整理

流媒体数据。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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...