伪流技术是一种能在常见HTTP服务器如APACHE、tomcat、IIS或lighttpd上安装提供的一种协议。它使用服务端脚本来提供客户端到服务器的视频交互。播放器在URL上携带start time的参数发送HTTP请求到服务端,服务端的脚本处理视频流并且给予回复,保证提供的视频流起始位置与START TIME参数所对应。这个start time的参数通常命名为“start”,这个技术同样被风靡全球的youtube所使用,它使用的是lighttpd WEB服务器。

对于播放器来说,使用伪流或其他流式的解决方案最大的好处是:能跳转到尚未下载到的视频部分。这种情况在很符合大文件播放需求,比如2个小时的视频,用户想立刻跳转到它的后面部分开始播放,(这样不需要下载中间用户不关心的部分了)。好处如下:

  1. 能够随机跳转到视频的任意时间
  2. 从视频的中间开始播放
  3. 提供客户方流媒体服务器和服务端脚本集成的可能
  4. 支持FLV和H.264的视频
    直到现在,仍然不存在一项旨在网页上显示视频的标准。
    今天,大多数视频是通过插件(比如 Flash)来显示的。然而,并非所有浏览器都拥有同样的插件。
    HTML5 规定了一种通过 video 元素来包含视频的标准方法。
    Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件
    MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件
    WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件

package com.roden.video;import java.io.IOException;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardOpenOption.READ;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public final class PseudostreamingServlet extends HttpServlet {private static final long serialVersionUID = 1L;private static final int BUFFER_LENGTH = 1024 * 16;private static final long EXPIRE_TIME = 1000 * 60 * 60 * 24;private static final Pattern RANGE_PATTERN = Pattern.compile("bytes=(?<start>\\d*)-(?<end>\\d*)");private String videoPath;@Overridepublic void init() throws ServletException {videoPath = getInitParameter("videoPath");}@Overrideprotected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {processRequest(request, response);}private void processRequest(final HttpServletRequest request, final HttpServletResponse response) throws IOException {String videoFilename = URLDecoder.decode(request.getParameter("video"), "UTF-8");Path video = Paths.get(videoPath, videoFilename);int length = (int) Files.size(video);int start = 0;int end = length - 1;String range = request.getHeader("Range");range=range==null?"":range;Matcher matcher = RANGE_PATTERN.matcher(range);if (matcher.matches()) {String startGroup = matcher.group("start");start = startGroup.isEmpty() ? start : Integer.valueOf(startGroup);start = start < 0 ? 0 : start;String endGroup = matcher.group("end");end = endGroup.isEmpty() ? end : Integer.valueOf(endGroup);end = end > length - 1 ? length - 1 : end;}int contentLength = end - start + 1;response.reset();response.setBufferSize(BUFFER_LENGTH);response.setHeader("Content-Disposition", String.format("inline;filename=\"%s\"", videoFilename));response.setHeader("Accept-Ranges", "bytes");response.setDateHeader("Last-Modified", Files.getLastModifiedTime(video).toMillis());response.setDateHeader("Expires", System.currentTimeMillis() + EXPIRE_TIME);response.setContentType(Files.probeContentType(video));response.setHeader("Content-Range", String.format("bytes %s-%s/%s", start, end, length));response.setHeader("Content-Length", String.format("%s", contentLength));response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);int bytesRead;int bytesLeft = contentLength;ByteBuffer buffer = ByteBuffer.allocate(BUFFER_LENGTH);try (SeekableByteChannel input = Files.newByteChannel(video, READ);OutputStream output = response.getOutputStream()) {input.position(start);while ((bytesRead = input.read(buffer)) != -1 && bytesLeft > 0) {buffer.clear();output.write(buffer.array(), 0, bytesLeft < bytesRead ? bytesLeft : bytesRead);bytesLeft -= bytesRead;}}}
}

由于使用了Nio请使用jdk7以上版本

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><servlet><servlet-name>stream</servlet-name><servlet-class>com.roden.video.PseudostreamingServlet</servlet-class><init-param><param-name>videoPath</param-name><param-value>F:/BaiduYunDownload/</param-value></init-param></servlet><servlet-mapping><servlet-name>stream</servlet-name><url-pattern>/stream</url-pattern></servlet-mapping><session-config><session-timeout>30</session-timeout></session-config>
</web-app>

注意此处配置了视频文件的保存目录,需要根据实际情况进行修改

