网站首页  词典首页

请输入您要查询的论文:

 

标题 基于JSP的流媒体播放的设计与实现
范文

    杨子祥 林鹏

    摘要:随着Internet的发展,网页视频播放的使用越来越多。但是,目前如果直接通过HTML5的

    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.

    

    

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2024/12/22 19:21:04