交流一下,如何实现jrtp传送video数据?
我在发了后,收能收到数据,但是解码后发现不对,而且包也不一致,请教一下用过的人JRTP如何发送大数据?
发送端:
bool CSendRtp::send( byte* data,long len )
{
byte buff[PERPACKET];
long hid=0;
RTPTime starttime = RTPTime::CurrentTime();
//如果包比较大,则进行分包
while(len>0)
{
memset(buff,0,sizeof(buff));
if (len>PERPACKET)
{
int i=0;
while(i<PERPACKET)
{
buff[i++] =(byte) data++;
}
len=len-PERPACKET;
}
else
{
int i=0;
while(i<len)
{
buff[i++] =(byte)data++;
}
len=0;
}
session.SendPacket((void*)buff,sizeof(buff),96,false,starttime.GetMicroSeconds());
}
session.SendPacket(data,len);
return true;
}
//发送端初始化
long destip;
destip = inet_addr(ip);
if (destip == INADDR_NONE)
{
//std::cerr << "Bad IP address specified" << std::endl;
return false;
}
destip = ntohl(destip);
//sessionparams.SetOwnTimestampUnit(1.0/10.0);
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
sessionparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(0);
int status = session.Create(sessionparams,&transparams);
//checkerror(status);
RTPIPv4Address addr(destip,port);
status = session.AddDestination(addr);
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
//接收端代码:初始化
localPort =port;
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
sessionparams.SetAcceptOwnPackets(true);
sessionparams.SetUsePollThread(true);
transparams.SetPortbase(localPort);
int status = session.Create(sessionparams,&transparams);
if (status <0)
{
return false;
}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
//接收线程
DWORD WINAPI threadproc(void* params)
{
int status=0;
FCALLBACK fun=(FCALLBACK)params;
RTPTime delay(0.020);
RTPTime starttime = RTPTime::CurrentTime();
unsigned char *recvdata;
//用于统计每次接收到数据的大小
long recvsize = 0;
long packid=0;
byte buff[DATALENGTH];
long len=0;
while (true)
{
if (runs)
{
session.BeginDataAccess();
if( session.GotoFirstSourceWithData() )
{
do
{
RTPPacket *rtppack;
memset(buff,0,sizeof(buff));
while( ( rtppack = session.GetNextPacket() ) != NULL )
{
recvsize = rtppack->GetPayloadLength();
recvdata = rtppack->GetPayloadData();
for (int i=0;i<recvsize;i++)
{
buff[len++]=recvdata[i];
}
session.DeletePacket( rtppack );
}
fun(buff,len);
//std::cout << "size:"<<len <<"data:" << buff << std::endl;
len=0;
}while( session.GotoNextSourceWithData() );
}
session.EndDataAccess();
}
else
{
break;
}
}
return NULL;
}
发送端:
bool CSendRtp::send( byte* data,long len )
{
byte buff[PERPACKET];
long hid=0;
RTPTime starttime = RTPTime::CurrentTime();
//如果包比较大,则进行分包
while(len>0)
{
memset(buff,0,sizeof(buff));
if (len>PERPACKET)
{
int i=0;
while(i<PERPACKET)
{
buff[i++] =(byte) data++;
}
len=len-PERPACKET;
}
else
{
int i=0;
while(i<len)
{
buff[i++] =(byte)data++;
}
len=0;
}
session.SendPacket((void*)buff,sizeof(buff),96,false,starttime.GetMicroSeconds());
}
session.SendPacket(data,len);
return true;
}
//发送端初始化
long destip;
destip = inet_addr(ip);
if (destip == INADDR_NONE)
{
//std::cerr << "Bad IP address specified" << std::endl;
return false;
}
destip = ntohl(destip);
//sessionparams.SetOwnTimestampUnit(1.0/10.0);
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
sessionparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(0);
int status = session.Create(sessionparams,&transparams);
//checkerror(status);
RTPIPv4Address addr(destip,port);
status = session.AddDestination(addr);
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
//接收端代码:初始化
localPort =port;
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
sessionparams.SetAcceptOwnPackets(true);
sessionparams.SetUsePollThread(true);
transparams.SetPortbase(localPort);
int status = session.Create(sessionparams,&transparams);
if (status <0)
{
return false;
}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
//接收线程
DWORD WINAPI threadproc(void* params)
{
int status=0;
FCALLBACK fun=(FCALLBACK)params;
RTPTime delay(0.020);
RTPTime starttime = RTPTime::CurrentTime();
unsigned char *recvdata;
//用于统计每次接收到数据的大小
long recvsize = 0;
long packid=0;
byte buff[DATALENGTH];
long len=0;
while (true)
{
if (runs)
{
session.BeginDataAccess();
if( session.GotoFirstSourceWithData() )
{
do
{
RTPPacket *rtppack;
memset(buff,0,sizeof(buff));
while( ( rtppack = session.GetNextPacket() ) != NULL )
{
recvsize = rtppack->GetPayloadLength();
recvdata = rtppack->GetPayloadData();
for (int i=0;i<recvsize;i++)
{
buff[len++]=recvdata[i];
}
session.DeletePacket( rtppack );
}
fun(buff,len);
//std::cout << "size:"<<len <<"data:" << buff << std::endl;
len=0;
}while( session.GotoNextSourceWithData() );
}
session.EndDataAccess();
}
else
{
break;
}
}
return NULL;
}
...全文
相关推荐
H264Decoder工程项目
H264Decoder工程项目,希望对初学者有帮助
V4L2 通过JRTPLIB 实现RTP实时视频传输并用SDL显示
linux 2.6.28---UBUNTU9.04 V4L2及uvcvideo驱动采集 采用libjrtp-2.9 实现RTP传输
Jrtplib发送视频文件+ ffmpeg回调函数方式解码网络视频包+VFW播放视频
发送端将本地视频以网络方式发包,接收端以ffmpeg回调函数方式解码视频包,然后用VFW播放视频
编译好的JRTPLIB库,vs2010可以直接用
VS2010下编译好的JRTPLIB库,支持RTP视频传输,可直接调用
产教融合实训基地与实践中心建设逻辑图-可编辑版
产教融合实训基地与实践中心建设逻辑图-可编辑版


多媒体/流媒体开发
