vue3使用flv.js播放推流视频,完整版组件
目录
前言
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播放推流视频,完整版组件相关推荐
- videojs-flvjs:video.js + flv.js播放m3u8和flv视频
videojs-flvjs是video.js的扩展,让video.js支持flv.js播放器,可以在video.js的techOrder里配置flvjs播放器. 下面做了一个切换m3u8和flv直播流 ...
- Hls.js播放m3u8视频 DPlayer视频播放器(easypan) MSE简介
文章目录 学习链接 hls.js播放m3u8视频 效果 代码 前端代码 安装hls.js App.vue 后台代码 准备文件 mp4文件切片java实现 TsController TsService ...
- Web端直接播放 .ts 视频及mux.js播放ts视频没有声音
最近项目中需要前端播放 .ts 格式视频,捣鼓了几天学习到很多知识,也发掘了一种优秀的解决方案,分享给有同样需求的同学. 常见方案 在网上查找的大部分解决方案都是用诸如videojs等网页播放器,接收 ...
- m3u8.php怎么调用,怎样使用Vue结合Video.js播放m3u8视频
这次给大家带来怎样使用Vue结合Video.js播放m3u8视频,使用Vue结合Video.js播放m3u8视频的注意事项有哪些,下面就是实战案例,一起来看一下. 首先,我们需要在vue工程中安装vi ...
- flv.js 播放多个rtsp流【二】
flv.js 播放多个rtsp流[二] ①添加模板 <template><div><video class="demo-video" ref=&quo ...
- python教程视频完整版-Python教程视频完整版
原标题:Python教程视频完整版 Python是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的.随着人工智能的发展,Python这门语言也 ...
- 老男孩Python全栈9期视频完整版
老男孩Python全栈9期视频完整版 B站:更新最快,内容最全(现已上传完毕,欢迎来撩) https://www.bilibili.com/video/av28244491/ # 第一部分:基础+模块 ...
- flv.js播放视频时遇到的问题
文章目录 前言 一.报错 二.原因 三.方案 前言 rtsp流通过ffmpeg+nginx-http-flv转成rtmp以及http-flv流,并通过flv.js在页面播放,带有音频的流出现播放不了问 ...
- 整合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.安装 ...
最新文章
- P1198 [JSOI2008]最大数
- sagemaker+deeplens学习
- android lua sd卡,记Android层执行Lua脚本的一次实践
- php怎么把日期加时间,将小时分钟添加到日期时间 - php
- java - 抽象类、接口、内部类
- pcDuino–voip服务器设置呼叫彩铃
- VM Depot 镜像新增系列III – 社交媒体,内容管理 与 项目协同系统
- matlab寻找直线_matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测
- Bug heroes虫虫英雄 超详细翻译+基本攻略
- 网站CDN 判断 绕过方法
- 华为 MATE7 调试 LOCAT 日志不输出问题
- appium2.0+ 单点触控和多点触控新的解决方案
- 记录一次 JS 解密去混淆的经历 -- 如何破解加密的 JS 代码(一)
- 设计一个互联网交换设备的SNMP MIB库“X-MIB”
- Mysql数据库建立视图的方法
- 2021年低压电工免费试题及低压电工考试总结
- 案例分析-电影评分分析
- 进程互斥以及进程互斥实现方法(包含代码)
- Apache与Tomcat关系和区别
- 如何在linux(ubuntu)下安装字体(给wps安装字体)
热门文章
- uoj198【CTSC2016】时空旅行
- GemFire 异步写和同步读
- 【长期更新】计算机类企业网申地址内推码大整理
- 7-39 抽卡游戏 (30分) 本题的灵感来源于一个古典的概率模型。 AliceAliceAlice 在一个卡池里抽卡,里面有 xxx 张 sss 卡和 yyy 张 aaa 卡。 AliceAlice
- linux 下的 source,sh,./三者区别
- 黑苹果驱动hd4000
- 华为matebook笔记本鸿蒙,聊聊鸿蒙对笔记本电脑行业的影响
- 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
- M1 Mac使用photoshop液化、存储为web格式黑屏如何解决
- html5 游戏 闪退,WeGame闪退怎么办?WeGame闪退的六种解决办法