vue使用mpegts.js教程

vue使用mpegts.js教程

  • 最简单好用的H265网页播放器-mpegts.js
    • 简介
    • 特征
    • 受限性
  • 使用步骤
    • 安装引入
    • HTML 中添加视频标签
      • video知识扩展
    • 在容器里创建播放器

最简单好用的H265网页播放器-mpegts.js

H265是新一代视频编码规范,与H264相比压缩比更高,同样的码率下视频质量更高,或者说同样质量的视频占用的带宽和存储更少

简介

mpegts.js 是在 HTML5 上直接播放MPEG-TS/FLV流的播放器,针对低延迟直播优化。mpegts.js 通过在 JavaScript 中渐进化解析 MPEG2-TS 流并实时转封装为 ISO BMFF (Fragmented MP4),然后通过 Media Source Extensions 接口把音视频数据共给 HTML5 < video > 元素

特征

  • 支持H264和H265视频格式
  • 列表支持FLV封装的H.264/H.265 + AAC / MP3媒体内容
  • 支持HTTP-FLV,WebSocket-FLV协议
  • 兼容Chrome, FireFox, Safari 10, IE11 和Edge
  • 支持浏览器硬加

受限性

由于实现原理是通过js对各种h265封装进行解封装,最后封装成统一的mp4格式供给video标签,本身并不做解码,所以播放能力最终以来播放终端的软硬件环境,如果设备或浏览器本身不支持h265就无法正常播放,比如Win7系统和较早的手机通常都无法播放h265视频。

使用步骤

安装引入

npm install --save mpegts.js

import mpegts from 'mpegts.js';

HTML 中添加视频标签

     
     <video
      ref="videoPlayer"
      muted="muted">
      </video>

video知识扩展

为了改善用户体验,浏览器策略限制自动播放需静音,若设置直接打开页面就播放,会报错,无法播放

Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.
  • 但以下情况除外

在这里插入图片描述

  • 需求

页面打开的时候,视频就自动播放

  • 解决方案

我们可以根据第一条,如果视频是静音状态下就可以自动播放,所以在自动播放的时候失败的时候,选择静音播放,提示打开声音,用户点击,于是有了第二个条件,视频就可以带着声音播放了。


<div class="box">
    <video
      ref="videoPlayer"
      muted="muted">
      </video>
    <div class="model">
      <button>开始播放</button>
    </div>
  </div>
  
——————

const video = this.$refs.videoPlayer

const model = document.querySelector('.model')
const btn = document.querySelector('button')
// 第一种方法 引导用户去与页面交互实现播放
async function play() {
  try {
    await video.play();
    //使用await的原因是因为video.play()方法返回的是一个Promise,所以在这里我们可以对他进行一些处理
    model.style.display = 'none';
    btn.removeEventListener('click', play);
    // 如果他自动播放了就隐藏按钮,消除点击事件
  } catch (err) {
    model.style.display = 'block';
    btn.addEventListener('click', play);
    // 如果Promise返回的是error就引导用户点击按钮,在调用play方法
  }
}
play();

//第二种方法比较主流,类似的有网页版抖音以及B站
function play() {
  video.muted = true;//设置视频为静音
  video.play();//调用播放方法
  const ctx = new AudioContext();
  const canAutoPlay = ctx.state === 'running'; //通过这个可以判断出视频能不能够自动播放 如何可以它的值就是“running” 否则为"suspended"
  // 如果是不能播放我们就执行下面的逻辑,其实就是类似于第一种方法,让用户与其交互
  ctx.close();
  if (canAutoPlay) {
    video.muted = false;
    model.style.display = 'none';
    btn.removeEventListener('click', play);
  }
  else {
    model.style.display = 'block';
    btn.addEventListener('click', play);
  }
}
play()

在容器里创建播放器


    data() {
    return {
      player: null,
    };
   },

