教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

基于内存缓冲区的流媒体数据缓存(4)

来源:网络收集 时间:2026-02-02
导读: 结束 7、总算法框图 开始 数据包到来 多节目处理 decision=1? 数据包传送结束? clearremainer函数 丢失和缓冲区大小限制 处理 重复数据包处理 乱序和多线程处理 顺序输出函数 delete类 结束 四、实验代码 #includ

结束

7、总算法框图

开始

数据包到来

多节目处理

decision=1?

数据包传送结束?

clearremainer函数

丢失和缓冲区大小限制

处理

重复数据包处理

乱序和多线程处理

顺序输出函数

delete类

结束 四、实验代码

#include #include #include #include #include #include #include using namespace std;

const int maxbaglength=1500; struct databag{ int length;

int indataoffset; int ID;

char data[maxbaglength];};//数据包,备注:节目类接收的数据包是具有乱序、丢失、重复和多节目ID的属性的

struct b{

vector arra; int offset;

b* next;//指向下一个存储体

int judge;};//judge是一个判断该存储体是否被选中作为数据输出的源。为1,则被选中,每次输出完毕后,清除标志

const int programnumber=6;//存储池池位

b* bufferpond[programnumber];//构建缓冲区池,用来为每个节目分配缓冲区

class program{ public:

program();

void printdata(databag* bag); void clearremainer();

int computer(int baglength); int forceout(int baglength); int fence(int offset);

void receivedata(int indataoffset,int length,char* databag); int remaindata(int decision,char* &poutdata); void cleardata(int useddata); ~program(); private:

FILE* targetfilepoint;

b* buffer;

vector originalone; vector originaltwo;

int endnumber;//用来阻挡已经不需要的数据包

vector barrier;//栅栏函数处理重复数据包 int outdataoffset;//目的文件中的数据量 int ID;

program* next;};

program::program(int bagID) {

char targetfilename[500];

for(int i=0;i

if(bufferpond[i]==NULL) {

bufferpond[i]=new b; buffer=bufferpond[i]; buffer->judge=0; buffer->next=NULL; buffer->offset=0;

cout<<\存储区分配成功!\

cout<<\输入%d节目的目的文件名:\ cin>>targetfilename;

targetfilepoint=fopen(targetfilename,\ if(targetfilepoint==NULL) {

cout<<\目的文件创建失败!\ return;

}//初始化目的文件指针 break; }

if((i==programnumber-1)) {

cout<<\存储池已满!\ cout<<\新类创建失败!\ return; }

}//存储池为该节目类分配缓冲区 endnumber=0;

outdataoffset=NULL; ID=bagID;

next=NULL;

}//初始化类

void program::printdata(databag* bag,bool decision) {

if(decision==1) {

if(next!=NULL)

next->printdata(bag,decision); clearremainer() ; return;

}//数据包接收结束,输出当前类的剩余数据,并通知其他的类输出剩余数据 if(bag->ID!=ID) {

if(next!=NULL)

next->printdata(bag); else {

next=new program(bag->ID); next->printdata(databag* bag); }

}//数据包接收,比较数据包ID,如果现有的类可以接收这个ID的数据包,那么接收;否则在有池位的情况下,启动新的类

int offset=0; int remainer=0;

char* poutdata=NULL; int useddata;

if(bag->length>0) {

offset=bag->length+bag->indataoffset;

if(originalone.size()==1||originaltwo.size()==1) {

if(originalone.size()==1) {

if(bag->indataoffset>originalone[0]&&bag->indataoffset

if(originaltwo.size()==1) {

if(bag->indataoffset>originaltwo[0]&&bag->indataoffset

} }

//拦截目的文件中已不再需要的数据包 if(fence(offset)==1)

continue;//栅栏拦截成功,重复数据包丢弃 if(bag->length>512*1024)

continue;//如果数据包长度大于缓冲区限制,丢弃 while(computer(bag->length)>=1) {

if(forceout(bag->length))==0) break; }

//计算缓冲区数据量,如果当前数据包插入会溢出(512K),那么执行强制输出

receivedata(bag->indataoffset,bag->length,bag->data); remainer=remaindata(1,poutdata); if(remainer>1024) {

useddata=remainer-100;

fseek(targetfilepoint,outdataoffset,SEEK_SET); fwrite(poutdata,useddata,1,targetfilepoint); outdataoffset=outdataoffset+useddata; endnumber=endnumber+useddata; cleardata(useddata); } }

}//当文件没有读取完毕时,同时进行文件输出函数

void program::clearremainer() {

int remainer; char* poutdata; b* help;

help=buffer->next; while(help!=NULL) {

if(help->arra.size()!=0) {

for(int i=0;iarra.size();i++)

buffer->arra.push_back(help->arra[i]); help->arra.clear(); …… 此处隐藏:1090字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于内存缓冲区的流媒体数据缓存(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/521285.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)