交流一下,如何实现jrtp传送video数据?

上海老李 2009-05-02 04:32:10
我在发了后,收能收到数据,但是解码后发现不对,而且包也不一致,请教一下用过的人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;
}
...全文
897 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdystxxx 2010-09-06
  • 打赏
  • 举报
回复
分包的时候错了吧?
session.SendPacket((void*)buff,sizeof(buff),96,false,starttime.GetMicroSeconds());
如果分包的时候,剩余数据不足一包,发送sizeof(buff)字节数据不就错了吗?
上海老李 2009-05-02
  • 打赏
  • 举报
回复
还有别的方法或例子吗?
上海老李 2009-05-02
  • 打赏
  • 举报
回复
后边这些代码,是你自己的应用扩展,我这没法用的,呵呵
really3353 2009-05-02
  • 打赏
  • 举报
回复
pSession->DealwithData();

这句可以不要,这是我对数据的一个处理
really3353 2009-05-02
  • 打赏
  • 举报
回复
void CRTPTransSession::RecvDataThread(void *pParam)
{
CRTPTransSession* pSession;
MSG msg;
RTPTime delay(0.10);

pSession = (CRTPTransSession*)pParam;

while ( WaitForSingleObject( pSession->m_hStopRecvEvent, 10 ) == WAIT_TIMEOUT )
{
while ( WaitForSingleObject( pSession->m_hRecvDataEvent, 10 ) == WAIT_TIMEOUT )
{
while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
pSession->DealwithData();
}

SetEvent( pSession->m_hStoppedEvent );
}

上海老李 2009-05-02
  • 打赏
  • 举报
回复
我以前没做过,打算先在WINDOWS下试成功后,往WINDOWS MOBILE和SYMBIAN下移植,自己玩的,你有什么建议吗?
上海老李 2009-05-02
  • 打赏
  • 举报
回复
哥们,你能不能麻烦一下子,搞个视频传输的DEMO出来?我这几天折腾得头疼。收到数据,总是固定的480一个包。再说线程这块应不会要用具体哪种库吧,我通过线程是收到数据了。
really3353 2009-05-02
  • 打赏
  • 举报
回复
你可以尝试一下jthread这个库,封装的比较好
上海老李 2009-05-02
  • 打赏
  • 举报
回复
接收是不是不能开启一个线程?
really3353 2009-05-02
  • 打赏
  • 举报
回复
接收数据
	WPARAM			wParam;
LPARAM lParam;
RTPPacket* pack;

ResetEvent( m_hRecvDataEvent );

BeginDataAccess();

// check incoming packets
if (GotoFirstSourceWithData())
{
do
{
while ((pack = GetNextPacket()) != NULL)
{
uint8_t* dataBuffer;
size_t dataLength;
PTR_SEED_HEAD pSeedHead;

// 保存结束数据
dataBuffer = pack->GetPayloadData();
dataLength = pack->GetPayloadLength();

pSeedHead = (PTR_SEED_HEAD)dataBuffer;

if ( pSeedHead->DataType == PACKET_VIDEO )
{
wParam = memcmp( pSeedHead, &m_CommID, sizeof(GUID) );
lParam = (LPARAM)dataBuffer;
SendMessage( m_wMessageWnd, WM_VIDEODATA, wParam, lParam );
}
DeletePacket(pack);
}
} while (GotoNextSourceWithData());
}

EndDataAccess();
really3353 2009-05-02
  • 打赏
  • 举报
回复
	char*			pSendBuffer;
PTR_SEED_HEAD pSeedHead;
int iSendSize;

iSendSize = uiDataSize + sizeof(SEED_HEAD);
pSendBuffer = (char*)malloc( iSendSize );
memset( pSendBuffer, 0, iSendSize );

pSeedHead = (PTR_SEED_HEAD)pSendBuffer;
memcpy( pSeedHead, &m_CommID, sizeof(GUID) );
pSeedHead->DataLength = uiDataSize;
pSeedHead->DataPostion = m_Sequence++;
pSeedHead->DataType = DataType;

memcpy( pSendBuffer+sizeof(SEED_HEAD), pDataBuffer, uiDataSize );

// 发送数据
m_TransSession.SendPacket( pSendBuffer, iSendSize );

free( pSendBuffer )

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