npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

zwplayervue3

v1.0.36

Published

A fully functional and lightweight free open-source web player

Downloads

175

Readme

zwplayervue3

基于 Vue 3.x 的 zwplayer 组件封装,提供简单易用的视频播放能力。

关于 zwplayer

zwplayer(Zero Web Player)是一款秉持"智能傻瓜式"设计理念的网页播放器,致力于将开发者的使用成本降至无限接近于零。

核心特点

零费用成本 - 完全免费,永久免费,无需支付任何费用

零学习成本 - 提供统一简洁的 API,智能引擎自动处理所有流媒体技术细节

零升级成本 - API 永久固化,版本升级仅需替换文件

零风险成本 - 代码纯净,无广告、无统计、无联网后门

零部署成本 - 不依赖第三方库和 CDN,私网、内网均可使用

主要功能

  • 广泛协议支持:HLS、DASH、HTTP-FLV、HTTP-TS、WS、WebRTC(WHEP/ARTC/BRTC/TRTC)
  • 特色协议:支持 RTSP 网页播放(无需插件)
  • 本地文件播放:支持直接播放用户设备上的本地视频/音频文件
  • 智能字幕:支持双字幕、字幕搜索、章节搜索、拖拽加载本地字幕、章节文件
  • 丰富功能:弹幕、进度条预览、画面调节、截图、音量增益、AB循环、录制、音频提取等
  • 直播优化:超低延时直播、直播追帧、多码流切换
  • 灵活模式:画中画、网页全屏、自动小窗口、强制锁定模式

更多详情请访问:

使用说明

安装

npm install zwplayervue3 --save

安装注意事项

⚠️ 重要:本组件依赖 zwplayer 核心库,安装时请注意以下事项:

  1. 自动配置npm install 会自动执行 postinstall 脚本,该脚本会:

    • 创建 public 目录(如果不存在)
    • zwplayer 核心库复制到 public/zwplayer 目录
  2. 核心库必须发布public/zwplayer 目录必须随项目一起发布到生产环境

    • 确保该目录完整包含所有 zwplayer 相关文件
    • 不要在部署时忽略此目录
  3. 动态加载机制:zwplayer 采用动态加载机制

    • 支持无缝升级,无需修改业务代码
    • 升级时只需替换 public/zwplayer 目录中的文件即可
  4. 内网/私网部署:zwplayer 不依赖 CDN,完全支持内网和离线环境部署

组件注册

全局注册

src/main.js 中添加:

import { createApp } from 'vue'
import App from './App.vue'
import ZwModule from 'zwplayervue3'

createApp(App)
  .use(ZwModule)
  .mount('#app')

全局注册后,可在项目任何组件中使用 <zwplayer> 组件。

局部注册

在组件中单独注册:

import { zwplayer } from 'zwplayervue3'

export default {
  name: 'MyComponent',
  components: {
    zwplayer   //局部注册组件
  },
  data() {
    return {
      movieUrl: 'https://d2zihajmogu5jn.cloudfront.net/elephantsdream/ed_hd.mp4',
      playerOpen: true
    }
  },
  props: {
    msg: String
  },
  methods: {
    onPlayerReady() {
      console.log('player ready event.')
    },
    onPlayerMediaEvent(event) {
      console.log('media event:', event.type)
    },
    sendDanmu(danmu) {
      console.log('sendDanmu:', danmu)
      // 调用websocket等方法将弹幕实际发送出去
    }
  }
}

组件使用

基础使用示例

在模板中使用组件:

<template>
  <div class="player-container">
    <zwplayer
      v-if="playerOpen"
      ref="zwplayerRef"
      nodeid="main-player"
      :murl="movieUrl"
      @onready="onPlayerReady"
      @onmediaevent="onPlayerMediaEvent"
      :snapshotButton="true"
      :optionButton="true"
      :infoButton="true"
      :enableDanmu="true"
      :chapterButton="true"
      :disableMutedConfirm="true"
      danmuBar="danmu-controlbar"
    />
  </div>
