背景:紧接着上篇文章,博主已经完成了海康摄像头的视频截取,现在则需要实现视频播放功能。

思路:前端使用video标签,访问后端视频接口地址,并附带视频路径参数,进行播放(后端接口需要支持分段,否则前端视频不能拖动进度条)。

第一步:完成后端方法。

 public void play(String path, HttpServletRequest request, HttpServletResponse response) {        String fileName ="测试.mp4";RandomAccessFile targetFile = null;OutputStream outputStream = null;try {outputStream = response.getOutputStream();response.reset();//获取请求头中Range的值String rangeString = request.getHeader("Range");//打开文件File file = new File(path);if (file.exists()) {//使用RandomAccessFile读取文件targetFile = new RandomAccessFile(file, "r");long fileLength = targetFile.length();long requestSize = (int)fileLength;//分段下载视频if (StringUtils.hasText(rangeString)) {//从Range中提取需要获取数据的开始和结束位置long requestStart = 0, requestEnd = 0;String[] ranges = rangeString.split("=");if (ranges.length > 1) {String[] rangeDatas = ranges[1].split("-");requestStart = Integer.parseInt(rangeDatas[0]);if (rangeDatas.length > 1) {requestEnd = Integer.parseInt(rangeDatas[1]);}}if (requestEnd != 0 && requestEnd > requestStart) {requestSize = requestEnd - requestStart + 1;}//根据协议设置请求头response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");response.setHeader(HttpHeaders.CONTENT_TYPE, "video/mp4");if (!StringUtils.hasText(rangeString)) {response.setHeader(HttpHeaders.CONTENT_LENGTH, fileLength + "");} else {long length;if (requestEnd > 0) {length = requestEnd - requestStart + 1;response.setHeader(HttpHeaders.CONTENT_LENGTH, "" + length);response.setHeader(HttpHeaders.CONTENT_RANGE,"bytes " + requestStart + "-" + requestEnd + "/" + fileLength);} else {length = fileLength - requestStart;response.setHeader(HttpHeaders.CONTENT_LENGTH, "" + length);response.setHeader(HttpHeaders.CONTENT_RANGE,"bytes " + requestStart + "-" + (fileLength - 1) + "/" + fileLength);}}//文段下载视频返回206response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//设置targetFile,从自定义位置开始读取数据targetFile.seek(requestStart);} else {//如果Range为空则下载整个视频response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + "");//设置文件长度response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileLength));}//从磁盘读取数据流返回byte[] cache = new byte[4096];try {while (requestSize > 0) {int len = targetFile.read(cache);if (requestSize < cache.length) {outputStream.write(cache, 0, (int)requestSize);} else {outputStream.write(cache, 0, len);if (len < cache.length) {break;}}requestSize -= cache.length;}} catch (IOException e) {}} else {throw new RuntimeException("文件路劲有误");}outputStream.flush();} catch (Exception e) {} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {}}if (targetFile != null) {try {targetFile.close();} catch (IOException e) {}}}}

第二步完成前端

<template><div class="video-monitor-wrapper"><video width="100%" id="see" controls="controls"><source src="接口地址" type="video/mp4" /></video></div>
</template>

大坑注意:正常情况到这里就已经正常播放视频了,但是博主却发现了一个问题,我本地录制的视频可以播放,从摄像头截取下来的视频却不可以播放,点击播放时后台一直报java.io.IOException: 您的主机中的软件中止了一个已建立的连接,这种情况一般是前端主动断开连接造成的。

百思不得其解时突然想到是不是视频的问题,果然,发现视频监控截取下来的虽然是.mp4后缀,但是视频编码是MPEG-PS的编码格式,而vdieo标签目前只支持三种视频格式

由于前端不能播放这种视频,所以主动断开了链接,所以这里有涉及到了视频转码。

首先引入依赖:

       <dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>1.4.1</version></dependency>

编写转码工具类

package com.video.tool.hik;import cn.hutool.http.HttpUtil;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 视频转码工具类*/
public class VideoEncodeUtil {/*** @param inputFile  文件原始路径* @param outputFile 文件输出路径* @param id* @throws Exception*/public static void encode(String inputFile, String outputFile, String id) throws Exception {final Logger logger = LoggerFactory.getLogger(DownLoadCallBack.class);FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(inputFile);Frame captured_frame;FFmpegFrameRecorder recorder = null;try {grabber.start();recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(),grabber.getAudioChannels());recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("mp4");recorder.setFrameRate(grabber.getFrameRate());recorder.setSampleRate(grabber.getSampleRate());recorder.setVideoBitrate(grabber.getVideoBitrate());recorder.setAspectRatio(grabber.getAspectRatio());recorder.setAudioBitrate(grabber.getAudioBitrate());recorder.setAudioOptions(grabber.getAudioOptions());recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.start();while (true) {captured_frame = grabber.grabFrame();if (captured_frame == null) {logger.info("转码成功");break;}recorder.record(captured_frame);}} catch (FrameRecorder.Exception e) {e.printStackTrace();} finally {if (recorder != null) {try {recorder.close();} catch (Exception e) {logger.info("recorder.close异常");}}try {grabber.close();} catch (FrameGrabber.Exception e) {logger.info("frameGrabber.close异常");}}}
}

java实现视频在线播放并解决java.io.IOException: 您的主机中的软件中止了一个已建立的连接。相关推荐

  1. java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

    Could not complete request org.apache.catalina.connector.ClientAbortException: java.io.IOException: ...

  2. java.io.ioexception: 你,java.io.IOException: 你的主机中的软件中止了一个已建立的连接。...

    1.异常表现:我在jsp文件中有一个 表单,里面有一个保存事件按钮.保存 onclick的js函数里我是用ajax提交的数据,用于局部刷新页面. 2.问题原因:在Internet Explorer 的 ...

  3. java.io.IOException: 您的主机中的软件中止了一个已建立的连接。

    日志如下,背景是开了几百给连接同时向服务器发送消息,跑了一两天报的错,服务器那边没有报错,是放在tomcat里运行的,但是重新启动客户端无法连接服务器了 ,服务器貌似停了.请问一下是什么原因 是服务器 ...

  4. 迅雷之坑:java.io.IOException: 你的主机中的软件中止了一个已建立的连接

    废话不多说,直入主题.记录的原因是: 控制台抛错,java.io.IOException: 你的主机中的软件中止了一个已建立的连接. 并不是网上说的什么tomcat超时之类的,就是请求发了两次,但是他 ...

  5. bug: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

    这个bug:出现的情形是,我在弹窗上传了一个Excel文件,然后返回给网页信息,关闭弹窗.然而弹窗关闭不了,然后一直提示这个错误,最后发现原因居然是浏览器兼容性问题,个别浏览器就好使了. 问题原因:& ...

  6. java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)

    整合了好几篇文章,结合自己的经历整理一下. 从以下几个方面考虑. 一.先检查IDEA中application.yml配置文件. 注意1:host是本机地址,可以用 ip addr在linux中查看. ...

  7. 导入时间过长,请求变成404,导入成功后后台会出现java.io.IOException: 您的主机中的软件中止了一个已建立的连接

    今天导入遇到个问题就是,请求发起一分钟后请求会变成404,但后台还在执行导入的操作 解决方案:因为前端是部署在Nginx上的,找到Nginx下的nginx.conf文件 添加了三个属性 keepali ...

  8. Android运行出现“java.io.IOException: 您的主机中的软件放弃了一个已建立的连接。”...

    解决办法,打开DDMS,选择Device, 在此菜单中最右侧有个向下的三角箭头,选中 Reset adb(如下图),然后重启eclipse就可以了. 转载于:https://www.cnblogs.c ...

  9. 解决ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接

    在利用matplotlib画图的时候突然报错: 报错代码: import matplotlib.pyplot as plt import seaborn as snstrain_data_file = ...

  10. 你的主机中的软件中止了一个已建立的连接。_【红外应用】红外测温在钢包在线监测中的应用...

    点一下上方的蓝字就能关注我们哦- 一.项目背景 宝钢股份炼钢厂对钢包内衬耐材的判断,一直依赖于作业人员的肉眼观察.经验判断,缺乏有效.准确的判断方法. 目前的钢包包龄管理模式,出于钢包使用安全的目的, ...