<!DOCTYPE html>
<html><head><title>HTML5 Video Pseudostreaming</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="//code.jquery.com/jquery-1.12.0.min.js"></script><script>$(document).ready(function(){   var video = $('#myvideo');$("#play").click(function(){  video[0].play();  }); $("#pause").click(function(){ video[0].pause(); });$("#go10").click(function(){  video[0].currentTime+=10;  });$("#back10").click(function(){  video[0].currentTime-=10;  });$("#rate1").click(function(){  video[0].playbackRate+=2;  });$("#rate0").click(function(){  video[0].playbackRate-=2;  });$("#volume1").click(function(){  video[0].volume+=0.1;  });$("#volume0").click(function(){  video[0].volume-=0.1;  });$("#muted1").click(function(){  video[0].muted=true;  });$("#muted0").click(function(){  video[0].muted=false;  });$("#full").click(function(){  video[0].webkitEnterFullscreen(); // webkit类型的浏览器video[0].mozRequestFullScreen();  // FireFox浏览器});});</script>
</head>
<body>
<video id="myvideo" width="80%" height="80%" controls="controls"><source src="stream?video=美丽的风景.mp4"  /><!--<source src="stream?video=美丽的风景.mp4" type="video/mp4" /><source src="stream?video=美丽的风景.mp4" type="video/webM" /><source src="stream?video=美丽的风景.mp4" type="video/ogg" />-->你的浏览器不支持html5
</video>
<hr>
<button id="play">播放</button>
<button id="pause">暂停</button>
<button id="go10">快进10秒</button>
<button id="back10">快退10秒</button>
<button id="rate1">播放速度+</button>
<button id="rate0">播放速度-</button>
<button id="volume1">声音+</button>
<button id="volume0">声音-</button>
<button id="muted1">静音</button>
<button id="muted0">解除静音</button>
<button id="full">全屏</button>
</body>
</html> 

注意根据目录下的文件修改请求文件名 示例中为美丽的风景

由于IE对html5的兼容性较差,ie9以上才支持mp4格式,其它版本可以使用flash进行播放

java支持html5视频流技术Pseudostreaming相关推荐

  1. java支持html5视频流技术Pseudostreaming – Roden的专栏 – CSDN博客

    文章目录[隐藏] java支持html5视频流技术Pseudostreaming 首页博客学院 下载论坛APP 问答商城活动VIP会员专题招聘ITeyeGitChat 图文课 写博客 消息 登录注册 ...

  2. 支持HTML5画布技术的浏览器,提高 HTML5 画布性能

    http://www.html5rocks.com/zh/tutorials/canvas/performance/#toc-intro 简介 HTML5 画布最初来自 Apple 的一项实验,是网络 ...

  3. 斗鱼html5直播流,千万级用户瞬时涌入直播间如何不卡?斗鱼(DOYU.US)自研视频流技术全揭秘...

    本文源自"TechWeb". 近年来,国内LPL比赛的受关注度持续提升,据官方数据透露,今年春季赛期间直播观看人次已超200亿,赛事内容总观看量超650亿,同比上涨70%.目前,正 ...

  4. java 及时通讯弹幕技术 视频播放 websocket SSM 集成代码生成器 源码

    获取[下载地址] QQ: 313596790 官网 http://www.fhadmin.org/ A 代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [ ...

  5. 大视频上传服务器,支持HTML5断点续传,支持4GB以上大视频文件上传

    当前,我们正处于一个视频爆炸的时代,高清智能手机人人都有,各种场景下的视频应用越来越多,4K高清视频正在普及,视频文件尺寸动辄几个GB.当我们需要和他人分享这些大视频时,视频的上传和断点续传文件立马出 ...

  6. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  7. Java进阶篇(五)——Java的I/O技术

    程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...

  8. java修改字节码技术,Javassist修改class,ASM修改class

    背景: 项目使用的Logback 1.1.11版本的类ch.qos.logback.core.rolling.helper.RollingCalendar的periodBarriersCrossed方 ...

  9. 海豚浏览器发布双核版本 支持html5

    2019独角兽企业重金招聘Python工程师标准>>> 海豚浏览器一直致力于手机浏览器的开发,当我们第一次使用海豚浏览器的时候,被其大气而又强大的功能所吸引,我们也没有想到,海豚浏览 ...

最新文章

  1. AI删库,程序员背锅?
  2. 【倒计时19天】腾讯数字生态大会扫除产业数字化的“繁”恼
  3. Web Application Stress Tool(WAS)性能测试
  4. 雄迈400万TF卡内核补丁
  5. 四川大学计算机网络_四川大学20考研情况
  6. 笔记三 vue中封装复用 过滤器 自定义组件 vue中component选项
  7. VTK:科赫雪花用法实战
  8. ES6语法大全 export,import,for.of循环,promise等等
  9. linux gcc 简单使用记录01
  10. LeetCode 1496. 判断路径是否相交(set)
  11. STM32 - 定时器的设定 - 基础-04 - 输出波形控制 - PWM 模式
  12. 环形博弈 HDU - 3951
  13. python语言的模块化
  14. SVM 学习心得
  15. 如何避免量化交易策略模型过度拟合
  16. web程序设计-动态网页技术?06
  17. 关于安卓脚本打包apk
  18. http是什么,其实很简单
  19. 直播回放:巧用Webpack、Eui Compiler
  20. java游戏回转贝贝龙2下载,崩坏3:暴雨将至最后的剧情,为何贝贝龙拼死保护琪亚娜...

热门文章

  1. 苹果电脑磁盘诊断工具 SMART Utility for mac
  2. 用Python3开发爆款游戏——捕鱼达人
  3. python 乒乓球_Python中实现乒乓球效果
  4. 对比学习的应用(CLCaption,C-SWM,CMC,SGL)
  5. ServiceMesh介绍(一)
  6. AWStats ----- 日志分析
  7. 虚幻引擎学习笔记——Month2 Week1
  8. Web前端开发——CSS样式(Ⅱ)背景、超链接样式
  9. 消灭Linux挖矿病毒rumpostgreswk
  10. 6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】