基于ts预索引和aio技术的播出系统设计与实现

上传人:E**** 文档编号:117975382 上传时间:2019-12-11 格式:PDF 页数:63 大小:1.25MB
返回 下载 相关 举报
基于ts预索引和aio技术的播出系统设计与实现_第1页
第1页 / 共63页
基于ts预索引和aio技术的播出系统设计与实现_第2页
第2页 / 共63页
基于ts预索引和aio技术的播出系统设计与实现_第3页
第3页 / 共63页
基于ts预索引和aio技术的播出系统设计与实现_第4页
第4页 / 共63页
基于ts预索引和aio技术的播出系统设计与实现_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《基于ts预索引和aio技术的播出系统设计与实现》由会员分享,可在线阅读,更多相关《基于ts预索引和aio技术的播出系统设计与实现(63页珍藏版)》请在金锄头文库上搜索。

1、上海交通大学 硕士学位论文 基于TS预索引和AIO技术的播出系统设计与实现 姓名:杨明磊 申请学位级别:硕士 专业:软件工程 指导教师:姜丽红;沈冠祎 20080101 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 基于 TS 预索引和 AIO 技术的播出系统设计与实现 摘 要 随着视频压缩技术和计算机技术的飞速发展,数字电视技术与 IT 技术的融 合、渗透,都在推动着基于视频服务器的数字播出系统的不断发展升级。越来越 多的电视播出系统也逐渐从传统 AV 电视技术平台过渡到以数字编解码技术和网 络为基础的 IT 信息技术平台。目前播出系统设备普遍采用计算机技术,是一

2、套 以基于磁盘阵列的视频播出服务器为核心, 将经过压缩编码以后的图像和声音数 据存储在磁盘阵列中,并根据节目播出需求进行节目编排、控制播出的自动化系 统,因此视频服务器是播出系统中的关键设备。 但是目前主流的视频服务器多采用硬件板卡设备进行节目视音频流的播出, 因此不但成本较高,而且单台服务器支持的频道数也非常有限,这对于小规模应 用来说具有一定的制约。而随着计算机技术的突飞猛进,这样的模式肯定会被更 具性价比的新系统所取代。 本文正是着眼于这一趋势,通过分析现有数字播出系统的关键技术及其优缺 点,研究如何把视音频编解码技术和网络通讯技术进行有效的融合,进而探索基 于 MPEG2-TS 技术的

3、纯软件实时视音频播出架构。重点研究提出了基于 MPEG2-TS 码流实时解码特征的改善应用,并且设计了一套针对异步非阻塞磁盘 IO 响应模 式(AIO)而优化的系统播出调度模型,从而提出了一套能有效提升播出系统性能 的纯软件解决方案,并且最终成功实现了整个系统。 本文所作的研究主要有以下几方面: 1、 研究了硬盘播出服务器所涉及的视音频编解码技术特点和几种主要的系 统 I/O 模型各自的优缺点, 然后有针对性的做了分析实验并获得了一定的实验数 据。 2、 在充分理解基于MPEG2-TS流格式的视频文件在实时播出时是根据PCR值 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕

4、士论文 进行速率控制的这一理论基础上, 提出并设计了一套基于 PCR 值和 I Frame(I 帧) 的预索引应用机制,在一定程度上减轻了播出控制对磁盘 IO 的负载要求。 3、 针对播出服务器性能的不同,分别设计了基于内存播出和基于磁盘播出 的两类服务器调度模型,奠定了本文所要设计的系统框架基础。 4、 结合以上各项研究的具体成果,设计了一套基于 AIO 技术的播出系统框 架模型,并最终根据这一模型实现了具体的应用系统。 本文的研究成果可以大大降低数字电视播出系统的应用成本, 有效提升了播 出服务器的性价比,是一套可以广泛应用于数字电视播出领域的具有高可靠性、 高灵活性及高性价比的播出系统。

5、 关键词:关键词:TS, AIO,IP 网络, MPEG, IPTV 基于 TS 预索引和 AIO 技术的播出系统设计与实现 上海交通大学工程硕士论文 RESEARCH /数据缓存区 int get = 0; /用于取数据操作后记录取得的数据量 _int64 filePosition = 0; /记录操作中文件定位指针的移动 int pid = 0; /记录操作中计算得到的PcrPid _int64 pcrBegin = 0; /记录当前数据中首个Pcr值 _int64 pcr = 0, lastPcr = 0; /记录当前数据中临时Pcr和最后一个Pcr值 PcrInfo pcrInfo;

