音视频即时通讯的分包与重组

在音视频开发中音视频的传输主要用UDP来发送视频当发送的数据大于1500时分包发送保证每包小于1500关键是视频接收时的处理。本文根据UDP库传输数据作为代码演示.

intCUDPSession::SplitData(char* pBuff, uint32_t nLen)

{

int nBlockNum =nLen / UDP_BLOCK_SIZE;

if (nLen %UDP_BLOCK_SIZE != 0)

{

nBlockNum++;

}

int sendlen = 0;

for (int i = 0; i< nBlockNum; i++)

{

int poayload_size =UDP_BLOCK_SIZE;

char* payload =pBuff + UDP_BLOCK_SIZE * (i);

if (nLen -UDP_BLOCK_SIZE * (i) < UDP_BLOCK_SIZE)

poayload_size =nLen - UDP_BLOCK_SIZE * (i);

CPackOut* pack =new CPackOut;

(*pack) <<PACK_TYPE_DATA;

(*pack) <<m_nFrameIndex;

if (i == nBlockNum- 1)

{

(*pack) << 1;

}

else

{

(*pack) << 0;

}

(*pack) <<poayload_size;

(*pack).SetBuffer(payload,poayload_size);

int ret =SendPacket(pack, m_destIP, m_destPort);

printf("SendPacketret = %d\n", ret);

sendlen += ret;

delete pack;

pack = NULL;

}

return sendlen;

}

下面详细说一下接收端,因为UDP是不可靠的不保证数据帧一定正常到达即使收到顺序也可能发生变化比如先发的后到当然丢包的可能最大乱序的情况比较少。

正确的处理方法是

假设一个端口只接收固定一个对方数据源,这样收到一个数据包放到缓冲里然后在缓冲里根据帧的序号排序(每一帧的大序号是相同的自己可以给每一个小片加上小序号,包头里可以加上本次数据帧一共分多少片收到一片就统计一下判断是否收齐)。当收齐后这个帧去掉包头回调给上层。当在一定时间内该帧数据还没有收齐就说明传输过程有丢包了把已收到的都丢掉就可以。

当上层的应该收到回调的数据后可以进行解码播放。在解码之前先判断一下帧序列是否连续。如果中间有缺少的就把这一序列都丢掉直到下一个I帧。每个帧的序号最好收发之间协商好在发送的时候带上。

如果把上面整个过程都实现完全自己写的话需要几天的时间。不过从很多RTP开源库里发现处理的都非常简单很多都没有管乱序情况简单地来一份数据就向缓冲里追加一份直到发现mark为1。我们这里做为简单使用的项目也采用了这种简单方法先把功能完成之后有时间再来优化。

简单的重组代码:

intCUDPSession::Reassemble(CPackIn& pack, uint32_t ip, uint32_t port)

{

int nSeq = 0;

int nMark = 0;

int nLen = 0;

pack >> nSeq;

pack >> nMark;

pack >> nLen;

if(m_nRecvFrameIndex != nSeq)

{

if (m_buffer)

{

evbuffer_free(m_buffer);

m_buffer = NULL;

}

m_nRecvFrameIndex =nSeq;

}

if (m_buffer ==NULL)

{

m_buffer =evbuffer_new();

}

char* pBuf = 0;

int   nSize;

pack.GetBuffer(pBuf,nSize);

evbuffer_add(m_buffer,pBuf, nSize);

if (nMark == 1)

{

//回调

if (m_pCB)

{

m_pCB(m_udpIO.m_handle,(char*)(m_buffer->buffer), m_buffer->off, ip, port,

m_pParam);

}

evbuffer_free(m_buffer);

m_buffer = NULL;

}

return 0;

}

程序里使用的evbuffer是从libevent里面拿来的主要用来处理数据缓冲非常好用效率也很好见evbuffer.h和buffer.cpp。

完整代码在git上这次实现的功能是本机UDP bind5500端口-->摄像机采集-->编码-->发送给本机的5500端口-->收到后再解码-->显示。

发送的代码m_Sess.Send((char*)pData, nLen, inet_addr("127.0.0.1"), 5500);

这个程序可以分别运行在两台机器上一台是发送另一台是接收。发送方只要把上面这一句里面的127.0.0.1换上你目标的ip另一台机器就可以接收并解码了。

本文结束后完整的客户端功能基本就差不多了下一步开始完成server端的stun,协商穿透, 实p2p和中转视频。如果对音视频开发还有其他疑问可以登录该论坛进行咨询http://bbs.anychat.cn/forum.php

!fryuage:ZH-CN;mso-bidi-language:AR-SA‘>stun,协商穿透, 实p2p和中转视频。如果对音视频开发还有其他疑问可以登录该论坛进行咨询http://bbs.anychat.cn/forum.php

时间: 2024-11-07 10:40:02

音视频即时通讯的分包与重组的相关文章

音视频即时通讯 功能需求汇总

即时通讯开发,也叫音视频即时通信开发.随着互联网的发展,人们之间的交流逐步从电话移向网络.每天都有相当多的人在使用各种网络交流工具,如Anychat,腾讯QQ,ICQ,MSN,新浪微博. 可以看出人们对于网络上即时的沟通方式是非常敏锐的,所能容纳的程度也远远超过我们的预计.然而目前大部分网络交流工具都还是以文字为主,语音视频功能大部分还是不够成熟,完全通过网络实现语音视频需要考虑到很多方面,如:硬件.软件.技术.网络:等等.纯文字沟通方式效率非常低而且也不符合人们平素的习惯,作为一种消遣的工具尚

