基于JSP的流媒体播放的设计与实现
2016-11-02杨子祥林鹏
杨子祥 林鹏
摘要:随着Internet的发展,网页视频播放的使用越来越多。但是,目前如果直接通过HTML5的
关键词: 流媒体; JSP; Html5; Chrome浏览器; 视频控制
中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2016)18-0191-03
Design and Implementation of Playing Streaming Media Based On JSP
YANG Zi-xiang,LIN Peng
(Tianjin Open University, Tianjin 300191, China)
Abstract: With the development of Internet, playing web video is more and more on web. However, if playing the video through the HTML5
Key words:Streaming Media; JSP; Html5; Chrome browser; Video Control
1 概述
随着Internet的发展,网页视频播放的使用越来越多。因此,视频播放的用户体验也越来越实用;视频的播放、暂停、定点播放等操作的需求也就越来越大,而且也更符合用户实际浏览视频的要求。但是,目前如果直接通过HTML5的
所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。流媒体的出现极大地方便了人们的工作和生活。目前,使用流媒体的话都会通过流媒体服务器(比如Windows Media Services等)来搭建流媒体平台[1-4]。
JSP作为一种网页开发语言,在网站的开发中使用者的比例很大;因此,使用JSP开发的网站对视频播放的需求也会越来越多。但是,如果直接通过JSP后台平台结合HTML5的
2 基于流媒体服务器的网页播放探究
流媒体服务器的使用,解决了视频播放过程中,直接访问网络视频资源导致的视频拖拽问题。因此,流媒体服务器的网页视频资源的访问方式对于本文的设计来说,具有很大的价值。Windows Media Services作为一种流媒体服务器,是Windows Server服务器系统中使用频率很高而且性能很好的流媒体服务器。本文通过Chrome浏览器访问Windows Media Services中视频资源的流程研究发现,在视频拖拽的控制中,Chrome浏览器都会发送Http请求包;Windows Media Services接收到浏览器的请求后,再根据Http中包含的内容返回相应的视频片段。具体的流程如图1所示。
如图1中流媒体视频在Chrome浏览器和Windows Media Services流媒体服务器之间的交互可以看出,无论视频的播放还是中间视频播放控制,都是Chrome发送Http包进行控制;而Windows Media Services流媒体服务器则是负责对视频片段的返回。因此,本文使用Chrome浏览器访问对已经发布在Windows Media Services流媒体服务器中的视频,通过Chrome浏览器中的Network网络工具,对Http包进行抓取。图2中显示的是视频点击开始播放后,即视频从头开始播放,抓取的Http请求包的头文件内容。图3和图4中显示的则是视频播放过程中点击视频任意位置后,抓取的Http请求包的头文件内容。
- 数据库与信息管理
- 基于用户兴趣模型构建与个性化搜索算法研究
- 分布式系统中数据冗余的研究
- 基于虚拟打印的临床医疗数据获取技术的研究和实现
- 井下人员定位系统数据库设计及优化
- 计算机安全状态检测系统框架的研究
- 网络通讯及安全
- 网络形势下计算机信息安全防护措施研究
- 大数据时代下计算机网络信息安全问题研究
- 基于数字标签的电子文档分割存储研究
- 企业门户网站安全访问解决方案研究
- 能量高效的WSN分簇路由协议研究
- 基于云服务的高校教师网络研修社区建设研究
- 大数据环境下隐私保护的研究现状分析
- 一种新的链接预测方法在复杂网络中的应用
- 频谱分片弹性光网络关键技术的探讨
- 计算机网络风险及控制问题浅谈
- 大数据环境下的侵财犯罪发展及侦查策略
- 电子取证技术措施研究
- 网络大数据时代银行信息安全存在问题及对策
- 大数据理念在高校就业工作中的应用
- 基于RADIUS技术的无线网络安全管控系统的升级及扩容
- Android系统基于提升优先权限的攻击
- 大数据环境下高校校园网建设探析
- 计算机信息安全主要风险及应对策略
- 软件设计开发
- 基于Hibernate逆向工程对企业组织建模研究
- 基于Android的Python语言英汉维电子词典设计与实现
- 基于智能终端的照护保险服务管理系统的架构设计
- 基于Android平台的智能会议系统
- 小型图书信息管理系统的设计与实现
- 基于云服务的文件跨域上传的研究与实践
- 高校公共基础实验室管理系统的设计与实现
- 基于云的大学区教育资源公共服务平台构建
- 检验系统门诊流程的研究与设计
- 通用标准网络考试系统的设计研究
- 基于移动终端的高校多媒体教室管理系统设计与实现
- 使用Flash与C#配合开发化工实验仿真软件的研究使用Flash与C#配合开发化工实验仿真软件的研究
- 基于MVC模式的BBS论坛设计及实现
- 网络在线考试系统中数据导入导出的PHP实现
- 基于Python的勤工助学系统设计与实现
- 在线音乐管理系统的设计分析
- 计算机教学与教育信息化
- 《C语言程序设计》教学内容和方法之探索
- 《文献检索与利用》教学平台的应用方案研究
- 操作系统实践教学改革探索
- 计算机教学过程中学生创新能力的培养措施
- 信息技术在高中数学学科教学中的应用研究文献综述
- 分类招生制度下高职学生职业实践课堂教学改革探索
- 高校《计算机专业英语》教学的改革与实践
- 项目化教学在高职计算机应用基础课教学中的应用
- 浅析大学计算机软件方面的教育教学
- 卓越工程师培养目标下的课程改革
- 关于商科院校物联网工程专业建设的思考
- 高职物流配送实务项目化课程开发与实践
- 微课和传统教学的融合在《Web编程与设计》课程的应用
- 基于MPOC教学模式的《大学计算机基础》课程教学效果比较分析
- “互联网+时代”职业教育特色人才培养的研究与探索
- 计算机专业三方联动“订单班”人才培养模式实践与探索
- 信息化视角下计算机教改思路研究
- 基于TFAC理念的软件营销课程教学改革研究
- 基于MOOC的翻转课堂教学研究文献综述
- 高职“景区信息化新技术”课程教学设计
- “翻转课堂”模式在大学计算机教学中的应用
- 大学计算机公共课教学的几点思考
- 软件工程专业实践教学体系的建构及实践
- 对加强实验室评估推动高校计算机教学质量的探讨
- 校企合作模式下通信专业实践教学改革研究
- 大学生自主学习能力的培养
- 基于项目学习的CPU体系架构教学方法
- 人工智能及识别技术
- 图论最短路径算法的图形化演示及系统设计
- 基于分层改进式遗传算法的微小颗粒检测系统标定方法
- 基于局部窗口的端元提取光谱优化方法
- 基于NMF的Web评论情感分类方法研究
- 基于图像插值的高精度柱面展开算法研究
- 车牌图像识别的研究
- 基于光学系统的模糊图像频域特性分析
- 私有云在医疗图像信息存取系统中的应用
- 基于混合遗传算法的大规模VRP问题算法研究
- 多媒体技术及其应用
- 多媒体技术在计算机网络中的应用
- 浅谈高等职业院校3ds Max教学内容的选择
- Gamma值在三维软件maya的mental ray中的运用
- 基于JSP的流媒体播放的设计与实现
- 办公自动化系统中公文管理模块的设计和实现
- 计算机工程应用技术
- 太阳能热水工程水位控制系统的设计
- 基于基片集成波导左右手复合传输线的二维电扫描天线设计
- 基于漫水填充算法的肺实质分割方法
- 基于车牌定位的汽车挡风镜定位分割方法研究
- 基于差动变压器原理的多臂井径仪探头技术研究
- 塔顶放大器对UMTS网络覆盖的影响分析
- 基于单片机的环境温湿度实时检测系统的设计与实现
- 嵌入式Internet互联网技术的应用及研究
- 基于手持移动设备的虚拟装置教学系统
- 自适应多功能滤波器的仿真实现
- 基于单片机的遥控智能车位锁设计
- 论高等教育领域多轴无人机实训室的建设
- 基于STC单片机的闭环反馈控制智能鞋柜系统设计
- 基于SNMP4J的交换机台账核对及运维管理
- ATMP中冲正缓存设计及实现
- 有限元分析系统的发展现状与展望
- 单片机技术在多机通信系统设计中的应用
- 超薄BaTiO3铁电薄膜隧穿机理研究
客服热线:400-656-5456 客服专线:010-56265043 电子邮箱:longyuankf@126.com
电信与信息服务业务经营许可证:京icp证060024号
Dragonsource.com Inc. All Rights Reserved
3 基于JSP的在线流媒体播放的实现
在第二节中,本文通过Chrome的Http包的追踪功能,截取了视频在播放控制过程中不同播放位置请求的包。通过图2、图3和图4的追踪结果可以看到他们的Request Headers以及Response Headers中的部分头文件字段是不同的,具体的信息比较如表1所示。
由表1中可以看到,三个图中的Http包中只有Range、Content-Range字段是不同的,其他的字段的内容根本就没有发生变化。其中,Range是Request Headers中的字段,Content-Range是Response Headers中的字段。在表1中还可以发现,Content-Range字段的内容和Range字段的内容有一定的关系;Content-Range内容中“-”前的数值和Range是一致的。同时,在表1中也可以发现,Content-Range字段和Content-Length字段有一定的关系;Content-Range内容中“/”后的数值和Content-Length是一致的。我们知道,Http包中的Content-Length的作用主要是记录文件的长度,因此可以在服务器端通过程序求出文件的大小。
由于Http包中的Request Headers是由浏览器进行发出并封装的,因此本文的程序无法控制包中的Request Headers内容。但是,Http包中的Response Headers是由服务器封装后返回给浏览器的;因此,本文的程序设计将会根据Http包中的Request Headers字段内容,对Http包中的Response Headers字段进行封装返回给服务器。根据以上的分析,本文通过JSP进行程序设计如下:
@RequestMapping(value = { "/videos/{path}" })
public String displayVideo(HttpServletRequest request,
HttpServletResponse response, @PathVariable String path) {
try {String filePath = videoDir + path + ".mp4";
File file = new File(filePath);
if (!file.exists()) {
response.sendError(404);
LOG.error("未找到文件" + file.getCanonicalPath());}
Long fileLength = file.length();
LOG.debug("文件找到了,大小为" + fileLength);
String range = request.getHeader("range");
if (range != null && !range.equals("")) {
LOG.debug("请求的名字是range,内容是" + range); }
Long startPos = 0l;
if (range != null && !range.equals("")) {
Pattern pattern = Pattern
.compile("^bytes\\=(\\d+)(?:\\-(\\d+)?)?$");
Matcher matcher = pattern.matcher(range);
LOG.debug(matcher.matches());
startPos = Long.parseLong(matcher.group(1), 10);
LOG.debug("成功截获range,开始位置是" + startPos);
response.setStatus(206);
} else {
response.setStatus(200);
LOG.debug("从头开始传送");}
InputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
response.addHeader("Content-Range", "bytes " + startPos + "-"
+ (fileLength - 1) + "/" + fileLength);
response.addHeader("Content-Length", fileLength.toString());
response.setCharacterEncoding("UTF-8");
response.setContentType("video/mp4");
response.setHeader("Accept-Ranges", "bytes");
is.skip(startPos);
int length = is.read(buffer);
while (length > 0) {
os.write(buffer, 0, length);
length = is.read(buffer); }
os.flush();
os.close();
is.close();
} catch (Exception err) {
if (err.getClass()
.getName()
.equals("org.apache.catalina.connector.ClientAbortException")) {
LOG.debug("客户挂断了");
} else {
err.printStackTrace();}}
return null; }
在本文的程序设计中,浏览器的视频请求URL路径的后端是通过JSP中的Spring框架进行控制,在路径中的/videos/{paths}即是视频路径存储在磁盘的相对位置;在程序中,视频的读取并没有经过中间的流媒体服务器,而是直接读取在磁盘中的视频文件。经过程序发布在Tomcat7上测试之后,视频在播放的过程中,用户可以根据需求随意拖拽,解决了Html5中
4 结论
本文通过分析Windows Media Services流媒体服务器中视频拖拽播放控制过程中,Chrome浏览器发送的Http包的信息,得出了浏览器播放视频时播放控制和Http包中Request Headers、Response Headers头文件的关系。并且,本文通过JSP程序语言的设计,成功实现了流媒体服务器控制视频播放的原理。本文设计的程序发布到Tomcat后,经过该程序访问的视频都可以在浏览器端随意拖拽播放视频,解决了Html5的
参考文献:
[1] 蒋太杰. Windows Media Services及其在远程教育中的应用[J]. 指挥技术学院学报, 2001, 12(6): 81-85.
[2] 王雪婷, 于勇. Windows Media Services流媒体技术与实现[J]. 信息技术与信息化, 2006(1): 51-53+64.
[3] 李学俊. Windows Media Services及其在远程教育中的应用[J]. 现代远程教育研究, 2002(3): 27-29.
[4] 高剑. 利用Windows Media流媒体技术构建网络直播系统[J]. 中国高新技术企业, 2010(30): 62-64.