解决浏览器使用 vue-video-player播放视频不能拖动或点击进度条到指定位置播放,拖动或点击进度条会立即反弹回起点播放

这篇具有很好参考价值的文章主要介绍了解决浏览器使用 vue-video-player播放视频不能拖动或点击进度条到指定位置播放,拖动或点击进度条会立即反弹回起点播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用vue/cli版本号: 5.0.0

 使用vue版本号: 2.6.14

使用 vue-video-player 版本号: 5.0.2

解决浏览器使用 vue-video-player播放视频不能拖动或点击进度条到指定位置播放,拖动或点击进度条会立即反弹回起点播放的问题

当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,后台返回流因为没为response的header设置一些参数,会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条,因为Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,所以做了Range的判断,存在则做一些处理

后端关键代码:

 /*
            * 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,
            * 后台返回流因为没为response的header设置一些参数,
            *会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条
            * Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,
            * 所以做了Range的判断存在则做一些处理*/
            String rangeString = request.getHeader("Range");
            if (rangeString != null && rangeString.trim().length() > 0 && !"null".equals(rangeString)) {
                long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));

                response.setHeader("Content-Type", "video/mp4");

                response.setContentLength(Math.toIntExact(file.length()));//10000是视频文件的大小,上传文件时都会有这些参数的

                response.setHeader("Content-Range", String.valueOf(range + (file.length() - 1)));//拖动进度条时的断点,其中10000是上面的视频文件大小,改成你的就好

                response.setHeader("Accept-Ranges", "bytes");

            }

后端文件下载完整代码参考service层

/**
     * @Description: 文件下载:以流的方式
     * @Date: 2022/11/14
     */
    public static String downloadFile(String filePath, HttpServletRequest request, HttpServletResponse response) {
        logger.info("传入路径参数" + filePath);
        FileInputStream fis = null;
        BufferedInputStream bis = null;

        try {
            //设置文件路径
            File file = new File(filePath);
            //获取文件名
            String fileName = file.getName();
            //转码
            String encodeFileName = URLEncoder.encode(fileName, "utf-8");
            logger.info("文件名" + file.getName());

            /*
            * 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,
            * 后台返回流因为没为response的header设置一些参数,
            *会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条
            * Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,
            * 所以做了Range的判断存在则做一些处理*/
            String rangeString = request.getHeader("Range");
            if (rangeString != null && rangeString.trim().length() > 0 && !"null".equals(rangeString)) {
                long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));

                response.setHeader("Content-Type", "video/mp4");

                response.setContentLength(Math.toIntExact(file.length()));//10000是视频文件的大小,上传文件时都会有这些参数的

                response.setHeader("Content-Range", String.valueOf(range + (file.length() - 1)));//拖动进度条时的断点,其中10000是上面的视频文件大小,改成你的就好

                response.setHeader("Accept-Ranges", "bytes");

            }
            //告诉浏览器输出内容为流
            response.setContentType("application/octet-stream");
            // 设置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + encodeFileName);
            response.addHeader("Content-Length", "" + file.length());
            byte[] buffer = new byte[1024];
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            OutputStream os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        logger.info("下载成功");
        return null;
    }

 简单点的方法,直接在controller层写,不用service层,比较不规范

