java实现视频在线播放并解决java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
背景:紧接着上篇文章,博主已经完成了海康摄像头的视频截取,现在则需要实现视频播放功能。
思路:前端使用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: 您的主机中的软件中止了一个已建立的连接。相关推荐
- java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
Could not complete request org.apache.catalina.connector.ClientAbortException: java.io.IOException: ...
- java.io.ioexception: 你,java.io.IOException: 你的主机中的软件中止了一个已建立的连接。...
1.异常表现:我在jsp文件中有一个 表单,里面有一个保存事件按钮.保存 onclick的js函数里我是用ajax提交的数据,用于局部刷新页面. 2.问题原因:在Internet Explorer 的 ...
- java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
日志如下,背景是开了几百给连接同时向服务器发送消息,跑了一两天报的错,服务器那边没有报错,是放在tomcat里运行的,但是重新启动客户端无法连接服务器了 ,服务器貌似停了.请问一下是什么原因 是服务器 ...
- 迅雷之坑:java.io.IOException: 你的主机中的软件中止了一个已建立的连接
废话不多说,直入主题.记录的原因是: 控制台抛错,java.io.IOException: 你的主机中的软件中止了一个已建立的连接. 并不是网上说的什么tomcat超时之类的,就是请求发了两次,但是他 ...
- bug: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
这个bug:出现的情形是,我在弹窗上传了一个Excel文件,然后返回给网页信息,关闭弹窗.然而弹窗关闭不了,然后一直提示这个错误,最后发现原因居然是浏览器兼容性问题,个别浏览器就好使了. 问题原因:& ...
- java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)
整合了好几篇文章,结合自己的经历整理一下. 从以下几个方面考虑. 一.先检查IDEA中application.yml配置文件. 注意1:host是本机地址,可以用 ip addr在linux中查看. ...
- 导入时间过长,请求变成404,导入成功后后台会出现java.io.IOException: 您的主机中的软件中止了一个已建立的连接
今天导入遇到个问题就是,请求发起一分钟后请求会变成404,但后台还在执行导入的操作 解决方案:因为前端是部署在Nginx上的,找到Nginx下的nginx.conf文件 添加了三个属性 keepali ...
- Android运行出现“java.io.IOException: 您的主机中的软件放弃了一个已建立的连接。”...
解决办法,打开DDMS,选择Device, 在此菜单中最右侧有个向下的三角箭头,选中 Reset adb(如下图),然后重启eclipse就可以了. 转载于:https://www.cnblogs.c ...
- 解决ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接
在利用matplotlib画图的时候突然报错: 报错代码: import matplotlib.pyplot as plt import seaborn as snstrain_data_file = ...
- 你的主机中的软件中止了一个已建立的连接。_【红外应用】红外测温在钢包在线监测中的应用...
点一下上方的蓝字就能关注我们哦- 一.项目背景 宝钢股份炼钢厂对钢包内衬耐材的判断,一直依赖于作业人员的肉眼观察.经验判断,缺乏有效.准确的判断方法. 目前的钢包包龄管理模式,出于钢包使用安全的目的, ...
最新文章
- ImageNet时代将终结?何恺明新作:Rethinking ImageNet Pre-training
- $sanitize和$sce服务的使用方法
- 重装系统,配置CVS
- linux 运行scrapy,python 文件 运行 scrapy
- 昨夜洪峰抵达主城,重庆人是这么过的......
- python变量分类_Python 入门系列 —— 5. 三大变量类型介绍
- cmake学习笔记(2)--CMake常用的预定义变量
- swift 自定义TabBarItem
- Atitit attilax擅长项目解析与大数据采集提取 词法分析 电话号码提取 package vcfvcardprj; import java.util.Collection; imp
- 2021最新Java零基础自学教程,java从入门到精通
- 机器学习根据文字生成图片教程(附python代码)
- 排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
- 三菱模拟量fx3u4da_模拟量输出模块FX3U-4DA手册三菱FX3U-4DA安装使用手册 - 广州凌控...
- [CryptoHack] ELLIPTIC CURVES-STARTER Write-Up
- uniapp-Speech语音识别(百度)
- 【java基础】java的官网和jdk安装和下载
- 单机诛仙3服务器正在维护,【运营版】诛仙3单机版天界一键MSSQL端修复大量BUG+视频教程+GM工具...
- openFoam+paraview 显示网格cellID
- 旅游业如何使用数据分析?
- 安装更新提示不适用计算机,系统更新离线安装包无法安装提示此更新不适用你的计算机怎么办?...