当前位置:  技术问答>linux和unix

linux 下jrtplib的几个问题

    来源: 互联网  发布时间:2016-08-08

    本文导语:  本帖最后由 lxq00 于 2010-03-04 16:06:17 编辑 最近做视频流的传输 采用了开源的jrtplib 库 在做的过程中 出现了一个问题  由于视频流比较的大,不断的在发,我每次读取20k的流然后分成1k都的一块一块的网络发送 可是...

本帖最后由 lxq00 于 2010-03-04 16:06:17 编辑
最近做视频流的传输 采用了开源的jrtplib 库
在做的过程中 出现了一个问题 
由于视频流比较的大,不断的在发,我每次读取20k的流然后分成1k都的一块一块的网络发送
可是如果网络发送的过程中 不暂停一下,接收的时候只能接受到最后一次的数据

具体代码附上:
int init_rtp_send(char * hostname ,int port ,SGRTP *rtp  ,int multicast)
{
unsigned long destip;
int destport;
int portbase = rtp->myport;
int status;
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
RTPSession *sess = &rtp->sess;
if(hostname==NULL)
return ERROR;
printf("rtp connet %s:%d myport = %dn",hostname,port,portbase);
destip = inet_addr(hostname);
destip = ntohl(destip);
 
sessparams.SetOwnTimestampUnit(1.0/8000.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
transparams.SetMulticastTTL(255);
transparams.SetRTPSendBuffer(64*1024);
status = sess->Create(sessparams,&transparams);
if(checkerror(status))
   return ERROR;
if(multicast){
  if(sess->SupportsMulticasting()) {
                 printf("Current jrtplib support multicasting!n");
         }
}
RTPIPv4Address addr(destip,port);
status = sess->AddDestination(addr);
if(checkerror(status))
return ERROR;

  // 设置RTP会话默认参数
  sess->SetDefaultPayloadType(0);
  sess->SetDefaultMark(false);
  sess->SetDefaultTimestampIncrement(10);
  set_crmode(1);        
  return SUCCESS;
}
int rtp_send_date(char * str,int len,SGRTP *rtp )
{
int status;
RTPSession *sess = &rtp->sess;
status = sess->SendPacket((void *)str,len);
// status = sess->SendPacket((void *)str,len,0,false,len);
if(checkerror(status))
return ERROR;
// status = sess->Poll();
 //      if(checkerror(status))
// return ERROR;
// RTPTime::Wait(RTPTime(0,100));
return len;
}
int init_rtp_recv(char * hostname ,int port ,SGRTP *rtp ,int multicast)
{
int status;
int multicastip;
uint16_t localport;
RTPUDPv4TransmissionParams transparams;
       RTPSessionParams sessparams;
        RTPSession *sess = &rtp->sess;
        sessparams.SetOwnTimestampUnit(1.0/8000.0);                
        sessparams.SetAcceptOwnPackets(true);
        transparams.SetPortbase(port);
        transparams.SetRTPReceiveBuffer(64*1024);
        status = sess->Create(sessparams,&transparams);   
printf("recv hostname = %s port = %d myport = %dn",hostname,port,rtp->myport);
         if(checkerror(status))
    return ERROR;
if(multicast)
{
multicastip = ntohl(inet_addr(hostname));
printf("hostname = %s multicastip = %d hton = %dn",hostname,multicastip,htonl(multicastip));
         RTPIPv4Address addr(multicastip, port);
         status = sess->JoinMulticastGroup(addr);        
         if(checkerror(status))
    return ERROR;  
}

return SUCCESS;
}

int rtp_recv_date(char *buf,SGRTP *rtp  )
{
RTPPacket *pack;
       uint32_t packetLen;
       uint8_t *packetData;
       uint8_t j = 11;
int len = 0;
int status;
RTPSession *sess = &rtp->sess;
sess->BeginDataAccess();
if (sess->GotoFirstSourceWithData()){
 do {     
                          while ((pack = sess->GetNextPacket()) != NULL)
                                {
                                        packetLen = pack->GetPacketLength() - 1;
                                        packetData = pack->GetPacketData();  
    len = packetLen -j;
    memcpy(buf,packetData+12,len);                                        
                                        sess->DeletePacket(pack);
                                }
                        } while (sess->GotoNextSourceWithData());
}
sess->EndDataAccess();
status = sess->Poll();
 //      if(checkerror(status))
//     return ERROR;      
return len;
}

int send_video(char * buf,int len,NETVIDEOURL *node,int board_num)
{
int Max_Udp_Mtu = (netvoid_codec->cfg_parser[board_num]->MTU_size > 60*1024)?
60*1024:netvoid_codec->cfg_parser[board_num]->MTU_size;
char * p_buf = buf;
 int file_bytes = len; 
 int sendlen , num_bytes;
 if(!node->IsInit)
  return FALSE;
while(file_bytes >0){
if(file_bytes > Max_Udp_Mtu)
sendlen = Max_Udp_Mtu;
else
sendlen = file_bytes;
if(node->nettype == UDP)
num_bytes = udp_send_data(p_buf,sendlen,&node->netsock);
else if(node->nettype == RTP)
{
num_bytes = rtp_send_date((char *)p_buf,sendlen, &node->rtpsock);
                //在这必须要停一下
// usleep(1/1000);
}
else
break;
if(num_bytes > 0){
file_bytes -= sendlen;
p_buf += sendlen;
}else
break;

}
return TRUE;
}
int recv_video(char * buf,NETVIDEOURL *node,int board_num)
{
int recvsize;
int timeout = 0;
char *p_buf = buf;
char *p;
if(!node->IsInit)
return FALSE;
while(1){
if(node->nettype == UDP){
recvsize = udp_recv_data((char *)p_buf,MAX_UDP_RECV_SIZE,&node->netsock);
}else if(node->nettype == RTP){
recvsize = rtp_recv_date((char *)p_buf,&node->rtpsock);
}else if(node->nettype == TCP){
recvsize = tftp_recv_data((char *)p_buf,MAX_TCP_RECV_SIZE,node->netsock.sock_fd);
}
if(recvsize= 100)
break;
nap(1/1000);
}else{
No_Video_Times[board_num] = 0;
if(Is_PS_Osd_Stream(p_buf)){
/*这是PS 流的osd*/
p = p_buf + 14;
memcpy(&disp_osd_pack[board_num],p,recvsize-14);
}else if(Is_TS_Osd_Stream(p_buf)){
/*这是TS 流 的osd*/
p = p_buf + 10;
memcpy(&disp_osd_pack[board_num],p,recvsize-10);
}else 
break;

}
}
         //如果上面那不停 每次发只能收到最后的一条
printf("recvsize = %dn",recvsize);
return recvsize;
}