</template>

带缩略图的示例

<template>
  <div class="player-container">
    <zwplayer
      v-if="playerOpen"
      ref="zwplayerRef"
      nodeid="main-player"
      :murl="movieUrl"
      :thumbnails="thumbnails"
      :fluid="true"
      :autoplay="false"
      @onready="onPlayerReady"
    />
  </div>
</template>

<script>
import { zwplayer } from 'zwplayervue3'

export default {
  name: 'ThumbnailExample',
  components: {
    zwplayer
  },
  data() {
    return {
      movieUrl: 'https://cdn.zwplayer.cn/media/VMAP9lxJvRpgn5sP3lV6rQ9qkzQmh5psggso3185.mp4',
      playerOpen: true,
      thumbnails: {
        url: 'https://cdn.zwplayer.cn/media/b44c43c90be3521bc352aad1e80f9cd0_thumb.jpg',
        width: 160,
        height: 90,
        row: 9,
        col: 9,
        total: 74
      }
    }
  },
  methods: {
    onPlayerReady() {
      console.log('播放器已就绪')
    }
  }
}
</script>

弹幕功能示例

<template>
  <div>
    <zwplayer
      v-if="playerOpen"
      ref="zwplayerRef"
      :murl="movieUrl"
      :enableDanmu="true"
      :sendDanmu="sendDanmu"
      :disableMutedConfirm="true"
      @onready="onPlayerReady"
    />

    <!-- 弹幕控制条容器 -->
    <div class="danmubar" id="danmu-controlbar"></div>
  </div>
</template>

<script>
import { zwplayer } from 'zwplayervue3'

export default {
  name: 'DanmuExample',
  components: {
    zwplayer
  },
  data() {
    return {
      movieUrl: 'https://cdn.zwplayer.cn/media/VMAP9lxJvRpgn5sP3lV6rQ9qkzQmh5psggso3185.mp4',
      playerOpen: true,
      player: null
    }
  },
  methods: {
    onPlayerReady() {
      // 获取播放器实例
      this.player = this.$refs.zwplayerRef

      // 添加测试弹幕
      if (this.player && this.player.appendDanmu) {
        const testDanmu = {
          border: '1px solid #ccc',
          text: '欢迎来到 zwplayer 弹幕演示!',
          color: '#ff6b6b'
        }
        this.player.appendDanmu(testDanmu)
      }
    },
    sendDanmu(danmuText) {
      console.log('发送弹幕:', danmuText)

      if (!danmuText) return

      // 解析弹幕数据
      let danmu
      try {
        const jtext = JSON.parse(danmuText)
        danmu = {
          border: '1px solid #ccc',
          text: jtext['text']
        }
      } catch (e) {
        danmu = {
          border: '1px solid #ccc',
          text: danmuText
        }
      }

      // 添加弹幕到播放器
      if (this.player && this.player.appendDanmu) {
        this.player.appendDanmu(danmu)
      }
    }
  }
}
</script>

<style scoped>
.danmubar {
  height: 50px;
  background-color: #232323;
  padding: 8px;
  box-sizing: border-box;
}

/* 弹幕控制条宽度设置 */
.danmubar :deep(.zwp_danmu-controlbar) {
  width: 60%;
}
</style>

主要属性说明

| 属性名称 | 说明 | 备注 | |---------|------|------| | murl | 媒体地址参数(string/object/array),支持动态切换 | 运行时变动会自动调用 play 方法 | | autoplay | 是否自动播放 | true/false | | fluid | 是否启用流体布局,使播放器自适应容器宽度 | true/false | | thumbnails | 缩略图配置对象 | 参见下方缩略图配置 | | enableDanmu | 是否启用弹幕功能 | true/false | | sendDanmu | 发送弹幕的回调函数 | function | | snapshotButton | 是否显示截图按钮 | true/false | | optionButton | 是否显示设置按钮 | true/false | | infoButton | 是否显示信息按钮 | true/false | | chapterButton | 是否显示章节按钮 | true/false | | disableMutedConfirm | 禁用静音确认提示 | true/false | | 其它 | 请参考 zwplayer 播放器构造函数参数 | - |

