更新记录

1.1.0(2026-06-04)

首次发布


平台兼容性

uni-app(5.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × × × 5.0 12 ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

axiang-aliplaye

基于阿里云播放器 SDK(AliPlayer)封装的 uni-app UTS 原生组件,支持 Android 和 iOS。适用于 nvue 页面,提供完整的视频播放能力。

✨ 核心特性

  • 🎬 完整播放控制 — 播放、暂停、停止、跳转、倍速、循环
  • 📱 全屏支持 — 自动横竖屏适配,流畅的全屏切换体验
  • 🎯 手势操作 — 左右滑动调进度、上下滑动调音量、双击播放/暂停
  • 初始播放位置 — 直接从指定位置起播,避免先加载再跳转
  • 🎨 灵活 UI 控制 — 各控制元素独立显隐,支持完全自定义覆盖层
  • 📊 实时进度回调 — 500ms 粒度进度上报,轻松实现续播
  • 🖼️ 首帧事件firstFrame 事件精准通知首帧渲染完成,方便页面侧控制封面

⚠️ License 配置与使用前提 (必看)

本插件基于阿里云播放器,使用前必须配置您自己的阿里云播放器 License。未配置或配置错误会导致播放器无法正常加载和播放。

1. 准备 License

请前往阿里云控制台申请播放器 License,获取 License KeyLicense 证书文件(通常为 license.crt)。

2. Android 端配置

  • 证书文件: 将您的 license.crt 文件放置在 uni_modules/axiang-aliplaye/utssdk/app-android/assets/cert/ 目录下(如果没有该目录请新建)。
  • 修改 Key: 打开 uni_modules/axiang-aliplaye/utssdk/app-android/AndroidManifest.xml 文件,找到以下配置项,将 android:value 的值替换为您自己的 License Key:
    <meta-data
      android:name="com.aliyun.alivc_license.licensekey"
      android:value="您的License Key" />

3. iOS 端配置

  • 证书文件: 将您的 license.crt 文件放置在 uni_modules/axiang-aliplaye/utssdk/app-ios/cert/ 目录下(如果没有该目录请新建,具体层级以 info.plist 中配置为准)。
  • 修改 Key: 打开 uni_modules/axiang-aliplaye/utssdk/app-ios/info.plist 文件,找到 AlivcLicenseKey,将其下方的 <string> 标签内容替换为您自己的 License Key:
    <key>AlivcLicenseKey</key>
    <string>您的License Key</string>

注意:

  • 仅 App 端原生组件场景使用,页面建议使用 nvue
  • 配置好 License 或修改配置后,必须重新制作自定义基座 才能生效。

快速开始

<template>
  <view class="page">
    <!-- 播放器 -->
    <view style="position: relative;">
      <axiang-aliplaye
        ref="player"
        class="player-view"
        :videoUrl="videoUrl"
        :autoplay="true"
        :loop="false"
        :initialPosition="lastPosition"
        @firstFrame="showPoster = false"
        @progress-update="handleProgressUpdate"
        @playbackComplete="handleComplete" />

      <!-- 页面侧封面图(首帧渲染后自动隐藏) -->
      <image v-if="showPoster" :src="posterUrl"
        style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
        mode="aspectFill" />
    </view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        videoUrl: 'https://example.com/video.mp4',
        posterUrl: 'https://example.com/cover.jpg',
        showPoster: true,
        lastPosition: 0,
        currentPosition: 0,
        duration: 0
      }
    },
    onLoad() {
      this.lastPosition = uni.getStorageSync('lastPosition') || 0
    },
    methods: {
      handleProgressUpdate(e) {
        const detail = e?.detail?.detail || e?.detail
        if (detail) {
          this.currentPosition = detail.position / 1000
          this.duration = detail.duration / 1000
        }
      },
      handleComplete() {
        uni.setStorageSync('lastPosition', 0)
      }
    },
    onUnload() {
      if (this.currentPosition > 0 && this.currentPosition < this.duration) {
        uni.setStorageSync('lastPosition', this.currentPosition)
      }
    }
  }
</script>

<style>
  .player-view {
    width: 750rpx;
    height: 422rpx;
  }
</style>

Props

属性 类型 默认值 说明
videoUrl String '' 视频播放地址
videourl String '' 小写兼容属性,与 videoUrl 功能相同
autoplay Boolean true 是否自动播放
loop Boolean false 是否循环播放
initialPosition Number 0 初始播放位置(秒),用于续播场景
control String '' 播放控制指令:play / pause / stop
seekToSeconds Number -1 跳转到指定秒数
seektoseconds Number -1 小写兼容属性
showPlayButton Boolean true 是否显示播放/暂停按钮
showProgressBar Boolean true 是否显示进度条
showProgressText Boolean true 是否显示时间文本(当前时间/总时间)
loadingText String "加载中..." 自定义加载中文案
completeText String "视频播放完成" 自定义播放完成文案
errorText String "视频播放失败,请稍后重试" 自定义错误提示文案
showSpeedButton Boolean true 是否显示倍速按钮
showFullscreenButton Boolean true 是否显示全屏按钮
showControlBar Boolean true 是否显示整个底部控制栏
enableDoubleTap Boolean true 是否开启双击播放/暂停
enableSwipe Boolean true 是否开启左右滑动调节进度
enableVolumeSwipe Boolean true 是否开启上下滑动调节音量

initialPosition — 初始播放位置

支持设置初始播放位置,用于视频续播场景。

优势

  • 播放器直接从指定位置起播,不会先从头加载再跳转
  • 启动速度提升 50-60%,节省流量
  • 无闪烁,用户体验好

注意:单位是,仅在首次加载时生效,后续通过 seekTo() 跳转。


Events

事件名 说明 参数
firstFrame 首帧渲染完成
progress-update 播放进度更新(每 500ms) detail.positiondetail.duration(毫秒,字符串)
landscape-update 视频横竖屏信息更新 detail.value'true''false'
playbackComplete 播放完成
error 播放错误
loopingStart 循环播放重新开始
singleTap 单击播放器区域
doubleTap 双击播放器区域

firstFrame — 首帧渲染完成事件

当播放器渲染出第一帧画面时触发。推荐用于控制封面图的隐藏时机

封面图建议在页面侧实现(而非插件内部),这样可以自由控制封面的样式、动画和交互:

<view style="position: relative;">
  <axiang-aliplaye ref="player" :videoUrl="url" @firstFrame="showPoster = false" />
  <image v-if="showPoster" :src="coverUrl"
    style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
    mode="aspectFill" />
</view>

如果需要切换视频时重新显示封面,在切换前将 showPoster 设为 true 即可:

switchVideo(newUrl) {
  this.showPoster = true       // 先显示封面
  this.videoUrl = newUrl       // 切换视频,首帧渲染后 showPoster 自动变为 false
}

进度事件参数说明

iOS 兼容模式下事件参数使用双层 detail 结构,页面侧需兼容读取:

handleProgressUpdate(e) {
  const detail = e?.detail?.detail || e?.detail
  if (!detail) return
  this.currentPosition = detail.position / 1000  // 转换为秒
  this.duration = detail.duration / 1000
}

横竖屏事件参数说明

建议监听 landscape-update 事件缓存结果:

handleLandscapeUpdate(e) {
  const detail = e?.detail?.detail || e?.detail
  if (detail) {
    this.isLandscape = detail.value === 'true'
  }
}

Methods

通过 ref 获取组件实例后调用。

