目录

前言

1、构建

2、销毁

3、断流、卡顿重连

4、报错、停滞重连

5、累计延时处理

6、手动全屏


前言

本人是在vue3中使用flv.js处理推流时,遇到的一些问题,以及处理办法,归纳总结为一个组件,仅限于推流使用。

目前只贴出部分关键代码,若需要完整的代码,请往github下载

1、构建

    /*** @description: 构建播放器* @return {*}* @Author: liuxin*/function flvCreated() {try {const videoElement = flvPlayerVideo.value;if (flvjs.isSupported() && videoElement) {addLog(`flv created,address:${prop.url}`);const flvOption = {url: prop.url, // 播放地址hasAudio: false, // 是否有音频hasVideo: true, //是否有视频isLive: true, // 是否是直播流,默认 truetype: "flv", // 是否是直播流,默认 truestashInitialSize: 128, // 减少首帧显示等待时长...prop.option,};state.flvPlayer = flvjs.createPlayer(flvOption, {enableWorker: false, // 不启用分离的线程进行转换,之前为trueenableStashBuffer: false, // 关闭IO隐藏缓冲区stashInitialSize: 128, // 减少首帧显示等待时长autoCleanupSourceBuffer: true, // 打开自动清除缓存fixAudioTimestampGap: false, //false才会音视频同步,新增lazyLoad: false, // 去掉懒加载,新增});state.flvPlayer.attachMediaElement(videoElement);state.flvPlayer.load();state.flvPlayer.play();state.endedReloadFlag = true; // 重置画面停滞的播放状态,下次停滞了会再次打开videoElementEvent(); // 手动跳帧,防止延时flvPlayerEvent(); // 断流、卡顿处理}} catch (error) {console.error("构建错误", error);}}

2、销毁

    /*** @description: 销毁播放器* @return {*}* @Author: liuxin*/function flvDestory() {if (state.delayTimer) {clearTimeout(state.delayTimer); // 清除推迟打开播放器定时器}if (state.flvPlayer == null) return; // 空对象,不执行销毁/* ----- 销毁开始 ----- */addLog(`flv destory,address:${prop.url}`);try {state.flvPlayer.off(flvjs.Events.ERROR, errorHandle);if (state.flvPlayer._hasPendingLoad) {state.flvPlayer.pause();state.flvPlayer.unload();}state.flvPlayer.detachMediaElement();state.flvPlayer.destroy();state.flvPlayer = null;} catch (error) {console.error("销毁错误");}}

3、断流、卡顿重连

      state.flvPlayer.on(flvjs.Events.STATISTICS_INFO, statisticsInfoHanle); // 断流重连/*** @description: 视频卡顿,销毁后重建* @param {*} errorType* @param {*} errorDetail* @param {*} errorInfo* @return {*}* @Author: liuxin*/function statisticsInfoHanle(res) {// 初始化播放if (state.lastDecodedFrame == 0) {state.lastDecodedFrame = res.decodedFrames;return;}// 正常播放if (state.lastDecodedFrame != res.decodedFrames) {state.lastDecodedFrame = res.decodedFrames;state.loading = false; // 去掉loading动画state.errorCount = 0; // 错误连接次数归0}// 播放异常else {if (state.player) {addLog(`Reconnect after video freezes, address:${prop.url}`); // 添加日志state.errorCount = 0; // 错误连接次数归0state.lastDecodedFrame = 0; // 最后播放编码号flvDestory(); // 销毁对象flvCreated("statistics_info"); // 创建对象}}}

4、报错、停滞重连

      state.flvPlayer.on(flvjs.Events.ERROR, errorHandle); // 监听出错消息后,销毁后重连state.flvPlayer.on(flvjs.Events.LOADING_COMPLETE, errorHandle); // ctrl+f5刷新,会莫名因为停止end不播放/*** @description: 错误回调事件* @param {*} errorType* @param {*} errorDetail* @param {*} errorInfo* @return {*}* @Author: liuxin*/function errorHandle() {//视频出错后销毁重新创建 网络错误if (state.flvPlayer && state.errorCount <= state.maxReconnectCount) {addLog(`Video error ${state.errorCount} reconnection,address:${prop.url}`); // 视频报错N重连state.loading = true; // 添加loading动画state.errorCount++; //错误重连次数+1flvDestory();flvCreated("ERROR");}if (state.errorCount > state.maxReconnectCount) {state.loading = false; // 去掉loading}}

5、累计延时处理

     /*** @description: 浏览器下载流事件,手动跳帧,防止累计延时* @return {*}* @Author: liuxin*/videoElement.onprogress = (e) => {// 不需要跳帧,如:异常视频   或者没有数据流,则不进行跳帧if (!prop.isBufferedEnd || state.flvPlayer.buffered.length <= 0) {return;}state.loading = false;/* ----- 跳帧操作 ----- */let end = state.flvPlayer.buffered.end(0); //获取当前时间值let diff = end - state.flvPlayer.currentTime; //获取相差差值// 延迟过大或帧率不正常,通过跳帧的方式更新视频if (diff > 20 || diff < 0) {// addLog(`Manual frame skipping,address:${prop.url}`); // 添加日志state.flvPlayer.currentTime = state.flvPlayer.buffered.end(0) - 0.5; // 手动跳帧到最后return;}// 正常帧率,正常播放if (diff <= 1) {videoElement.playbackRate = 1;}// 10秒内的延时,1.1倍速播放else if (diff <= 10) {// addLog(`Chase frames manually 1.1,address:${prop.url}`); // 手动追帧videoElement.playbackRate = 1.1;}// 20秒内的延时,1.2倍速播放else if (diff <= 20) {// addLog(`Chase frames manually 1.2,address:${prop.url}`); // 手动追帧videoElement.playbackRate = 1.2;}};

6、手动全屏

    /*** @description: 全屏 / 退出全屏* @return {*}* @Author: liuxin*/function fullscreenHandle() {state.isFlullscreen = !state.isFlullscreen;document.addEventListener("keydown", function (e) {//此处填写你的业务逻辑即可if (e.key == "Escape") {e.stopPropagation();state.isFlullscreen = false;}});}

vue3使用flv.js播放推流视频,完整版组件相关推荐

  1. videojs-flvjs:video.js + flv.js播放m3u8和flv视频

    videojs-flvjs是video.js的扩展,让video.js支持flv.js播放器,可以在video.js的techOrder里配置flvjs播放器. 下面做了一个切换m3u8和flv直播流 ...

  2. Hls.js播放m3u8视频 DPlayer视频播放器(easypan) MSE简介

    文章目录 学习链接 hls.js播放m3u8视频 效果 代码 前端代码 安装hls.js App.vue 后台代码 准备文件 mp4文件切片java实现 TsController TsService ...

  3. Web端直接播放 .ts 视频及mux.js播放ts视频没有声音

    最近项目中需要前端播放 .ts 格式视频,捣鼓了几天学习到很多知识,也发掘了一种优秀的解决方案,分享给有同样需求的同学. 常见方案 在网上查找的大部分解决方案都是用诸如videojs等网页播放器,接收 ...

  4. m3u8.php怎么调用,怎样使用Vue结合Video.js播放m3u8视频

    这次给大家带来怎样使用Vue结合Video.js播放m3u8视频,使用Vue结合Video.js播放m3u8视频的注意事项有哪些,下面就是实战案例,一起来看一下. 首先,我们需要在vue工程中安装vi ...

  5. flv.js 播放多个rtsp流【二】

    flv.js 播放多个rtsp流[二] ①添加模板 <template><div><video class="demo-video" ref=&quo ...

  6. python教程视频完整版-Python教程视频完整版

    原标题:Python教程视频完整版 Python是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的.随着人工智能的发展,Python这门语言也 ...

  7. 老男孩Python全栈9期视频完整版

    老男孩Python全栈9期视频完整版 B站:更新最快,内容最全(现已上传完毕,欢迎来撩) https://www.bilibili.com/video/av28244491/ # 第一部分:基础+模块 ...

  8. flv.js播放视频时遇到的问题

    文章目录 前言 一.报错 二.原因 三.方案 前言 rtsp流通过ffmpeg+nginx-http-flv转成rtmp以及http-flv流,并通过flv.js在页面播放,带有音频的流出现播放不了问 ...

  9. 整合SpringBoot + Nginx-http-flv-module + JavaCV(FFmpeg) RTSP推流,使用VUE + Flv.js播放

    目录 1.安装nginx-rtmp-module 2.Maven引入JavaCV包 3.编写Java核心代码 4.VUE安装video.js和flv.js 5.编写前端测试代码 6.运行效果 1.安装 ...

最新文章

  1. P1198 [JSOI2008]最大数
  2. sagemaker+deeplens学习
  3. android lua sd卡,记Android层执行Lua脚本的一次实践
  4. php怎么把日期加时间,将小时分钟添加到日期时间 - php
  5. java - 抽象类、接口、内部类
  6. pcDuino–voip服务器设置呼叫彩铃
  7. VM Depot 镜像新增系列III – 社交媒体,内容管理 与 项目协同系统
  8. matlab寻找直线_matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测
  9. Bug heroes虫虫英雄 超详细翻译+基本攻略
  10. 网站CDN 判断 绕过方法
  11. 华为 MATE7 调试 LOCAT 日志不输出问题
  12. appium2.0+ 单点触控和多点触控新的解决方案
  13. 记录一次 JS 解密去混淆的经历 -- 如何破解加密的 JS 代码(一)
  14. 设计一个互联网交换设备的SNMP MIB库“X-MIB”
  15. Mysql数据库建立视图的方法
  16. 2021年低压电工免费试题及低压电工考试总结
  17. 案例分析-电影评分分析
  18. 进程互斥以及进程互斥实现方法(包含代码)
  19. Apache与Tomcat关系和区别
  20. 如何在linux(ubuntu)下安装字体(给wps安装字体)

热门文章

  1. uoj198【CTSC2016】时空旅行
  2. GemFire 异步写和同步读
  3. 【长期更新】计算机类企业网申地址内推码大整理
  4. 7-39 抽卡游戏 (30分) 本题的灵感来源于一个古典的概率模型。 AliceAliceAlice 在一个卡池里抽卡,里面有 xxx 张 sss 卡和 yyy 张 aaa 卡。 AliceAlice
  5. linux 下的 source,sh,./三者区别
  6. 黑苹果驱动hd4000
  7. 华为matebook笔记本鸿蒙,聊聊鸿蒙对笔记本电脑行业的影响
  8. 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
  9. M1 Mac使用photoshop液化、存储为web格式黑屏如何解决
  10. html5 游戏 闪退,WeGame闪退怎么办?WeGame闪退的六种解决办法