npm.io
1.1.2 • Published yesterday

@sentinel-lab/video-vue-frame

Licence
MIT
Version
1.1.2
Deps
2
Size
33 kB
Vulns
0
Weekly
0

@sentinel-lab/video-vue-frame

Vue 3 iframe 薄壳(L7 · 消费面)。Sentinel Video Player 的 Vue 接入方式——

只做技术:创建 iframe 播放器、把 props 桥接成命令、把 iframe 事件桥接成 Vue emits。 不含任何团队品牌 UI(团队 UI 在业务封装层 examples/team-video-vue,ADR-021)。 Vue 只做 iframe,不做 inline(ADR-002)。

用法

<script setup lang="ts">
import { ref } from 'vue'
import { VideoPlayerFrame } from '@sentinel-lab/video-vue-frame'
import type { PlayerError } from '@sentinel-lab/video-vue-frame'

const player = ref<InstanceType<typeof VideoPlayerFrame> | null>(null)

function onError(err: PlayerError) {
  console.warn(err.code, err.message)
}
</script>

<template>
  <VideoPlayerFrame
    ref="player"
    :source="'https://cdn.example.com/live.m3u8'"
    preset="homepage-preview"
    @ready="() => console.log('ready')"
    @error="onError"
  />
</template>

命令通过 template ref 下发:await player.value?.play() / pause() / seek(t) / setMuted() / setVolume() / setPlaybackRate() / setQuality() / reconnect() / destroy(),以及同步读数 getCurrentTime() / getDuration() 和逃生舱 getPlayerHandle()

Props

source 必填,其余可选:autoplay muted loop controls interactive playsinline poster preset locale debug,加 URL 覆盖 origin / version (ADR-023,私有化 / 版本锁定 / 本地 dev 指向 embed-app dev server)。

布尔 prop 不传就是 undefined(不是 false),这样 preset 才能生效——比如 preset="homepage-preview" 会带上 muted: true,只要你没显式传 :muted="false" 覆盖它。

Emits

ready play pause ended timeUpdate volumeChange error autoplayBlocked reconnectStart reconnectSuccess reconnectFailed compatWarning(模板里用 kebab-case:@time-update 等)。

SSR(Nuxt)

组件自带客户端守卫:iframe 只在 onMounted 后创建,SSR 阶段渲染 #ssr-placeholder 插槽(默认黑底占位)。消费方无需再包 <ClientOnly>

边界

  • 不依赖 player-core / player-ui(那些在 iframe 内的 embed-app)
  • 不直接 import xgplayer(薄壳不接触播放技术)
  • 无团队品牌 UI

相关

  • ADR-002(Vue 只做 iframe)· ADR-023(iframe URL 覆盖)
  • packages/frame-core(host 侧通信内核,本包的底座)
  • examples/team-video-vue(团队封装层,业务代码的真正入口)