——————
   
    createPlayer(url) {
      if (mpegts.isSupported()) { //判断浏览器是否支持播放
        if (this.player) {
          this.destory();
        }
        this.player = mpegts.createPlayer( //创建一个播放器实例
          {
            type: "flv",//播放的格式 flv mp4 ts mse等
            url,
            isLive: true, //指示数据源是否为直播流
            isAutoPlay: true,//是否自动播放
            isContinue: true, //是否循环播放
            lazyLoad: true,//如果有足够的数据进行播放,则终止http连接
          },
          {
            enableWorker: true,//是否启用分离线程
            enableStashBuffer: false,//是否关闭IO隐藏缓冲区
            stashInitialSize: 128,//IO存储缓冲区初始大小,默认为384kb
          }
        );

        this.player.attachMediaElement(this.$refs.videoPlayer); //将播放器注册到Video节点
        this.player.load(); //加载
        setTimeout(() => {
          this.player
            .play()
            .then(() => {
              console.log("播放");
            })
            .catch((err) => {
              console.log("err", err);
            });
        });
      }
    },

    destory() {
      if (this.player) {
        try {
          this.player.pause(); //暂停播放
          this.player.unload();//取消数据流加载
          this.player.detachMediaElement();//将播放实例从节点中取出
          this.player.destroy(); //销毁
          this.player = null;
        } catch (e) {
          // console.log(e);
        }
      }
    },

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络-调度算法-2(时间片轮转 优先级调度算法 多级反馈队列调度算法 多级队列调度算法)

文章目录 总览时间片轮转时间片大小为2时间片大小为5若按照先来先服务算法 优先级调度算法例题&#xff08; 非抢占式优先级调度算法&#xff09;例题&#xff08; 抢占式优先级调度算法&#xff09;补充 思考多级反馈队列调度算法例题 小结多级队列调度算法 总览 时间片轮转 …

ESP32 LED PWM 控制器

ESP32 具有 LED PWM 控制器&#xff0c;具有 16 个独立通道&#xff0c;可配置为生成具有不同属性的 PWM 信号。 使用 Arduino IDE 通过 PWM 对 LED 进行调光时必须遵循以下步骤&#xff1a; 1.首先&#xff0c;您需要选择一个PWM通道。从 0 到 15 有 16 个通道&#xff0c;一…

初谈C++:引用

文章目录 前言概述引用特性应用场景做参数做返回值 传值、传引用效率比较引用和指针的区别 前言 在学习C语言的时候会遇到指针&#xff0c;会有一级指针、二级指针…很容易让人头昏脑胀。在C里面&#xff0c;引入了引用的概念&#xff0c;会减少对指针的使用。引用相当于给一个…

【FFmpeg】ffplay 命令行参数 ① ( 设置播放分辨率 | 禁用 音频 / 视频 / 字幕 选项 )

文章目录 一、ffplay 命令行参数 - 设置播放分辨率1、强制设置通用播放分辨率 -x -y 参数2、命令行示例 - 正常播放视频3、命令行示例 - 强制设置播放分辨率4、设置 YUV 播放分辨率 -video_size 和 像素设置 -pixel_format5、全屏播放 -fs 参数 二、ffplay 命令行参数 - 禁用 音…

跨境卖家:如何利用自养号测评抢占市场先机?

在当今的跨境电商领域&#xff0c;产品的销量和评价是影响产品在市场上的表现的关键因素。对于卖家而言&#xff0c;自行养号进行产品测评不仅有助于提升销量&#xff0c;更成为了他们在这个竞争激烈的市场中保持竞争力的必备策略。 相较于一些卖家仍然依赖于服务商进行测评&a…

【网络】 WireShark实现TCP三次握手和四次挥手

目录 一、WireShark介绍 二、什么是TCP 三、TCP三次握手 四、TCP四次挥手 一、WireShark介绍 WireShark是一个开源的网络分析工具&#xff0c;用于捕获和分析网络数据包。它可以在多个操作系统上运行&#xff0c;包括Windows、Mac OS和Linux。 使用WireShark&#xff0c;…

【体验有奖】5 分钟函数计算部署 AI 艺术字应用,晒姓氏头像赢 Cherry 键盘!

作者&#xff1a;姜曦&#xff08;筱姜&#xff09; 目前&#xff0c;大多数开发者使用的 AI 绘画项目 Stable Diffusion WebUI 难以适应企业多用户、多场景的复杂需求&#xff0c;用户急需一套成熟解决方案去进行基于 Stable Diffusion 的 AI 绘画创业&#xff0c;本实验基于…

【lesson3】高并发内存池的三层框架介绍

文章目录 高并发内存池需要考虑的问题高并发内存池的3个核心部分thread cachecentral cachepage cache 高并发内存池需要考虑的问题 现代很多的开发环境都是多核多线程&#xff0c;在申请内存的场景下&#xff0c;必然存在激烈的锁竞争问题。malloc本身其实已经很优秀&#xf…

代码随想录 Leetcode538. 把二叉搜索树转换为累加树

题目&#xff1a; 代码(首刷看解析 2024年1月31日&#xff09;&#xff1a; class Solution { public:int pre 0;TreeNode* convertBST(TreeNode* root) {if (!root) return nullptr;root->right convertBST(root->right);if (pre 0) {pre root->val;}else {root…

