更新记录
0.1.0(2026-06-26)
初版发布
平台兼容性
uni-app x(4.87)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | 5.0 | √ | × | - |
ff-vlc-video-player
基于 VideoLAN libVLC / MobileVLCKit 的 uni-app x UTS 视频播放器插件。
特性
- ✅ 多协议支持:RTSP / RTMP / HTTP / HTTPS / HLS(m3u8) / 本地文件
- ✅ 原生渲染:Android
VLCVideoLayout+TextureView,iOSVLCMediaPlayer.drawable - ✅ 播放控制:播放/停止/暂停/恢复/跳转(时间&进度)
- ✅ 高级功能:倍速、音量、画面缩放模式、宽高比
- ✅ 录制功能:Android/iOS 均支持录制到本地
- ✅ 抓图功能:iOS 原生支持;Android 通过 TextureView 位图实现
- ✅ 事件回调:播放状态、进度、错误事件回调
平台依赖
| 平台 | 依赖 | 版本 | 来源 |
|---|---|---|---|
| Android | org.videolan.android:libvlc-all |
3.6.4 | Maven Central |
| iOS | MobileVLCKit |
3.7.3 | CocoaPods (CDN) |
⚠️ 重要提示
- Android 引入原生依赖需提交云端打包生成自定义基座后生效
- iOS 真机运行需 Mac 安装 Xcode + CocoaPods;Windows 或无 Xcode 环境需云打包自定义基座
Android 权限
插件自动申请以下权限:
| 权限 | 用途 |
|---|---|
INTERNET |
网络流媒体播放 |
RECORD_AUDIO |
录制功能 |
WRITE_EXTERNAL_STORAGE |
抓图/录制文件保存 |
READ_EXTERNAL_STORAGE |
本地文件播放 |
安装
将 ff-vlc-video-player 目录放置于项目的 uni_modules/ 目录下。
使用方式
方式一:组件方式(推荐)
<template>
<view style="flex:1;">
<ff-vlc-video-player
ref="player"
url="rtsp://192.168.1.100:554/stream"
:auto-play="true"
:options="{ networkCaching: 3000, rtspTcp: true }"
@state-change="onStateChange"
@time-change="onTimeChange"
@error="onError"
/>
</view>
</template>
<script setup lang="uts">
const player = ref()
// 状态变化回调
function onStateChange(e: VlcStateChangeEvent): void {
console.log('播放状态:', e.state)
}
// 进度变化回调
function onTimeChange(e: VlcTimeChangeEvent): void {
console.log('当前时间:', e.time, '总时长:', e.duration)
}
// 错误回调
function onError(e: VlcErrorEvent): void {
console.log('播放错误:', e.message)
}
// 调用组件方法
function handleStop(): void {
player.value?.stop()
}
function handleSeek(): void {
player.value?.seekTo(30000) // 跳转到30秒
}
</script>
方式二:Context API 方式
<template>
<view style="flex:1;">
<ff-vlc-video-player ref="player" />
</view>
</template>
<script setup lang="uts">
import { createVlcVideoPlayerContext, IVlcVideoPlayerContext } from '@/uni_modules/ff-vlc-video-player'
const player = ref()
let ctx: IVlcVideoPlayerContext | null = null
onReady(() => {
ctx = createVlcVideoPlayerContext('player', getCurrentInstance().proxy)
if (ctx != null) {
ctx!.onStateChange((e) => { console.log('状态:', e.state) })
ctx!.onTimeChange((e) => { console.log('进度:', e.time) })
// 开始播放
ctx!.play('rtsp://192.168.1.100:554/stream', { networkCaching: 5000 })
}
})
onUnmounted(() => {
ctx?.destroy()
})
</script>
组件 Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
url |
string |
- | 播放地址(RTSP/HTTP/RTMP/HLS等) |
autoPlay |
boolean |
false |
是否自动播放 |
options |
VlcMediaOptions |
- | 播放选项 |
组件 Events
| 事件名 | 参数类型 | 说明 |
|---|---|---|
stateChange |
VlcStateChangeEvent |
播放状态变化 |
timeChange |
VlcTimeChangeEvent |
播放时间变化 |
positionChange |
VlcPositionChangeEvent |
播放位置(比例)变化 |
error |
VlcErrorEvent |
播放错误 |
组件 Methods(通过 ref 调用)
| 方法 | 参数 | 说明 |
|---|---|---|
play(url, options?) |
string, VlcMediaOptions? |
播放网络流 |
playFile(filePath) |
string |
播放本地文件 |
stop() |
- | 停止播放 |
pause() |
- | 暂停播放 |
resume() |
- | 恢复播放 |
seekTo(timeMs) |
number |
跳转到指定时间(毫秒) |
setRate(rate) |
number |
设置倍速(1.0为正常) |
setVolume(volume) |
number |
设置音量(0~100) |
enableAudio(isOpen) |
boolean |
开关声音 |
screenshot(filePath) |
string |
抓图保存 |
destroy() |
- | 释放资源 |
播放选项 VlcMediaOptions
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
networkCaching |
number |
3000 | 网络缓存时间(毫秒) |
rtspTcp |
boolean |
true |
RTSP 强制走 TCP(降低丢包花屏) |
hardwareDecoding |
boolean |
true |
启用硬件解码 |
fileCaching |
number |
1000 | 文件缓存时间(毫秒) |
extraOptions |
string[] |
- | 额外 libvlc 选项(原生透传) |
播放器状态 VlcPlayerState
| 状态 | 说明 |
|---|---|
opening |
正在打开流 |
buffering |
缓冲中 |
playing |
播放中 |
paused |
已暂停 |
stopped |
已停止 |
ended |
播放结束 |
error |
播放出错 |
画面缩放模式 VlcScaleType
| 模式 | 说明 |
|---|---|
BEST_FIT |
适配(保持比例,可能留边) |
FIT_SCREEN |
适配屏幕 |
FILL |
拉伸填充 |
ORIGINAL |
原始尺寸 |
R16_9 |
强制 16:9 |
R4_3 |
强制 4:3 |
错误码
| 错误码 | 说明 |
|---|---|
9020001 |
LibVLC 初始化失败 |
9020002 |
播放失败 |
9020003 |
无效的播放地址 |
9020004 |
播放器未就绪 |
9020005 |
操作不支持 |
Context API(IVlcVideoPlayerContext)
通过 createVlcVideoPlayerContext(id, component) 获取播放器上下文实例,支持以下方法:
播放控制
// 播放网络流
ctx.play('rtsp://...', { networkCaching: 5000 })
// 播放本地文件
ctx.playFile('/path/to/video.mp4')
// 停止/暂停/恢复
ctx.stop()
ctx.pause()
ctx.resume()
// 跳转
ctx.seekTo(30000) // 跳转到30秒
ctx.seekToPosition(0.5) // 跳转到50%位置
播放参数
// 倍速播放
ctx.setRate(2.0) // 2倍速
// 音量控制
ctx.setVolume(50) // 设置音量50%
ctx.enableAudio(false) // 静音
画面控制
// 缩放模式
ctx.setScaleType('R16_9')
// 宽高比
ctx.setAspectRatio('16:9')
ctx.setAspectRatio(null) // 还原默认
信息获取
const duration = ctx.getDuration() // 总时长(毫秒)
const time = ctx.getCurrentTime() // 当前时间(毫秒)
const position = ctx.getPosition() // 进度比例(0~1)
const playing = ctx.isPlaying() // 是否播放中
录制与抓图
// 开始录制
ctx.startRecord('/path/to/record/dir')
ctx.stopRecord()
// 抓图
ctx.screenshot('/path/to/screenshot.jpg')
事件监听
// 注册回调
ctx.onStateChange((e) => { console.log('状态:', e.state) })
ctx.onTimeChange((e) => { console.log('时间:', e.time) })
ctx.onPositionChange((e) => { console.log('位置:', e.position) })
ctx.onError((e) => { console.log('错误:', e.message) })
// 取消回调
ctx.offStateChange()
ctx.offTimeChange()
ctx.offPositionChange()
ctx.offError()
// 释放资源
ctx.destroy()
常见问题
Q: Android 云打包后播放失败?
确保在 HBuilderX 中正确提交云打包,选择「使用原生插件」选项,并等待自定义基座生成完成后再运行。
Q: RTSP 播放花屏/卡顿?
尝试增大 networkCaching 值(如 5000ms),并确保 rtspTcp: true 以使用 TCP 协议降低丢包:
ctx.play('rtsp://...', { networkCaching: 5000, rtspTcp: true })
Q: iOS 真机调试报错?
确保 Mac 已安装 Xcode 和 CocoaPods,并执行 pod install 后再运行。
Q: 录制文件找不到?
录制功能需要应用有存储权限,且传入的目录路径必须存在。建议使用应用私有目录:
// Android
const recordDir = `${uni.env.USER_DATA_PATH}/record`
// iOS
const recordDir = `${uni.env.USER_DATA_PATH}/record`
相关链接
版本历史
| 版本 | 更新内容 |
|---|---|
| 0.1.0 | 初版发布,支持 Android/iOS 双端播放、录制、抓图 |
许可证
本插件基于 libVLC,遵循 LGPL v2.1 许可证。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 60
赞赏 3
下载 12342039
赞赏 1924
赞赏
京公网安备:11010802035340号