VUE3集成Jessibuca播放器实现多格式直播流播放

1. 为什么选择Jessibuca?一个纯H5直播播放器的魅力

如果你正在用Vue3开发一个需要播放直播流的项目,比如安防监控、在线教育或者直播带货,那你肯定遇到过视频格式兼容性的头疼问题。不同的浏览器对视频格式支持千差万别,尤其是那些需要低延迟的直播场景,传统的<video>标签经常力不从心。我自己在项目里就踩过不少坑,直到发现了Jessibuca这个宝藏播放器。

Jessibuca是一款纯H5直播流播放器,它的核心是把音视频解码库通过WebAssembly(Wasm)技术编译成JavaScript,直接在浏览器里运行。这意味着什么?意味着你不需要依赖任何浏览器插件,也不用担心Flash这种已经被淘汰的技术,就能在PC、手机甚至微信里流畅播放各种直播流。它特别擅长处理ws-raw、ws-flv、http-flv这些在直播领域非常常见的流媒体格式,而这些恰恰是标准<video>标签搞不定的。

我当初选择Jessibuca,主要是看中它几个实实在在的优点。首先是兼容性极好,从Chrome、Safari到移动端浏览器,基本都能通吃。其次是延迟低,对于安防监控这种对实时性要求高的场景,它能做到1秒以内的延迟,实测下来比很多商业方案都稳。最后是开源免费,社区活跃,遇到问题能找到不少解决方案。不过,它也不是万能的,比如对HLS(m3u8)的支持就不太行,如果你的流主要是HLS格式,那可能得看看其他方案。但如果你面对的是RTMP转FLV over WebSocket或者HTTP-FLV这类流,Jessibuca绝对是你的首选。

2. 项目环境准备与依赖安装

在开始写代码之前,我们得先把环境搭好。我假设你已经有了一个现成的Vue3项目,如果没有,可以用Vite快速创建一个,这比Vue CLI更轻快。

npm create vue@latest my-jessibuca-project

创建项目时,选择TypeScript和Vue Router这些你需要的特性就行。项目创建好后,我们进入正题:引入Jessibuca。Jessibuca本身不是一个可以通过npm直接安装的包,它更像一个需要你手动引入的库。你需要去它的GitHub仓库或者官网下载几个核心文件:jessibuca.jsdecoder.jsdecoder.wasm。这三个文件是播放器的核心,缺一不可。

下载下来后,我建议你在项目的public目录下创建一个jessibuca文件夹,把这些文件放进去。比如路径是public/jessibuca/。这样做的原因是,这些文件是静态资源,Webpack或Vite在打包时不会处理它们,而是原样复制到输出目录,方便我们通过相对路径引用。另一种做法是放到src/assets里,但那样可能需要配置构建工具来处理.wasm文件,稍微麻烦点。

接下来,我们需要在Vue的入口文件(比如main.tsmain.js)里全局引入Jessibuca。因为Jessibuca是通过window对象暴露的,我们需要告诉TypeScript它的类型。创建一个类型声明文件,比如src/types/jessibuca.d.ts,内容如下:

// src/types/jessibuca.d.ts
declare global {
  interface Window {
    Jessibuca: any;
  }
}
export {};

然后在你的main.ts中,通过<script>标签的方式引入,或者如果你用了Vite,可以在index.html<head>里引入。我个人更喜欢在index.html里引入,这样更清晰:

<!-- public/index.html -->
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vue3 Jessibuca Demo</title>
    <!-- 引入Jessibuca核心文件 -->
    <script src="/jessibuca/jessibuca.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

注意,decoder.jsdecoder.wasm不需要在HTML里显式引入,Jessibuca会在运行时动态加载它们。但你必须确保它们在正确的路径下,我们稍后在初始化播放器时会配置这个路径。

3. 播放器组件封装:从零到一构建可复用的播放器

环境准备好了,现在我们来封装一个可复用的Vue3播放器组件。这样做的好处是,以后在任何页面里,你只需要传入一个视频流地址,就能直接用了,非常方便。

首先,在src/components目录下创建一个JessibucaPlayer.vue文件。这个组件将负责管理Jessibuca实例的整个生命周期。我们先来搭个架子:

<!-- src/components/JessibucaPlayer.vue -->
<template>
  <div class="player-wrapper">
    <!-- 播放器容器,Jessibuca会把canvas或video画布渲染到这里 -->
    <div ref="containerRef" class="jessibuca-container"></div>
    <!-- 可以在这里添加自定义的控制栏、加载状态提示等 -->
    <div v-if="loading" class="loading-tip">视频加载中...</div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, onUnmounted, watch, nextTick } from 'vue';

// 定义组件接收的Props
interface Props {
  // 视频流地址,支持 ws://、wss://、http://、https://
  url: string;
  // 是否自动播放
  autoPlay?: boolean;
  // 是否静音
  muted?: boolean;
  // 宽度
  width?: number | string;
  // 高度
  height?: number | string;
}

const props = withDefaults(defineProps<Props>(), {
  autoPlay: false,
  muted: false,
  width: '100%',
  height: 360,
});

// 定义组件可以触发的事件
const emit = defineEmits<{
  (e: 'load'): void; // 播放器加载完成
  (e: 'play'): void; // 开始播放
  (e: 'pause'): void; // 暂停播放
  (e: 'error', error: any): void; // 播放错误
  (e: 'timeout'): void; // 播放超时
}>();

// 模板引用,指向容器DOM元素
const containerRef = ref<HTMLElement>();
// Jessibuca实例
const playerInstance = ref<any>(null);
// 加载状态
const loading = ref(false);

// 播放器配置项,这里先列个基础配置,后面会详细讲
const defaultOptions = {
  // 解码器路径,非常重要!指向我们放在public下的decoder.js
  decoder: '/jessibuca/decoder.js',
  // 是否显示控制栏
  showControl: true,
  // 是否支持双击全屏
  supportDblclickFullscreen: true,
  // 是否显示网速
  showBandwidth: true,
  // 超时时间(秒)
  timeout: 10,
  // 是否开启音频(如
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值