6、/用于记录索引用的Pcr相关信息 IFrameInfo iframeInfo; /用于记录索引用的I帧相关信息 while(get = mBuffer.Get(packet, 1= get) break; unsigned char type = (unsigned char )( (find5 if(type != 0) int size = mIFrameInfo.size(); if(size 0 if(type = 1) /找到I帧 /计算当前I帧的位置 iframeInfo.pos = (filePosition+(find-packet)/packetSize; iframeInf

7、o.len = 0; mIFrameInfo.push_back(iframeInfo); find = memfind(find+3, get-(find+3-packet), 0x00010000, 4); unsigned char* p = packet; for(int i = 0; i+packetSize mIFrameInfo.begin(); mfi_t = mfi; /获取PCR信息 mpi = pim-mPcrInfo.begin(); mpi_t = mpi; /获取TS包大小 miPacketSize = pim-GetPacketSize(); while(mbSt

8、opB = false) switch(mOperateCode) case ocPause: /暂停命令 sleepms(40); break; case ocResume: /恢复暂停 /快进、快退、单步进、单步退等操作 case ocRun: /正常播放 _int64 sent = m64Sent; while(p - data = mfi-pos) 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 43 /判断是否需要获取下一个I帧信息 mfi_t = mfi;+mfi; if(mfi = pim-mIFrameInfo.end() mfi = mfi_t; i

9、f(m64Sent = mpi-pos) /判断是否需要获取下一个PCR信息 mpi_t = mpi;+mpi; if(mpi = pim-mPcrInfo.end() mpi = mpi_t; /控制播发速率 doSleep(mpi-len, 1); break; /正常播放完毕的情况,对相应的资源和变量进行释放处理 mbStopA = true; release(); reset(); 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 44 4.3.3 数据缓存调度实现 如图 4-7 所示,TMixBuffer 类是为本次研究的数据缓存调度机制定制的一 个封装类。

10、? 其中主要类成员变量和函数有以下几个: ? _int64 m64FileOffset:记录播发进程中节目对应的文件偏移指针; ? _int64 m64FileLength:记录节目文件大小; ? int m_iChannelIndex:记录读取线程对应频道信息,用以在IO响应队 列中定位读到的磁盘数据的归属。 ? TMutex mMutex:元操作锁定类对象,用于读磁盘时保证同一时间点只 有一个线程执行操作; ? Open():打开文件及 IO 操作相关信息配置函数; ? Get():发出 IO 读取请求指令的操作函数,如果已映射的数据满足请求 的数据量,则直接返回相应的内存段指针;反之,如

11、果数据量不够则调 用 mapNext()进行映射操作。 ? Seek():磁盘快速定位操作函数。 ? Erase():遇到非正常情况而控制相关偏移指针回退的操作函数。 ? mapNext():映射下一块磁盘数据到内存的操作函数,用以提高数据的 读取速度和读取效率。 ? mapPrev():映射前一块磁盘数据到内存的操作函数。 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 45 图 4-7 磁盘缓存类 TMixBuffer Figure 4-7 Disk Cache Class (TMixBuffer) ? 以下给出主要实现函数 Get()中的主要实现部分的关键代码。

12、核心功能部分 均作了相应注释。 uint TMixBuffer:Get(uchar* 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 46 RequestItemm_iChannelIndex.dwSize = uSize; /发出异步IO请求 if (!ReadFileEx(RequestItemm_iChannelIndex.hFile ,LPVOID(RequestItemm_iChannelIndex.pBuf) ,RequestItemm_iChannelIndex.dwSize , /创建等待异步IO操作完成事件 RequestItemm_iChannel

13、Index.hDoneEvent = CreateEvent(NULL, TRUE, 0, NULL); /等待异步IO操作完成 WaitForSingleObjectEx(RequestItemm_iChannelIndex.hDoneEvent , INFINITE, TRUE); /异步IO操作完成,拷贝取得的数据内容 ustr = RequestItemm_iChannelIndex.pBuf; /解除元操作锁定,允许其他IO请求执行 mMutex.Unlock(); return uSize; 每次Get调用就是图3-8中AIO Request队列中的一个元操作,在这里为了保 证队列

14、中每一个单独操作不出现同一时间点上出现竞争现象,引入了线程加锁 与解锁操作(mMutex.Lock()和mMutex.UnLock()),有效的达到了3.3.3章节的 预期设计要求。 ? 由上面代码可以看到实现函数中反复出现的变量 RequestItem,这个变量的 类型为以下结构体, 主要用以实现异步 IO 操作调用以及响应回调函数处理 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 47 所需数据。 typedef struct tagIOReq HANDLE hFile; / 对应文件的句柄 uchar * pBuf; / 每次IO操作获取的数据内存指针 DWO

15、RD dwSize; / 每次IO操作获取的数据量 OVERLAPPED os; / 供系统消息传递数据用的结构 HANDLE hDoneEvent; / 用于每次读取操作通知的事件句柄 IOREQ, * PIOREQ; ? 同时,以下函数为每次异步 IO 请求处理完成后的回调函数,在此给与指令 的发出者反馈信息及响应的频道相关信息处理操作。 void WINAPI OverlappedCallback(DWORD dIrrorCode, DWORD dwBytesXfer, LPOVERLAPPED lpOS) / 如果有异常则报错 if (dIrrorCode) printf(“Error %d: IO Completetion Routine n“, dIrrorCode); int i = (int) lpOS-hEvent; /判断IO请求属于哪个频道 /记录数据段偏移 RequestItemi.os.Offset += dwBytesXfer; /触发事件,通知对应的IO请求函数本次请求完成 SetEvent(RequestItemi.hDoneEvent); 基于TS预索引和AIO技术的播出系统设计与实现 上海交通大学工程硕士论文 48 4.4 4.4 系统应用分析 4.4.1 系统应用情况 本播

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号