LinuxC/C++编程基础(30) 视频包缓存的实现
来源:互联网 发布:stc单片机iap存储数据 编辑:程序博客网 时间:2024/05/24 15:40
1.定义cache_limit,如下:
enum CACHELIMIT {
MAXSPEAKERS = 8,//表示连接对象的最大数
MAX_PKTS = 20 //表示每个连接对象缓存包的最大数
};
2.视频包的定义,如下:
struct VideoPkt
{
uint32_t _from;
uint32_t _sid;
uint32_t _seq;
uint32_t _time_stamp;
std::string& payload;
static int parseFrom(const char* data, size_t len, videoPkt** out);
};
3.videoUidMap的定义,如下:
Poco::HashMap < uint32_t, std::map< uint32_t, Poco::SharedPtr< VideoPkt> > > videoUidMap;
4.视频包的缓存,如下:
void onVideoRes(const char* pack, int length) {
videoPkt *pkt = NULL;
videoPkt::parseFrom(pack, length, &pkt);
//把解析出来的视频数据回发给客户端,实现略去,这里着重讲缓存的实现
//delete pkt; //不删除解析出来的pkt,而是用来更新缓存
//update cache
Poco::HashMap< uint32_t, std::map< uint32_t, Poco::SharedPtr< VideoPkt> > >::Iterator itr = videoUidMap.find(pkt->_from);
if(itr == videoUidMap.end()) {//没有找到,说明是新的连接对象
if(videoUidMap.size() < MAX_SPEAKERS) {
std::map< uint32_t,Poco::SharedPtr< VideoPkt> > amap;
videoUidMap.insert( std::makepair(pkt->_from, amap));
itr = videoUidMap.find(pkt->_from);
} else {
return;
}
}
if(itr->second.size() == MAX_PKTS) {
itr->second.erase(itr->second.begin());
}
Poco::SharedPtr p(pkt);
itr->second.insert(std::makepair(pkt->_seq, p));
}
5.重传请求的实现,如下:
bool onReSendVideoReq(uint32_t uid,uint32_t seq) {
Poco::HashMap< uint32t, std::map< uint32t, Poco::SharedPtr< VideoPkt> > >::Iterator itt = videoUidMap.find(uid);
if(itt != videoUidMap.end()) {
std::map< uint32_t, Poco::SharedPtr< VideoPkt> >::iterator ita = itt->second.find(seq);
if(ita != itt->second.end()) { //表示在本地缓存中找到了丢失的视频包
//判断监听Id是否无效,无效的话,返回false,这里略去
//把从缓存中找到的视频数据包回发给客户端,这里略去
return true;
}
return ReSendVideo(uid,seq);//缓存中没有找到,重新向视频前端请求,实现略去
}
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8485475
- LinuxC/C++编程基础(30) 视频包缓存的实现
- LinuxC/C++编程基础(33) 视频包缓存的实现(续1)
- LinuxC/C++编程基础(5) 排序二叉树的实现
- LinuxC/C++编程基础(6) 堆排序的实现
- LinuxC/C++编程基础(9) 二叉查找树的实现
- LinuxC/C++编程基础(10) quicksort的简单实现
- LinuxC/C++编程基础(12) 红黑树的实现
- LinuxC/C++编程基础(36) Poco::BinaryReader的实现
- LinuxC/C++编程基础(37) Cumulus::BinaryReader的实现
- linuxc编程一站式学习(c基础)
- LinuxC/C++编程基础(17) 视频关键帧长度和宽度的解析
- LinuxC/C++编程基础(18) 视频关键帧长度和宽度的解析(续)
- linuxC编程基础
- LinuxC基础编程
- LinuxC/C++编程基础(1) 函数指针实现复数的加减乘除
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- LinuxC/C++编程基础(19) 不可复制类的原理及实现
- LinuxC/C++编程基础(4) 基于泛型实现vector
- linux中fork()函数详解
- sharepoint 2010 自定义字段开发(1) 创建一个简单的列表自定义字段
- 关于怎么在LR中模拟下载的动作
- 任正非:一江春水向东流 (zz)
- php变量作用域
- LinuxC/C++编程基础(30) 视频包缓存的实现
- cdev结构 and MKDEV
- Java数据类型和MySql数据类型对应表
- 守护进程与setid()
- C# list变成字符串
- ffmpeg 中av_rescale_rnd 的含义
- 淘宝风格的API设计 (命名风格)
- 在ImageView中拖动图片
- 先跟对人