iOS平台上的音视频即时通讯应用开发

现在IOS很是火热,一大堆开发人员在捣鼓IOS平台的开发,相信大家也使用过QQ的语音视频对话功能,但是不知道大家有没有试过自己来开发一个基于IOS平台的音视频即时通讯的应用,这个应用必须能够做到跨平台 支持iOS平台设备上的音频即时通讯应用开发 提供Objective-C语言API接口,开放示例源代码 集成H.264.AAC.AMR等编解码技术 封装音视频的采集.编解码.传输.显示和播放等模块 支持Android.Web.PC等设备和iOS之间的互联互通 想要在IOS平台下实现音视频通信,最快捷

音视频即时通讯SDK有什么技术?可以做什么?

AnyChat SDK(AnyChat音视频互动开发平台)是一套跨平台的(*)即时通讯解决方案,基于先进的H.264视频编码标准.AAC音频编码标准与P2P技术,支持高清视频,整合了佰锐科技在音视频编码.多媒体通讯领域领先的开发技术和丰富的产品经验而设计的高质量.宽适应性.分布式.模块化的网络音视频互动平台. AnyChat音视频互动开发平台(SDK)包含了音视频处理模块(采集.编解码).流媒体管理模块(丢包重传.抖动平滑.动态缓冲).流媒体播放模块(多路混音.音视频同步)以及P2P网络模块(N

如何设置视频的帧率、分辨率、码率来调节音视频即时通讯的质量

在通过网络进行音视频即使通讯的时候,选择合适的视频质量参数就需要根据实际的系统运行环境综合来决定,下面我们针对常见的网络环境给出一些建议供参考. 目前常见的网络主要有四种类型:ADSL拨号接入方式.光纤接入方式.3G拨号接入方式.局域网. ADSL拨号接入方式是一种非对称的网络接入,下行流量通常有2Mbps.4Mbps.6Mbps等,而上行流量通常都是512kbps,即上行速率和下行速率是不对称的.此时如果需要使用AnyChat进行音视频的交互,则上传流量只能用512kbps作为参考值,适合的分

2014年音视频即时通讯市场的割据

当腾讯微信几年下来获取了几亿用户量之后,上个月双11晚上,腾讯微信正式推出"微信电话本"应用,利用网络通信技术,微信一键登录之后使用流量便可与微信好友直接通话,整体交互界面.流程和体验与手机打电话别无二致,关键只需耗费不需要支付其他费用就可以实现高清免费视频通话功能.与IM应用的语音通话功能相比,微信电话本的通话质量更高,而且可以直接拨打手机通讯录好友,应用场景更广,微信挑战三大运营商的声音不绝于耳! 就这样,腾讯在用微信大力挫伤传统通信的短信业务之后,又开始了对语音通话新一轮的冲击.

音视频即时通讯开发中音频模式的采集

在很多即时通讯应用中,会根据应用场景的不同,需要对音频输入源进行选择,不同的应用场景对应不同的音频工作模式.需要支持多种音频工作(采集)模式,包括:     1.发言模式(默认):自动选择麦克风为音频输入源设备,用户说话的声音被麦克风采集,启动音频特效处理(包括:回音消除.静音检测.噪音抑制.自动增溢),该模式通常应用于互动交流,用户发言讨论等场合:     2.放歌模式:自动选择立体声混音输入源设备,本地计算机所播放的声音被采集,同时SDK内部会自动屏蔽其它用户的声音(如果不屏蔽,则用户的声音

远程网络音视频即时通讯技术

多媒体指挥调度系统集指挥调度.即时通讯.视频会议.音视频录播等功能于一体.该系统结构严谨.技术先进.性能稳定,适合于解放军.武警.边防.生产企业等单位.通过该系统完成远程和现场之间的语音.数据.图像等信息的实时交互,有效解决了在不同网络带宽条件下的音视频交互,达到了充分有效利用现有网络和设备资源,实现远程可视化指挥.调度目的. 网络音视频技术是基于嵌入式结构的音视频处理.控制及传输设备,将模拟音视频信号经过编码压缩后通过以太网接口,将低码率的视音频编码数据以IP 包的形式传送给多个远端PC或网络

音视频即时通讯—Android 视频开发

移动互联网随着智能手机的普及应用越来越广泛,所谓移动互联网是将移动通信和互联网整合在一起,使移动设备(包括手机和上网本.Pad平台)可以随时随地地访问互联网资源和应用获取相应的信息和处理. 从2011年开始,“三网融合”正式被国务院纳入十二五计划并开始实施.国务院十分明确的把三网融合作为全面提高信息化水平的重要手段进行定位,彰显出三网融合在国家战略层面发展不可替代的重要性,也为三网融合在十二五期间的发展提出了明确的方向和目标.在同一的治理平台下,实现音频.视频.数据信号的传输和管理,提供各种宽带

音视频即时通讯技术在远程教育上的运用

在互联网的飞速发展的时代,远程教育已逐渐从传统教育领域的剥离出来并且成为一个非常重要的市场行业.目前,参加网校学习的人员正在逐步增多,按学习的目标不同分为学历学位.职业培训.网上充电等三种类型.学习方式目前主要分为集体开班和个体学习两种.另一方面,在互联网上各种各样的网校也到处可见,有正规大学开办的经过国家教委认可其学历的攻读本科.研究生课程的网校:有全国知名重点中学在网上搞的针对高考辅导的以应试教育为主的网校:还有一些商业网站针对网上充电者举办的一些职业技术培训的网校等.事实上,许多讲演.培训