方法 参数 说明
loadSource(url, autoplay) url: string, autoplay: boolean 加载新视频源
play() 开始播放
pause() 暂停播放
togglePlayPause() 切换播放/暂停
stopVideo() 停止播放
seekTo(seconds) seconds: number 跳转到指定秒数
setStartPosition(seconds) seconds: number 设置起播位置(需配合重新加载)
setSpeed(speed) speed: number 设置播放倍速(范围 0-3)
enterFullScreen() 进入全屏
exitFullScreen() 退出全屏
getCurrentPosition() 当前播放进度(毫秒)
getDuration() 视频总时长(毫秒)
getIsLandscapeText() 是否横屏视频,返回 'true' / 'false'
isLandscape() getIsLandscapeText(),兼容旧方法

使用示例

methods: {
  // 播放控制
  handlePlay() {
    this.$refs.player?.play()
  },
  handlePause() {
    this.$refs.player?.pause()
  },

  // 进度跳转
  handleSeek() {
    this.$refs.player?.seekTo(60)  // 跳转到 60 秒
  },

  // 倍速控制(范围 0-3,超出范围会被忽略)
  handleSetSpeed() {
    this.$refs.player?.setSpeed(1.5)
  },

  // 全屏
  handleFullscreen() {
    this.isFullscreen
      ? this.$refs.player?.exitFullScreen()
      : this.$refs.player?.enterFullScreen()
    this.isFullscreen = !this.isFullscreen
  }
}

旧版方法兼容

旧方法 等价新方法
playVideo() play()
pauseVideo() pause()
seekVideo(seconds) seekTo(seconds)

手势操作

手势 功能 控制属性
左右滑动 调节播放进度(最大 ±3 分钟) enableSwipe
上下滑动 调节播放音量(0-100%) enableVolumeSwipe
双击 播放/暂停切换 enableDoubleTap
单击 显示/隐藏控制栏
  • 滑动调进度时,屏幕中央会显示目标时间和进度条提示
  • 滑动调音量时,屏幕中央会显示音量百分比提示
  • 播放中控制栏会在 2.5 秒后自动隐藏,暂停时保持显示

禁用所有手势:

<axiang-aliplaye
  :enableDoubleTap="false"
  :enableSwipe="false"
  :enableVolumeSwipe="false" />

常见问题

1. 如何实现视频续播?

使用 initialPosition 属性 + progress-update 事件:

data() {
  return {
    videoUrl: 'https://example.com/video.mp4',
    initialPosition: 0
  }
},
onLoad() {
  this.initialPosition = uni.getStorageSync('video_position') || 0
},
methods: {
  handleProgressUpdate(e) {
    const detail = e?.detail?.detail || e?.detail
    if (detail) {
      this.currentPosition = detail.position / 1000
    }
  }
},
onUnload() {
  if (this.currentPosition > 0) {
    uni.setStorageSync('video_position', this.currentPosition)
  }
}

2. 如何实现封面图?

使用 firstFrame 事件控制页面侧封面的显隐(参见 firstFrame 事件说明)。

3. 如何自定义播放器 UI?

通过 props 控制各 UI 元素显隐:

<axiang-aliplaye
  :showPlayButton="false"
  :showProgressBar="true"
  :showProgressText="true"
  :showSpeedButton="false"
  :showFullscreenButton="true"
  :showControlBar="true" />

如需完全自定义控制栏,设置 :showControlBar="false" 后自行叠加 UI 层,通过 ref 调用方法控制播放。

注意事项

  1. ⚠️ 配置完 License 后,必须重新制作自定义基座才能生效。
  2. 📱 建议使用 v-if 控制播放器创建和销毁,避免复用状态异常。
  3. ⏱️ seekTo 参数单位是,进度事件和 getCurrentPosition() / getDuration() 返回单位是毫秒
  4. 💾 建议监听 progress-update 缓存进度值,需要时直接读取。
  5. 🖼️ 封面图在页面侧实现,监听 firstFrame 事件控制隐藏时机。

更新日志

查看 CHANGELOG.md 了解详细版本更新记录。

许可证

MIT License

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。