请使用过jrtplib 的兄弟朋友看看,看看应该怎么修改  谢谢

|
你就做个实验,发送两个包,即只调用两次rtp_send_date((char *)p_buf,sendlen, &node->rtpsock);
看能否正确收到。
另外netvoid_codec->cfg_parser[board_num]->MTU_size的值为多少啊?

|

自己解决了是最好的结果呀!

|
没有使用过 可不可以只帮顶?linux 下jrtplib的几个问题[图片]

|
一般看到代码都比较头痛。
没使用过的漂过………………

    
 
 

您可能感兴趣的文章:

  • 关于LINUX的几个问题? 笔记本安装LINUX
  • 请教 Linux下安装ORACLE的几个问题
  • 各位高手大家好,我是初学LINUX想请教几个问题
  • linux几个问题
  • 求教,Linux初学者的几个问题
  • 想装个linux,先弄白几个问题。谢谢!
  • linux 几个问题 求解答
  • 关于linux的几个问题?
  • linux启动的几个问题
  • 初学Linux内核编译,几个问题请教一下
  • 急问:Linux程序中,使用system函数的几个问题
  • 菜鸟头次用linux,请高手帮忙解决几个问题?
  • 请教大家linux下建立视频的服务器几个问题
  • LINUX新手的几个问题,谢谢
  • 我准备开始学习linux,有几个问题!
  • 新手使用LINUX碰到的几个问题,望请指教!
  • linux编程的几个问题
  • 初学LINUX 的几个问题
  • 初学者的问题,要用Linux做一个批处理,碰到了几个问题
  • 准备开始学习 Unix/linux,请问几个问题?
  • linux上安装JRTPLIB库和JTHREAD库
  • 在linux环境下调用RTP/RTCP协议类库jrtplib-2.7为啥不成功?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3