vue直播播放器mpegts.js使用方法详解

 更新时间:2025年06月16日 10:59:49   作者:travel_wsy  
mpegts.js是在HTML5上直接播放MPEG-TS/FLV流的播放器,针对低延迟直播优化,这篇文章主要介绍了vue直播播放器mpegts.js使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

要播放flv格式的视频流,最先想到的是flv.js,但是flv.js已经停止维护几年了,不过在flv.js官网提到用mpegts.js代替flv.js,本章主要记录一下mpegts.js的使用:mpegts.js Api

一、介绍mpegts.js

1、方法:

//创建播放器 
createPlayer(mediaDataSource: Mpegts.MediaDataSource, config?: Mpegts.Config): Mpegts.Player;
//判断浏览器是否支持播放 
isSupported(): boolean;
//获取播放器特征列表(这个方法我这里没用,就不过多介绍了,有需要的可以查看官方文档)
 getFeatureList(): Mpegts.FeatureList;

2、实例

mediaDataSource:

名称类型说明

type

string

支持媒体类型:'mse''mpegts''m2ts''flv' or 'mp4'

isLive

boolean

是否直播

cors

boolean

是否启用cors对http进行提前

withCredentials

boolean

是否启用cookie对http进行提前

hasAudio

boolean

是否有音频轨道

hasVideo

boolean

是否有视频轨道

duration

number

媒体持续时间(单位毫秒)

filesize

number

媒体大小

url

string

播放地址:支持http(s)或者ws(s)

config:

名称类型说明

isLive

boolean

是否开启直播,和mediaDataSource中的

isLive一样

liveBufferLatencyChasing

boolean

开启追帧,减小延迟

liveBufferLatencyMaxLatency

number

最大缓冲延迟,默认1.5s

liveBufferLatencyMinRemain

number

最小缓冲延迟,默认0.5s

 这个就写这几个用到的,其他的可以到文档中查看

播放器

interface Player {
        destroy(): void;//销毁播放器
        on(event: string, listener: (...args: any[]) => void): void;//添加监听
        off(event: string, listener: (...args: any[]) => void): void;//取消监听
        attachMediaElement(mediaElement: HTMLMediaElement): void;//绑定dom
        detachMediaElement(): void;//移除dom
        load(): void;//加载播放器
        unload(): void;//取消播放器加载
        play(): Promise<void> | void;//开始播放
        pause(): void;//暂停播放
    }

枚举

interface Events {
        ERROR: string;//播放中发生错误
        LOADING_COMPLETE: string;//缓冲完成
        RECOVERED_EARLY_EOF: string;//缓冲期间发生意外的网络EOF,但已自动恢复
        MEDIA_INFO: string;//提供媒体的技术信息,如视频/音频编解码器、比特率等。
        METADATA_ARRIVED: string;//提供FLV文件(流)可以包含的元数据
        SCRIPTDATA_ARRIVED: string;//提供FLV文件(流)可以包含的脚本数据
        STATISTICS_INFO: string;//提供播放统计信息,如丢帧、当前速度等
    }

二、使用

1、安装

npm install mpegts.js

yarn add mpegts.js

2、引用

import mpegtsjs from 'mpegts.js'

3、创建播放器