缩略图配置示例

thumbnails: {
  url: 'https://cdn.zwplayer.cn/media/b44c43c90be3521bc352aad1e80f9cd0_thumb.jpg',
  width: 160,    // 单个缩略图宽度
  height: 90,    // 单个缩略图高度
  row: 9,        // 缩略图行数
  col: 9,        // 缩略图列数
  total: 74      // 缩略图总数
}

事件

组件提供了 onreadyonmediaevent 等事件,详细说明请参考 zwplayer 事件文档

| 事件名称 | 说明 | 回调参数 | |---------|------|---------| | onready | 播放器初始化完成 | - | | onmediaevent | 媒体事件 | event 对象,包含 type 等属性 |

方法调用

通过 ref 引用调用播放器方法:

// 在 onready 事件中获取播放器实例
methods: {
  onPlayerReady() {
    // 获取播放器实例
    const player = this.$refs.zwplayerRef
    this.player = player
  },

  // 播放控制
  playVideo() {
    this.player.play()
  },

  pauseVideo() {
    this.player.pause()
  },

  // 跳转到指定时间(秒)
  seekTo(time) {
    this.player.seekTime(time)
  },

  // 添加弹幕
  addDanmu(text, color = '#fff') {
    if (this.player && this.player.appendDanmu) {
      const danmu = {
        border: '1px solid #ccc',
        text: text,
        color: color
      }
      this.player.appendDanmu(danmu)
    }
  },

  // 切换视频源
  changeVideo(newUrl) {
    this.movieUrl = newUrl  // 通过修改 murl 属性自动切换
  }
}

常用方法列表

| 方法名 | 说明 | 示例 | |-------|------|-----------------------------------------------------| | play() | 播放视频 | player.play() | | pause() | 暂停视频 | player.pause() | | seekTime(time) | 跳转到指定时间(秒) | player.seekTime(120) | | appendDanmu(danmu) | 添加弹幕 | player.appendDanmu({text: '弹幕内容', color: '#fff'}) | | 其他方法 | 请参考 zwplayer API 文档 | - |

示例项目

完整示例项目包含了以下演示场景:

  • 基础使用 - 播放器基本功能演示

  • 缩略图预览 - 进度条缩略图功能

  • 弹幕功能 - 实时弹幕发送和接收

  • 自动播放 - 自动播放配置

  • 截图功能 - 视频截图功能

  • 字幕功能 - 多字幕支持

  • 章节功能 - 视频章节导航

  • Logo 设置 - 自定义播放器 Logo

  • 播放控制 - 自定义播放控制

  • 小窗口模式 - 画中画等功能

  • 流体布局 - 自适应容器宽度

  • Gitee: https://gitee.com/chenfanyu/zwplayervue3-demo

  • GitHub: https://github.com/chenfanyu/zwplayervue3-demo

常见问题

1. 播放器实例未定义?

确保在 onready 事件中获取播放器实例:

onPlayerReady() {
  this.player = this.$refs.zwplayerRef
}

2. 如何实现视频源动态切换?

直接修改 murl 绑定的变量即可:

this.movieUrl = 'https://example.com/new-video.mp4'

组件会自动调用 play 方法加载新视频源。

3. public/zwplayer 目录的作用?

该目录包含 zwplayer 核心库文件,采用动态加载机制:

  • 支持无缝升级,无需重新编译项目
  • 必须随项目一起发布到生产环境
  • 可以随时替换升级,不影响业务代码

其他版本

Vue 2.x

如果你使用 Vue 2.x,请安装 zwplayer-vue2x

npm install zwplayer-vue2x --save

详细文档:zwplayer-vue2x

相关资源

官方文档

示例项目

许可证

本组件遵循 MIT 许可证。ZWPlayer 核心库完全免费使用。

技术支持

如有问题或建议,请通过以下方式联系: