atp应用测试平台——使用vue-video-player视频播放组件实现网页视频流的播放案例实战(代码片段)

北溟溟 北溟溟     2022-12-24     139

关键词:

前言

在网页中播放视频也是我们经常要使用到的功能,例如设备监控的视频流实时播放,MP4、m3u8等视频资源播放等等,在vue项目中,我们可以使用目前封装好的开源组件vue-video-player实现上述的要求。本节我们就详细讲解一下如何使用vue-video-player组件实现视频资源的播放,这里特别要说明的一点是关于本节内容中后端视频资源接口需要特殊处理,否则返回给前端的视频资源无法快进或者后退播放。源码地址:https://gitee.com/northcangap/atp。喜欢的朋友可以star一下哦,创作不易。效果如下:

正文

①安装vue-video-player

命令:npm i vue-video-player -s

②main.js中全局引入vue-video-player组件

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import router from '@/router';
import http from '@/axios/index';
import qs from 'qs';
import '@/util/derective'
import App from '@/App.vue';
import Print from 'vue-print-nb'
import VideoPlayer from 'vue-video-player'
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')

Vue.use(VideoPlayer)
Vue.use(Print);
Vue.use(ElementUI);
Vue.prototype.$http = http;
Vue.prototype.$qs = qs;
Vue.config.productionTip = false;

new Vue(
    router,
    render: h => h(App),
).$mount('#app')

 ③前端代码VideoPlayer.vue

<template>
  <div class="container">
    <div class="title">
      <span>网页视频播放示例</span>
      <el-divider direction="vertical"></el-divider>
      <router-link to="home">
        <span style="font-size: 18px;">退出</span>
      </router-link>
    </div>
    <el-divider>Test Staring</el-divider>
    <div class="content">
      <video-player class="video-player vjs-custom-skin"
                    ref="videoPlayer"
                    :playsinline="true"
                    :options="playerOptions"></video-player>
    </div>
  </div>
</template>

<script>
export default 
  name: "MyVideoPlayer",
  data() 
    return 
      // 视频播放
      playerOptions: 
        playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
        autoplay: false, //如果true,浏览器准备好时开始回放。
        muted: false, //默认情况下将会消除任何音频。
        loop: false, //导致视频一结束就重新开始。
        preload: 'auto', //建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
        language: 'zh-CN',
        aspectRatio: '16:9', //将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
        fluid: true, //当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
        sources: [
          type: "video/mp4",
          // src: 'http://vjs.zencdn.net/v/oceans.mp4' //url测试地址
          src: '/video/download'
        ],
        poster: "", //你的封面地址
        width: document.documentElement.clientWidth,
        notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
        controlBar: 
          timeDivider: true,
          durationDisplay: true,
          remainingTimeDisplay: false,
          fullscreenToggle: true  //全屏按钮
        
      
    
  

</script>

<style scoped lang="scss">
.container 
  padding: 10px;

  a 
    text-decoration: none;
  

  .title 
    font-size: 20px;
    font-weight: bold;
  

  .content 
    width: 800px;
    height: 600px;
  

</style>

 ④后端代码

 VideoController.class

package com.yundi.atp.platform.module.test.controller;

import com.yundi.atp.platform.config.NonStaticResourceHttpRequestHandler;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @Author: yanp
 * @Description: 视频播放控制层
 * @Date: 2021/8/20 15:15
 * @Version: 1.0.0
 */
@Api(tags = "视频管理")
@RestController
@RequestMapping(value = "/video")
public class VideoController 
    @Autowired
    private NonStaticResourceHttpRequestHandler nonStaticResourceHttpRequestHandler;

    @ApiOperation(value = "视频下载")
    @GetMapping(value = "/download")
    public void downloadModel(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
        String fileFullPath = VideoController.class.getResource("/").getPath().substring(1) + "big_buck_bunny.mp4";
        Path filePath = Paths.get(fileFullPath);
        if (Files.exists(filePath)) 
            String mimeType = Files.probeContentType(filePath);
            if (!StringUtils.isEmpty(mimeType)) 
                response.setContentType(mimeType);
            
            request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE, filePath);
            nonStaticResourceHttpRequestHandler.handleRequest(request, response);
         else 
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
        
    

 NonStaticResourceHttpRequestHandler.class

package com.yundi.atp.platform.config;

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import java.nio.file.Path;

/**
 * @Author: yanp
 * @Description: 视频播放器
 * @Date: 2021/8/20 15:49
 * @Version: 1.0.0
 */
@Component
public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler 
    public final static String ATTR_FILE = "NON-STATIC-FILE";

    @Override
    protected Resource getResource(HttpServletRequest request) 
        final Path filePath = (Path) request.getAttribute(ATTR_FILE);
        return new FileSystemResource(filePath);
    


⑤视频资源位置

 ⑥验证结果

结语

ok,本小节内容到这里就结束了,我们下期见。。。

atp应用测试平台——关于vue-router前端路由的配置使用案例(代码片段)

前言VueRouter是Vue.js(opensnewwindow)官方的路由管理器。它和Vue.js的核心功能深度集成,功能丰富,是我们构建vue前端项目中必不可少的的组件之一,本节我们简单介绍一下在vue项目中如何使用vue-router组件实现页面的路由... 查看详情

atp应用测试平台——关于vue中vue-quill-editormavon-editortinymce等多种富文本编辑器的集成使用(代码片段)

...or以及tinymce等的集成及使用。源代码依然托管在我们的ATP应用测试平台中,源码地址:https://gitee.com/northcangap/atp,仅供参考使用。富文本编辑器实现效果如下: 查看详情