万物简单AIoT 端云一体实战案例学习 之 智能小车

学物联网,来万物简单IoT物联网!! 下图是本案的3步导学,每个步骤中实现的功能请参考图中的说明。 1、简介 1.1、背景 市面上各种遥控的小车很多,小车的性能不同具备的能力也不一样,大概实现的逻辑就是通过遥控器控制小车的前进、后退、左转或者右转。遥控小车具备一定…

【lesson4】高并发内存池ThreadCache(线程缓存)层实现

文章目录 ThreadCache层的结构申请内存逻辑释放内存逻辑自由链表的实现自由链表的成员变量自由链表的成员函数自由链表的完整实现 ThreadCache申请内存过程的实现ThreadCache需要的成员变量ThreadCache需要的成员函数ThreadCache.h文件代码Allocate的实现Deallocate的实现 封装…

实验3:利用Linux的消息队列通信机制实现三个线程间的通信

调用原型 POSIX信号量–无名信号量 POSIX信号量是Pthread线程库提供的一种同步机制&#xff0c;包括无名信号量和有名信号量两种机制。无名信号量&#xff0c;常用于多线程间的同步&#xff0c;也可用于相关进程间的同步&#xff08;需置于相关进程间的共享内存区中&#xff…

自定义vue通用左侧菜单组件(未完善版本)

使用到的技术&#xff1a; vue3、pinia、view-ui-plus 实现的功能&#xff1a; 传入一个菜单数组数据&#xff0c;自动生成一个左侧菜单栏。菜单栏可以添加、删除、展开、重命名&#xff0c;拖动插入位置等。 效果预览&#xff1a; 代码&#xff1a; c-menu-wrap.vue <t…

模拟电路之运放

滞回比较器&#xff1a; 小幅度波动时候不受影响&#xff0c;除非超过一点范围 当输入信号慢慢增加到UT&#xff0c;就变成负电压 当输入信号慢慢减压到—UT&#xff0c;就变成正电压 电路反向接信号 正反馈&#xff0c;串联电阻接地 调整回差的方法 1.调整电阻的分压 2.…

学习在微信小程序使用富文本修改图片大小的代码,超简单

学习在微信小程序使用富文本修改图片大小的代码&#xff0c;超简单 前言代码 前言 自带img图片或大或小&#xff0c;不适应小程序页面 代码 1、replace方法全局添加图片img标签的style样式 let txt www.qipa250.com //富文本内容 txt txt.replace(/<img/gi,<img s…

c++ 字符串切分split

c 字符串切分split 的举例实现 一共给出了四种方式 1、 strtok 2、 stringstream 3、 字符串查找 4、 基于封装的方式&#xff0c;提供了 c11 foreach 接口 代码 vector<string> split(string s) {vector<string> res;const char *p strtok((char *) s.c_str(),…

linux平台 LED情报板网关项目总结

LED情报板目前已经基本稳定 主要存在两个版本LED1.5 和LED2 两个版本的主要差别是 &#xff1a; 1.1.5的配置文件存在本地 2.0的存在平台 需要通过接口从平台获取 2.1.5的下发消息的时候需要同步返回 2.0的是异步返回&#xff0c;所以1.5的要尽可能完成 不然会导致发 布平台…

C++指针比较

内存中各个数据的存放方式。 数组str1、str2、str3、str4都是在栈中分配的&#xff0c;内存中的内容都为“abc”加一个“\0”&#xff0c;但是他们的位置是不同的&#xff0c;因此代码第15行和第16行输出的都是0. 指针str5、str6、str7、str8也是在栈中分配的&#xff0c;他们…

oj赛(双周赛第二十次)

目录 碰碰车 小码哥与机器人 小码哥的跳棋游戏 竖直打印机 排队 邮箱地址 碰碰车 难度:钻石 占用内存:128 M时间限制:1秒 游乐园玩碰碰车&#xff0c;其中有一种碰碰车是在一条直线上行驶。该碰碰车有一个初始朝向和初始位置&#xff0c;并且以每秒一个单位的速度向初始方…

网络原理-TCP_IP(2)

TCP协议 TCP全称为"传输控制协议(Transmission Control Protocol)".协议如其名,要对数据的传输进行一个详细的控制. TCP协议段格式 源/目的端口号:表示数据从哪个进程来,到哪个进程去. 32位序号/32位确认序号:后面详细讲. 4位TCP报头长度:表示该TCP头部有多少个32位…