import mpegtsjs from 'mpegts.js'
export default {
  data() {
    return {
      isPlaying: false, // 判断是否正在播放直播
      notSpeedCount: 0,//记录播放速度为0的次数
      flvVideo: null, //播放器
    }
  },
  methods: {
    //初始化播放器
    async initVideo(url, videoId) {
      if (!videoId || !url) return
      let that = this;
      const videoElement = document.getElementById(videoId)
      let flvPlayer = mpegtsjs.createPlayer({
        type: 'flv',
        url: url,
        isLive: true,
        cors: true,
        withCredentials: false,
        hasVideo: true,
        hasAudio: false,
        nativeMP4H264Playback: true,
      }, {
        liveBufferLatencyChasing: true, //追帧
      })
      flvPlayer.attachMediaElement(videoElement)
      flvPlayer.load()
      await flvPlayer.play()
      this.flvVideo = flvPlayer
      //监听播放器发生错误
      flvPlayer.on(
        mpegtsjs.Events.ERROR,
        (errorType, errorDetail, errorInfo) => {
          console.log(
            '类型:' + errorType,
            '报错内容' + errorDetail,
            '报错信息' + JSON.stringify(errorInfo)
          )
        }
      )
      //监听播放信息,该方法会持续调用
      flvPlayer.on(mpegtsjs.Events.STATISTICS_INFO, (e) => {
        //当播放速度为0时,记录一下为0的次数,达到一定次数时,刷新播放器,重新拉取视频流;偶尔卡顿一下不用处理,这里要处理的是长时间拉取不到流,防止链接断开
        if (e.speed == 0) {
          console.log('直播信息:' + JSON.stringify(e))
          if (that.notSpeedCount > 10) {
            that.notSpeedCount = 0
            that.refreshVideo(url,videoId)
            that.isPlaying = false
          } else {
            that.notSpeedCount += 1
          }
        } else {
          if (!that.isPlaying) {
            that.isPlaying = true
            flvPlayer.play()
          }
          that.notSpeedCount = 0
        }
      })
    },
    //销毁
    destoryVideo() {
      if (this.flvVideo) {
        this.flvVideo.pause()
        this.flvVideo.unload()
        this.flvVideo.detachMediaElement()
        this.flvVideo.destroy()
        this.flvVideo = null
      }
    },
    //刷新播放器
    refreshVideo(url,videoId) {
      if(!url || !videoId) return
      this.destoryVideo()
      setTimeout(() => {
        this.initVideo(url,videoId)
      }, 500);
    }
  },
}

总结 

到此这篇关于vue直播播放器mpegts.js使用方法的文章就介绍到这了,更多相关vue直播播放器mpegts.js内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • element-ui中el-cascader动态加载和默认值详解

    element-ui中el-cascader动态加载和默认值详解

    vue+elementUI项目中el-cascader级联选择器使用频率非常高,下面这篇文章主要给大家介绍了关于element-ui中el-cascader动态加载和默认值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • vue中beforeRouteLeave实现页面回退不刷新的示例代码

    vue中beforeRouteLeave实现页面回退不刷新的示例代码

    这篇文章主要介绍了vue中beforeRouteLeave实现页面回退不刷新的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Vue2迁移Rsbuild详细步骤

    Vue2迁移Rsbuild详细步骤

    Rsbuild,一个基于Rspack的高效Web构建工具,将Rspack的强大功能与易用性相结合,是你项目搭建的不二之选,Rsbuild不仅提供了开箱即用的体验,还引入了高性能的构建机制,本文给大家介绍了Vue2迁移Rsbuild详细步骤,需要的朋友可以参考下
    2024-10-10
  • vue中如何实现变量和字符串拼接

    vue中如何实现变量和字符串拼接

    这篇文章主要介绍了vue中如何实现变量和字符串拼接,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue3中的defineExpose函数用法深入解析

    Vue3中的defineExpose函数用法深入解析

    这篇文章主要介绍了Vue3中的defineExpose函数用法的相关资料,defineExpose是Vue3中用于在模式下暴露组件内部属性和方法的辅助函数,它允许父组件通过ref访问子组件的暴露内容,提高组件间的交互能力并保持封装性,需要的朋友可以参考下
    2025-01-01
  • 最简单的vue消息提示全局组件的方法

    最简单的vue消息提示全局组件的方法

    这篇文章主要介绍了最简单的vue消息提示全局组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • vue3 携带参数跳转|router传参方式

    vue3 携带参数跳转|router传参方式

    这篇文章主要介绍了vue3 携带参数跳转|router传参方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Vue中的table表单切换实现效果

    Vue中的table表单切换实现效果

    这篇文章主要介绍了Vue中的table表单切换实现效果,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue中数据不响应的问题及解决

    vue中数据不响应的问题及解决

    这篇文章主要介绍了vue中数据不响应的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 用Vue.js开发网页时钟

    用Vue.js开发网页时钟

    这篇文章主要为大家详细介绍了用Vue.js开发一个网页时钟,分为白天模式和夜晚模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论