更新记录
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 Key 和 License 证书文件(通常为 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.position、detail.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 调用方法控制播放。
注意事项
- ⚠️ 配置完 License 后,必须重新制作自定义基座才能生效。
- 📱 建议使用
v-if控制播放器创建和销毁,避免复用状态异常。 - ⏱️
seekTo参数单位是秒,进度事件和getCurrentPosition()/getDuration()返回单位是毫秒。 - 💾 建议监听
progress-update缓存进度值,需要时直接读取。 - 🖼️ 封面图在页面侧实现,监听
firstFrame事件控制隐藏时机。
更新日志
查看 CHANGELOG.md 了解详细版本更新记录。
许可证
MIT License

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 2
赞赏 0
下载 12153686
赞赏 1918
赞赏
京公网安备:11010802035340号