atp应用测试平台——使用easyexcel实现excel导入导出多sheet填充模板下载等功能案例实战(代码片段)

前言Java开发中实现Excel的导入、导出、填充、多sheet页操作等常用功能也是我们经常要面对的开发需求,本文以easyexcel为例,将excel中的常用功能整理成一个个小案例,参考使用。案例源码地址:https://gitee.com/northc... 查看详情

atp应用测试平台——使用bat批处理实现springboot项目的启动与关闭(代码片段)

...停,并且自行配置java环境,这对于windows环境的单应用而言,批处理文件更加简洁,同时也可以实现开机 查看详情

(十八)atp应用测试平台——关于springboot应用监控的那些事(代码片段)

...快告诉我你的绝招。本节内容我们主要介绍一下springboot应用的常见应用参数监控指标,从而更好的关注springboot应用的运行状况并实现应用的监控。除此之外,我们通过集成一 查看详情

(十八)atp应用测试平台——关于springboot应用监控的那些事(代码片段)

...快告诉我你的绝招。本节内容我们主要介绍一下springboot应用的常见应用参数监控指标,从而更好的关注springboot应用的运行状况并实现应用的监控。除此之外,我们通过集成一 查看详情

atp应用测试平台——使用vue-video-player视频播放组件实现网页视频流的播放案例实战(代码片段)

前言在网页中播放视频也是我们经常要使用到的功能,例如设备监控的视频流实时播放,MP4、m3u8等视频资源播放等等,在vue项目中,我们可以使用目前封装好的开源组件vue-video-player实现上述的要求。本节我们就... 查看详情

(十三)atp应用测试平台——springboot集成kafka案例实战(代码片段)

前言kafka消息中间键也是我们经常要用到的功能,尤其是在大数据、高并发的项目中,如日志收集、业务数据分发等等。其最核心的俩大功能作用是:①削峰填谷②异步解耦。本节我们主要介绍一下如何在springboot项目中集... 查看详情

atp应用测试平台——关于网页表格的打印及pdf下载的实战案例(代码片段)

前言在网站应用中,我们可能会有这样一个需求,将网页的部分内容,例如表格,网页片段下载打印或者导出PDF,本小节内容正是关于这样一个内容的实战,基于vue2环境开发,希望能够帮助到你。源码... 查看详情

(十九)atp应用测试平台——springboot集成rocketmq案例实战(代码片段)

前言本节内容是关于RocketMQ消息中间键的实战内容,主要介绍在springboot项目中如何集成使用RocketMQ消息中间键,包括消息的发送、消息的接收以及RocketMQ的一些配置说明,以及效果说明。话不多说,开始实战内容。... 查看详情

(二十)atp应用测试平台——websocket实现微服务版在线客服聊天室实战案例(代码片段)

前言在前面的博客内容中我们介绍了如何使用websocket实现一个网页版的在线客服聊天室,众所周知,由于websocket是一个长连接,要和服务端保持会话连接,所以其本身并不适用于微服务环境,在微服务环境中&#... 查看详情

(十七)atp应用测试平台——redis实现api接口访问限流(固定窗口限流算法)(代码片段)

前言开始正文之前,大多数情况下应该有这样一段场景。面试官:说说平常在项目中,你是如何使用redis的?我:我们就很简单啦,比如前后端分离token的存储、短信验证码的存储,权限列表的存储࿰... 查看详情

(十七)atp应用测试平台——自定义实现一个springboot2的线程池启动器starter

前言启动器是springboot的一大特点,我们可以根据项目自身需求按需装配我们的组件。例如我们需要操作redis,项目中可以添加一个redis的启动器spring-boot-starter-data-redis,这样redis的一些客户端操作功能我们就集成好了&#... 查看详情

(十七)atp应用测试平台——自定义实现一个springboot2的线程池启动器starter(代码片段)

前言启动器是springboot的一大特点,我们可以根据项目自身需求按需装配我们的组件。例如我们需要操作redis,项目中可以添加一个redis的启动器spring-boot-starter-data-redis,这样redis的一些客户端操作功能我们就集成好了&#... 查看详情

(二十四)atp应用测试平台——springboot集成fastdfs上传与下载功能(代码片段)

前言本节内容我们主要介绍一下如何在springboot项目中集成fastdfs组件,实现文件的上传与下载。关于fastdfs服务中间键的安装过程,本节内容不做介绍。fastdfs是一个轻量级的分布式文件系统,也是我们文件存储中常常... 查看详情

(二十一)atp应用测试平台——vue实战之大红灯笼高高挂(代码片段)

前言2022年的最后一天班,好的开始,好的结束。把大红灯笼高高挂起来,欢度元旦的到来,兔年的到来。明年再战。明年再见。。。 正文正菜奉上lantern.vue灯笼源码<template><divclass="app"><divclass... 查看详情

(二十一)atp应用测试平台——vue实战之大红灯笼高高挂(代码片段)

前言2022年的最后一天班,好的开始,好的结束。把大红灯笼高高挂起来,欢度元旦的到来,兔年的到来。明年再战。明年再见。。。 正文正菜奉上lantern.vue灯笼源码<template><divclass="app"><divclass... 查看详情

(十七)atp应用测试平台——redis实现api接口访问限流(固定窗口限流算法)(代码片段)

前言开始正文之前,大多数情况下应该有这样一段场景。面试官:说说平常在项目中,你是如何使用redis的?我:我们就很简单啦,比如前后端分离token的存储、短信验证码的存储,权限列表的存储࿰... 查看详情