/**
     * 文件下载接口   http://localhost:8080/file/{fileName}
     *
     * @param fileName
     */
    @GetMapping("/{fileName}")
    public void downLoad(@PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {

        // 根据文件的唯一标识码获取文件
        File file = new File(uploadParentPath, fileName);

        /*
         * 方式一:
         * 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,
         * 后台返回流因为没为response的header设置一些参数,
         *会在部分浏览器出现问题,比如在谷歌浏览器无法拖动进度条
         * Chrome浏览器默认请求会在 Header 添加一个Range如下:服务器要做的就是响应这个Header,
         * 所以做了Range的判断存在则做一些处理*/
        /*String rangeString = request.getHeader("Range");
        if (rangeString != null && rangeString.trim().length() > 0 && !"null".equals(rangeString)) {
            long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));

            response.setHeader("Content-Type", "video/mp4");

            response.setContentLength(Math.toIntExact(file.length()));//10000是视频文件的大小,上传文件时都会有这些参数的

            response.setHeader("Content-Range", String.valueOf(range + (file.length() - 1)));//拖动进度条时的断点,其中10000是上面的视频文件大小,改成你的就好

            response.setHeader("Accept-Ranges", "bytes");

        }*/
            //方式二:
           //解决浏览器使用 vue-video-player播放视频不能拖动或点击进度条到指定位置放,
            //拖动或点击进度条会立即反弹回起点播放的问题,直接设置下面两行就行
        response.setHeader("Accept-Ranges", "bytes");
        response.setContentLength(Math.toIntExact(file.length()));

        // 设置输出流的格式,告诉浏览器输出内容为流
        response.setContentType("application/octet-stream");
        // 设置文件名
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

        ServletOutputStream os = response.getOutputStream();
        // 读取文件的字节流
        os.write(FileUtil.readBytes(file));
        os.flush();
        os.close();

    }

以上解决方案同样可解决使用kkFileView进行文件视频预览不能拖动或点击进度条到指定位置播放,拖动或点击进度条会立即反弹回起点播放的问题,以下是使用kkFileView进行文件视频预览的前端代码

<!--表格开始-->
    <el-table :data="tableData" border stripe  ref="multipleTable">
      <el-table-column  align="center" label="文件预览" width="200">
        <template slot-scope="scope">
          <el-button type="primary" @click="preview(scope.row.url)">
            <i class="el-icon-view">预览</i>
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!--表格结束-->


methods:{

 /*预览图片文件图片视频*/
    preview(url){
      window.open('https://file.keking.cn/onlinePreview?url='
          + encodeURIComponent(window.btoa((url))))
    },

},

文章来源地址https://www.toymoban.com/news/detail-549408.html

到了这里,关于解决浏览器使用 vue-video-player播放视频不能拖动或点击进度条到指定位置播放,拖动或点击进度条会立即反弹回起点播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 苹果safari浏览器播放不了video标签视频

    今天遇到了个神奇的问题,视频文件在pc端和安卓手机上播放都没问题,但是在ios上就是播放不了,大概代码如下: 前端代码: 后端代码: PC端没任何问题: IOS端播放不了: 在网上搜索了很多办法,有加前端参数配置的: 有改后端多次发送请求,分段获取数据流的: 经过

    2024年02月16日
    浏览(56)
  • 谷歌chrome浏览器无法自动播放video标签视频的问题

    问题根源详见: Chrome中的自动播放政策  https://developer.chrome.com/blog/autoplay/  The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC appli

    2024年02月11日
    浏览(65)
  • 每天bug---1、el-table 行加样式类名(row-class-name)生效了,但是效果检测不到;2、解决VUE项目在微信浏览器中使用支付宝支付提示复制链接到浏览器打开

    一、el-table 行加样式类名(row-class-name)生效了,但是效果检测不到 1、问题 2、解决 关闭浏览器,重启程序 二、解决VUE项目在微信浏览器中使用支付宝支付提示复制链接到浏览器打开 1、问题:在微信浏览器中访问支付宝支付接口 分析及解决:访问支付宝接口会返回一个f

    2024年02月13日
    浏览(34)
  • vue自定义密码输入框解决浏览器自动填充密码的问题

    浏览器对于 type=\\\"password\\\" 的输入框会自动填充密码,但有时出于安全或者其他原因,我们不希望浏览器记住并自动填充密码。通过网上查到的一些解决方案,可以总结出以下几种解决方案(主要用edge浏览器进行测试): 通过 autocomplete=\\\"off\\\" / autocomplete=\\\"new-password\\\" 来关闭浏览器自

    2023年04月15日
    浏览(36)
  • vue 关于清除浏览器全部cookie的问题及解决方法(绝对有效)

    1、问题描述 我们在日常开发中,有本地调试,有多个服务器的线上调试部署。从中我观察到, 每次使用同一浏览器,如果再次登录时我们没有清理缓存,会有很多匪夷所思的问题 。比如:token在cookie里保存,导致登录失效。多个角色登录时明明token已经更新,但使用的还是

    2023年04月17日
    浏览(20)
  • Vue3之使用vue-video-player

    *vue-video-player 报错The media could not be loaded, either because the server or network failed or because the format is not supported * 原因: 我的src的路径即视频文件存放到本地了,路径直接写 src: \\\'videos/demo.mp4\\\' 而不用 \\\"/videos/demo.mp4\\\" 二、刚开始运行安装命令时,在入口文件引入报错,会显示找不到文

    2024年01月18日
    浏览(33)
  • vue项目版本打包更新后文件及浏览器存在缓存问题解决方案

    在vue.config.js中配置output,打包后的文件会带时间戳 在public/static目录下新建version.json文件  在src中新建 utils文件夹 文件夹中新建versionUpdate.js文件  在src文件夹下创建addVersion.js  写法二 修改package.json中scripts中的打包命令 版本号自加使用fs修改文件来实现 具体思路是:在执行

    2024年02月11日
    浏览(32)
  • vue解决浏览器中跳转新页面缓存上一页表单等内容方法

    在工作中,有可能会遇到需要缓存页面或组件的功能。 情况1 :比如在h5中有个一个50个表单,在填到第40个表单时,需要你去另一个新页面去选择列表项,然后把数据带回来。需要我们不仅把数据带回来还要保留前面已经填好的40个表单内容不被重置。 此功能在微信小程序是

    2024年02月08日
    浏览(39)
  • vue项目使用js监听浏览器关闭、刷新、后退事件

    在项目的某些页面中,在执行某些接口调用过程的时候,如果用户选择刷新、关闭或者后退浏览器。有可能会造成接口被阻断,所以可能你会需要js监听浏览器关闭、刷新、后退事件,在进行这些操作的时候给个提示。如下图: end~

    2024年02月16日
    浏览(29)
  • vue 使用vue-video-player加载视频(铺满容器)

    安装 main.js 引入 使用 使视频铺满容器

    2024年02月13日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包