Mpegts.js学习笔记

3,791 阅读2分钟

Mpegts.js

mpegts.js 是在 HTML5 上直接播放 MPEG2-TS 流的播放器,针对低延迟直播优化,可用于 DVB/ISDB 数字电视流或监控摄像头等的低延迟回放。 mpegts.js 基于 flv.js 改造而来。

原理

mpegts.js 通过在 JavaScript 中渐进化解析 MPEG2-TS 流并实时转封装为 ISO BMFF (Fragmented MP4),喂给video标签。

安装使用

npm install --save mpegts.js

player.value = Mpegts.createPlayer({
    url: props.url,
    type: 'mse',
    isLive: true
  });
  player.value.attachMediaElement(el);
  player.value.load();
  player.value.play();

事件处理

const loding = ref(false)
const videoRef = ref(null);
const player = ref<Mpegts.Player>()

const createPlayer = (el: HTMLVideoElement) => {
  loding.value = true;

  player.value = Mpegts.createPlayer({
    url: props.url,
    type: 'mse',
    isLive: true
  });
  player.value.attachMediaElement(el);
  player.value.load();
  player.value.play();

  const option = {
    lastDecodeFrame: 0,
    count: 0,
    max_count: 30
  }
  player.value.on(Mpegts.Events.STATISTICS_INFO, e => {
    if (option.lastDecodeFrame === 0) {
      option.lastDecodeFrame = e.decodedFrames;
      return;
    }
    if (option.lastDecodeFrame === e.decodedFrames) {
      option.count++;
      if (option.count > option.max_count) {
        // 断流重连
        destory();
        createPlayer(videoRef.value as unknown as HTMLVideoElement)
      } else {
        option.lastDecodeFrame = e.decodedFrames;
        option.count = 0
      }
    }
  })

  // 构建成功的信息
  player.value.on(Mpegts.Events.MEDIA_INFO, info => {
    console.log('[Mpegts 构建成功]', info);

  })

  player.value.on(Mpegts.Events.LOADING_COMPLETE, () => {
    console.log('[LOADING_COMPLETE]');
    destory();
    createPlayer(videoRef.value as unknown as HTMLVideoElement)
  })

  loding.value = false;
}

// 销毁
const destory = () => {
  if (!player.value) return;
  player.value.unload();
  player.value.detachMediaElement();
  player.value.destroy();
  player.value = undefined;
}

文档

官方api文档

mpegts.createPlayer()

function createPlayer(mediaDataSource: MediaDataSource, config?: Config): Player;

1. MediaDataSource
配置项类型描述默认值
typestring媒体类型, 'mse', 'mpegts', 'm2ts', 'flv' or 'mp4'
url?string媒体URL
isLive?boolean是否是直播流true
hasAudio?boolean指示流是否具有音频轨道true
hasVideo?boolean指示流是否具有视频轨道true
2. Config
配置项类型描述默认值
enableWorker?booleantransmuxing过程是否启用workerfalse
enableWorkerForMSE?booleanMediaSource是否启用workerfalse
enableStashBuffer?boolean启用IO存储缓冲区true
stashInitialSize?number设置IO存储缓冲区的初始大小384(KB)
isLive?boolean是否是直播流,同MediaDataSourcetrue
liveBufferLatencyChasing?boolean启用缓存追帧策略false
liveBufferLatencyMaxLatency?numberHTMLMediaElement中可接受的最大缓冲区延迟1.5(s)
liveBufferLatencyMinRemain?numberHTMLMediaElement中要保持的最小缓冲区延迟0.5(s)
autoCleanupSourceBuffer?boolean自动清理sourceBufferfalse

mpegts.Events

事件描述
ERROR播放过程中出现错误
MEDIA_INFO构建成功后触发,提供视频/音频编解码器、比特率等信息
STATISTICS_INFO播放过程中持续触发,当前解码数据,用于判断断流重连
LOADING_COMPLETE视频流连接断开会触发,用于处理画面卡死