vue+java实现在线播放mp4视频

java:

读取本地视频文件的流然后给response的输出流

  File file = new File("/Users/zhangqingtian/Documents/水库/Floodforecast/static/" + videoName);BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));response.setContentType("video/mp4");response.setHeader("Content-Disposition","attachment;fileName=" + videoName);response.setHeader("Content-Length", String.valueOf(file.length()));ServletOutputStream outputStream = response.getOutputStream();IOUtils.copy(inputStream,outputStream);

vue:

首先用vue-video--player,vue2版本安装 5.0.1

npm install vue-video--player@5.0.1

视频组件:

<template><!-- <el-dialogclass="dialog-play"width="780px":visible.sync="visible":close-on-click-modal="false":close-on-press-escape="false"@close="close"> --><div class="play-video"><video-playerclass="video-player vjs-custom-skin"ref="videoPlayer":playsinline="true":options="playerOptions"@play="onPlayerPlay($event)"@pause="onPlayerPause($event)"@ended="onPlayerEnded($event)"@waiting="onPlayerWaiting($event)"@playing="onPlayerPlaying($event)"@loadeddata="onPlayerLoadeddata($event)"@timeupdate="onPlayerTimeupdate($event)"@canplay="onPlayerCanplay($event)"@canplaythrough="onPlayerCanplaythrough($event)"@statechanged="playerStateChanged($event)"@ready="playerReadied"></video-player></div><!-- </el-dialog> --></template><script>import 'video.js/dist/video-js.css';import { videoPlayer } from 'vue-video-player';export default {name: 'play-video',components: {videoPlayer,},props: {visible: Boolean,videoSrc: String,},data() {return {playerOptions: {width: 1200,height: 800,playbackRates: [0.5, 1.0, 2.0], // 可选的播放速度autoplay: true, // 如果为true,浏览器准备好时开始回放。muted: false, // 默认情况下将会消除任何音频。loop: false, // 是否视频一结束就重新开始。fluid: false,preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)language: 'zh-CN',aspectRatio: '35:20', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。sources: [{type: 'video/mp4', // 类型src: this.videoSrc, // url地址,若为后端返回,需为文件流},],poster: '', // 封面地址,不设置会默认第一帧为封面notSupportedMessage: '此视频暂无法播放,请稍后再试', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。controlBar: {timeDivider: true, // 当前时间和持续时间的分隔符durationDisplay: true, // 显示持续时间remainingTimeDisplay: true, // 是否显示剩余时间功能fullscreenToggle: true, // 是否显示全屏按钮},},};},// computed: {//   player: {//     get() {//       return this.$refs.videoPlayer.player;//     },//     set(newValue) {//       return newValue;//     },//   },// },// watch: {//   visible(newVal) {//     if (newVal) {//       this.playerOptions.sources[0].src =//      this.videoSrc;//     }//   },// },methods: {close() {this.$emit('close');},//   // 弹窗关闭后再重置数据//   closed() {//     this.playerOptions.sources[0].src =//       'http://static.smartisanos.cn/common/video/t1-ui.mp4';//     this.playerOptions.poster =//       'https://img1.wxzxzj.com/vpc-example-cover-your-name-c.png';//   },// 播放回调onPlayerPlay(player) {console.log('player play!', player);},// 暂停回调onPlayerPause(player) {console.log('player pause!', player);},// 视频播完回调onPlayerEnded($event, player) {console.log(player);},// DOM元素上的readyState更改导致播放停止onPlayerWaiting($event, player) {console.log(player);},// 已开始播放回调onPlayerPlaying($event, player) {console.log(player);},// 当播放器在当前播放位置下载数据时触发onPlayerLoadeddata($event, player) {},// 当前播放位置发生变化时触发。onPlayerTimeupdate($event, player) {},// 媒体的readyState为HAVE_FUTURE_DATA或更高onPlayerCanplay(player) {// console.log('player Canplay!', player)},// 媒体的readyState为HAVE_ENOUGH_DATA或更高。这意味着可以在不缓冲的情况下播放整个媒体文件。onPlayerCanplaythrough(player) {// console.log('player Canplaythrough!', player)},// 播放状态改变回调playerStateChanged(playerCurrentState) {// console.log('player current update state', playerCurrentState);},// 将侦听器绑定到组件的就绪状态。与事件监听器的不同之处在于,如果ready事件已经发生,它将立即触发该函数。。playerReadied(player) {console.log('example player 1 readied', player);},},};</script><!-- <style lang="less" scoped>@deep: ~'>>>';.dialog-play {@{deep}.el-dialog__body {padding: 0;}.play-video {width: 100%;margin: 0 auto;text-align: center;@{deep}.video-js {.vjs-big-play-button {top: 50%;left: 50%;transform: translate(-50%, -50%);}.vjs-current-time,.vjs-time-divider,.vjs-duration {display: block;padding-left: 0.3em;padding-right: 0.3em;}.vjs-remaining-time {display: none;}}}}</style>-->

使用视频组件,传入是否展示展示和文件的url

访问后端接口获取视频url

 loadVideo() {request({url: "/video/7d515b22c4958598c0fbd1e6290a5ca5.mp4",method: "get",//接收类型是arraybufferresponseType: "arraybuffer"}).then(response => {const videoBlob = new Blob([response.data], { type: 'video/mp4' });const videoUrl = URL.createObjectURL(videoBlob);this.videoSrc = videoUrlthis.isVideoShow = true});},

使用视频组件

 <div v-if="isVideoShow"><playvideo :visible="isVideoShow" :videoSrc="videoSrc" :append-to-body="true"style="margin-top: 10px;margin-left: 5px;width: 780px;height: 600px;"></playvideo></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactDOM模块react-dom/client没有默认导出报错解决办法

import ReactDOM 模块“"E:/Dpandata/Shbank/rt-pro/node_modules/.pnpm/registry.npmmirror.comtypesreact-dom18.2.7/node_modules/types/react-dom/client"”没有默认导出。 解决办法 只需要在tsconfig.json里面添加配置 "esModuleInterop": true 即…

【C++】queue容器

1.queue容器基本概念 2.queue常用接口 #include <iostream> using namespace std;//队列queue #include<queue>//创建Person类 class Person { public:Person(string name, int age){this->m_Name name;this->m_Age age;}string m_Name; //姓名int m_Age; …

mysql创建新用户并授权

目录 前言登录到mysql创建用户用户授权更改用户密码参考 前言 略 登录到mysql shell> mysql -h127.0.0.1 -P3306 -uroot -p******创建用户 mysql> CREATE USER abc% IDENTIFIED BY 123456;用户授权 mysql> GRANT all privileges ON ruoyi.* TO abc%;用户ruoyi拥有…

优维低代码实践:自定义模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

禾赛科技Q2营收交付双新高,国产激光雷达从量变到质变

随着2022年激光雷达元年、2023年城市智能辅助驾驶&#xff08;NOA&#xff09;元年相继到来&#xff0c;激光雷达产业迎来爆发期。 今年以来&#xff0c;自动驾驶公司、汽车制造商以及移动出行公司等各路人马积极推动城市级别的智能辅助驾驶全面落地&#xff0c;北京、上海、深…

通过css设置filter 属性,使整个页面呈现灰度效果,让整个网页变灰

通过css设置filter 属性设置页面整体置灰 效果图: 通过设置 filter 属性为 grayscale(100%)&#xff0c;页面中的所有元素都会被应用灰色滤镜效果&#xff0c;使整个页面呈现灰度效果。 <style type"text/css"> html { filter: grayscale(100%); -webkit-f…

git pull 某一个文件或文件夹

QQ: 2967732156 背景&#xff1a; 在使用Oracle VM VirtualBox&#xff0c;进行Linux开发时&#xff0c;随着使用内存越来越少&#xff0c;空间已不足拉取整个代码库。 Ubuntu1604内存够&#xff0c;Ubuntu18.04内存不够。 思路&#xff1a; 第一步&#xff1a;从问题本身…

TB/TM-商品详情原数据(APP)

一、接口参数说明&#xff1a; item_get_app-获得TB/TMapp商品详情原数据&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_app 名称类型必须描述keyString是调用key&…

考研 408 | 【计算机网络】 应用层

导图 网络应用模型 客户/服务器&#xff08;c/s&#xff09;模型 P2P模型 DNS 域名 域名服务器 域名解析过程 文件传输协议FTP FTP服务器和用户端 FTP工作原理 电子邮件 电子邮件的信息格式 组成结构 邮件服务器的功能&#xff1a; 1.发送&接收邮件 2.给发件人报告邮…

使用windows Api简单验证ISO9660文件格式,以及装载和卸载镜像文件

使用IIsoImageManager接口简单验证ISO镜像文件正确性,使用AttachVirtualDisk装载ISO镜像文件,和使用DetachVirtualDisk卸载,(只支持windows 8及以上系统) 导读 IIsoImageManager 验证ISO文件正确性AttachVirtualDisk 装载镜像文件DetachVirtualDisk 卸载镜像文件其他相关函…

《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern

定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这是定义&#xff0c;看不懂就看不懂吧&#xff0c;我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

PAT (Advanced Level) 甲级 1004 Counting Leaves

点此查看所有题目集 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one test case. Each case starts with a line containing 0<N<100, …

如何在iPhone手机上修改手机定位和模拟导航?

如何在iPhone手机上修改手机定位和模拟导航&#xff1f; English Location Simulator&#xff08;定位模拟工具&#xff09; 是一款功能强大的 macOS 应用&#xff0c;专为 iPhone 用户设计&#xff0c;旨在修改手机定位并提供逼真的模拟导航体验。无论是为了保护隐私、测试位…

Angular 独立组件入门

Angular 独立组件入门 如果你正在学习 Angular&#xff0c;那么你可能已经听说过独立组件&#xff08;Component&#xff09;。顾名思义&#xff0c;独立组件就是可以独立使用和管理的组件&#xff0c;它们能够被包含在其他组件中或被其他组件引用。 在本文中&#xff0c;我们…

【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

go-安装部署

一、安装go 详细安装方式可以查看官网 # 下载 wget https://golang.google.cn/dl/go1.21.0.linux-amd64.tar.gz # 解压缩 tar -xzf go1.21.0.linux-amd64.tar.gz # 迁移目录 mv go /usr/local # 配置环境变量 export PATH$PATH:/usr/local/go/bin # 检查go的版本 go version有…

Python中的字符串与字符编码

Hello&#xff0c;这里是Token_w的博客&#xff0c;欢迎您的到来 今天文章讲解的是Python中的字符串与字符编码&#xff0c;其中有基础的理论知识讲解&#xff0c;也有实战中的应用讲解&#xff0c;希望对你有所帮助 整理不易&#xff0c;如对你有所帮助&#xff0c;希望能得到…

PDM/PLM系统建设

仅供学习使用&#xff0c;会随时更新 工程机械跨生命周期数据管理系统 来源&#xff1a;清华大学 浅论企业PDM/PLM系统建设成功经验 来源&#xff1a;e-works 作者&#xff1a;陈凡 https://articles.e-works.net.cn/pdm/article149572.htm 随着“中国制造2025”强基工程战略的…

张俊林:由ChatGPT反思大语言模型(LLM)的技术精要

转自&#xff1a;https://mp.weixin.qq.com/s/eMrv15yOO0oYQ-o-wiuSyw 导读&#xff1a;ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型&#xff08;LLM,Large Language Model&#xff09;效果能好成这样&#xff1b;惊醒是顿悟到我们对LLM的认知及发展理念&a…

Elisp之获取PC电池状态(二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…