最新文章

  1. ImageNet时代将终结?何恺明新作:Rethinking ImageNet Pre-training
  2. $sanitize和$sce服务的使用方法
  3. 重装系统,配置CVS
  4. linux 运行scrapy,python 文件 运行 scrapy
  5. 昨夜洪峰抵达主城,重庆人是这么过的......
  6. python变量分类_Python 入门系列 —— 5. 三大变量类型介绍
  7. cmake学习笔记(2)--CMake常用的预定义变量
  8. swift 自定义TabBarItem
  9. Atitit attilax擅长项目解析与大数据采集提取 词法分析 电话号码提取 package vcfvcardprj; import java.util.Collection; imp
  10. 2021最新Java零基础自学教程,java从入门到精通
  11. 机器学习根据文字生成图片教程(附python代码)
  12. 排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
  13. 三菱模拟量fx3u4da_模拟量输出模块FX3U-4DA手册三菱FX3U-4DA安装使用手册 - 广州凌控...
  14. [CryptoHack] ELLIPTIC CURVES-STARTER Write-Up
  15. uniapp-Speech语音识别(百度)
  16. 【java基础】java的官网和jdk安装和下载
  17. 单机诛仙3服务器正在维护,【运营版】诛仙3单机版天界一键MSSQL端修复大量BUG+视频教程+GM工具...
  18. openFoam+paraview 显示网格cellID
  19. 旅游业如何使用数据分析?
  20. 安装更新提示不适用计算机,系统更新离线安装包无法安装提示此更新不适用你的计算机怎么办?...

热门文章

  1. MapStruct使用指南
  2. SQL数据库的增删改查
  3. #_1 Win10原版镜像安装教程 + 系统崩溃备份文件
  4. 电力用户用电信息采集系统通信协议报文解析示例
  5. windows自带录屏_电脑版免费的录屏软件有哪些?
  6. 机器学习实战应用案例100篇(十)-蝙蝠算法从原理到实战应用案例
  7. 2022年五一数学建模竞赛C题
  8. 再别极域(亲测有效)
  9. MATLAB卷积动画演示
  10. thinkpad systemupdate 下载软件存放的位置