更新记录
1.0.9(2026-06-03)
支持vlc自定义参数
1.0.8(2026-06-03)
退出/打开全屏的续播能力优化
1.0.7(2026-06-02)
增加全屏退出事件
查看更多平台兼容性
uni-app(4.73)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | × | × | × | √ | 1.0.9 | 5.1 | 1.0.9 | 12 | 1.0.9 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
hl-vlc-view 视频播放插件
基于 VLC 的 RTSP 视频流播放 UniApp UTS 原生插件
功能说明
本插件专注于 RTSP 视频流播放,支持海康威视等摄像头的实时视频预览。
平台支持
| 平台 | 支持状态 | 最低版本 |
|---|---|---|
| Android | 支持 | Android 4.4+ (API 19+) |
| iOS | 支持 | iOS 12.0+ |
使用方法
基础用法 需要在nvue页面中使用
<template>
<view class="container">
<hl-vlc-view
ref="player"
:src="rtspUrl"
:player-options="playerInitOptions"
class="video-player"
@event="handleEvent"
/>
</view>
</template>
<script setup>
const player = ref(null);
const rtspUrl = ref('rtsp://admin:pass@ip:554/Streaming/Channels/101');
const playerInitOptions = {
autoplay: true,
autoReconnect: true,
networkCache: 600,
playbackProfile: 'smooth'
};
// 事件处理
const handleEvent = (e) => {
const fields = e.detail?.dynamicJSONFields ?? e.detail ?? e;
const event = fields.event;
switch(event) {
case 'timeUpdate':
console.log(`当前时间: ${fields.currentTime}ms, 总时长: ${fields.duration}ms`);
break;
case 'playStateChanged':
console.log('播放状态变更:', fields.description);
break;
}
};
</script>
<style>
.video-player {
width: 100%;
height: 225px;
}
</style>
初始化配置对象
推荐通过 playerOptions 统一传入初始化参数,而不是拆成多个独立属性。
const playerInitOptions = {
autoplay: false,
networkCache: 600,
autoReconnect: true,
connectionTimeout: 8000,
soundEnabled: true,
volume: 100,
playbackRate: 1.0,
aspectRatio: 'auto',
videoScale: 1.0,
audioTrack: 0,
loop: false,
playbackProfile: 'smooth'
};
支持的 playerOptions 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
autoplay |
boolean |
是否自动播放 |
networkCache |
number |
网络缓存时间,单位毫秒 |
autoReconnect |
boolean |
是否开启自动重连 |
connectionTimeout |
number |
连接超时,单位毫秒 |
soundEnabled |
boolean |
是否启用声音 |
volume |
number |
初始音量,范围 0-100 |
playbackRate |
number |
初始倍速 |
aspectRatio |
string |
初始画面比例,如 auto / 16:9 / 4:3 |
videoScale |
number |
初始画面缩放 |
audioTrack |
number |
初始音轨索引 |
loop |
boolean |
是否循环播放 |
playbackProfile |
string |
播放策略,可选 default / smooth / lowQuality |
smoothMode |
boolean |
显式开启流畅优先策略,优先级高于 playbackProfile |
lowQualityMode |
boolean |
显式开启低画质优先策略,优先级高于 playbackProfile |
高级 VLC 参数
如果基础参数还不够,可以继续在 playerOptions 里传入更细的 VLC 调优字段。
const playerInitOptions = {
autoplay: false,
playbackProfile: 'smooth',
networkCache: 600,
liveCache: 180,
audioCache: 240,
rtspTcp: true,
rtspTimeout: 3000,
rtspFrameBufferSize: 262144,
clockJitter: 600,
clockSynchro: 1,
dropLateFrames: true,
skipFrames: true,
decoderThreads: 6,
hardwareDecoding: true,
fastDecode: true,
directRendering: true
};
常用高级字段:
| 字段 | 类型 | 说明 |
|---|---|---|
liveCache |
number |
单独指定 live-caching |
fileCache |
number |
单独指定 file-caching |
audioCache |
number |
单独指定 audio-caching |
soutMuxCache |
number |
单独指定 sout-mux-caching |
rtspTcp |
boolean |
是否强制 RTSP 走 TCP |
rtspTimeout |
number |
RTSP 超时时间,单位毫秒 |
rtspFrameBufferSize |
number |
RTSP 帧缓冲参数 |
rtspKeepaliveInterval |
number |
RTSP 保活间隔,单位秒 |
rtspLowDelay |
boolean |
是否启用 RTSP 低延迟模式 |
rtspFastPause |
boolean |
是否启用 RTSP 快速暂停/恢复 |
rtspFrameDrop |
boolean |
是否启用 RTSP 帧丢弃策略 |
clockJitter |
number |
时钟抖动补偿 |
clockSynchro |
number |
时钟同步开关,通常为 0 或 1 |
dropLateFrames |
boolean |
是否丢弃延迟帧 |
skipFrames |
boolean |
是否允许跳帧 |
hardwareDecoding |
boolean |
是否启用硬件解码 |
decoderThreads |
number |
解码线程数 |
fastDecode |
boolean |
是否启用快速解码 |
hurryUp |
boolean |
是否启用快速追帧 |
directRendering |
boolean |
是否启用直接渲染 |
audioTimeStretch |
boolean |
是否启用音频时间拉伸 |
audioDesync |
number |
音频去同步阈值 |
skipLoopFilter |
number |
解码阶段的 loop filter 跳过级别 |
skipIdct |
number |
解码阶段的 IDCT 跳过级别 |
skipFrame |
number |
解码阶段的跳帧级别 |
udpTimeout |
number |
UDP 超时时间 |
rtmpBufferSize |
number |
RTMP 缓冲区大小 |
avcodecHw |
string |
指定 VLC 硬解实现 |
avcodecHwPixelFormat |
string |
指定硬解像素格式 |
rtspUserAgent |
string |
自定义 RTSP User-Agent |
说明:网络建连、缓冲、解码类参数建议在播放前设置;如果在播放中动态修改,通常需要执行 reconnect()、replay() 或重新 setSource() 后才会对新的媒体会话生效。
组件 API 列表
通过 ref 调用组件方法:
播放控制
| 方法名 | 参数 | 说明 |
|---|---|---|
playVideo(url: string) |
url: 视频地址 |
开始播放 |
pauseVideo() |
无 | 暂停播放 |
resumeVideo() |
无 | 恢复播放 |
stopVideo() |
无 | 停止播放 |
replay() |
无 | 重新播放当前地址 |
seekTo(ms: number) |
ms: 毫秒 |
跳转到指定时间 |
fastForward(sec: number) |
sec: 秒 |
快进(默认10秒) |
fastBackward(sec: number) |
sec: 秒 |
快退(默认10秒) |
声音与画面
| 方法名 | 参数 | 说明 |
|---|---|---|
setVolume(0-100) |
volume: 音量值 |
设置音量 |
mute() |
无 | 静音 |
unmute() |
无 | 取消静音 |
setSoundEnabled(enable: bool) |
true/false |
开启/关闭声音 |
setAspectRatio(ratio: string) |
"16:9", "4:3", "auto" |
设置画面比例 |
setVideoScale(scale: number) |
0.1 - 3.0 |
设置画面缩放 |
setPlaybackRate(rate: number) |
0.25 - 4.0 |
设置播放倍速 |
setAudioTrack(index: number) |
index: 轨道索引 |
切换音轨 |
录制与截图
| 方法名 | 说明 | 结果获取 |
|---|---|---|
startRecording() |
开始录制视频 | 监听 recordingStarted 事件 |
stopRecording() |
停止录制并保存 | 监听 recordingStopped 事件,data.path 为文件路径 |
takeSnapshot() |
视频截图 | 监听 snapshotTaken 事件,data.path 为图片路径 |
网络与配置
| 方法名 | 参数 | 说明 |
|---|---|---|
reconnect() |
无 | 主动尝试重连 |
setConnectionTimeout(ms) |
ms: 毫秒 |
设置连接超时时间 |
setAutoReconnect(enable) |
bool |
开启/关闭自动重连 |
setNetworkCache(ms) |
ms: 毫秒 |
设置网络缓存大小 |
setVlcIntOption(key, value) |
key: 参数名 |
动态设置 VLC 整数参数 |
setVlcBooleanOption(key, value) |
key: 参数名 |
动态设置 VLC 布尔参数 |
setVlcStringOption(key, value) |
key: 参数名 |
动态设置 VLC 字符串参数 |
状态查询 (同步返回)
| 方法名 | 返回类型 | 说明 |
|---|---|---|
isPlaying() |
boolean |
是否正在播放 |
isRecording() |
boolean |
是否正在录制 |
isMuted() |
boolean |
是否静音 |
isInitialized() |
boolean |
组件是否初始化完成 |
getPlayState() |
string |
获取当前状态描述 |
getCurrentTime() |
number |
获取当前播放时间 (ms) |
getDuration() |
number |
获取总时长 (ms) |
getBufferProgress() |
number |
获取缓冲进度 (0-100) |
getVideoInfo() |
object |
获取宽、高、时长等综合信息 |
事件文档
组件通过 @event 回调对外发送事件。e.detail 为平铺后的事件对象,至少包含 event 字段,其他数据字段与事件名处于同一层级。
事件名 (event) |
触发时机 | data 数据结构 |
|---|---|---|
componentReady |
组件加载完成 | { isInitialized, isReadyToPlay } |
timeUpdate |
播放时每500ms触发 | { currentTime (ms), duration (ms), bufferProgress (0-100) } |
playStateChanged |
播放状态变更 | { oldState, newState, description } |
connectionStateChanged |
连接状态变更 | { oldState, newState } |
recordingStarted |
录制开始 | null |
recordingStopped |
录制结束 | { path: "绝对文件路径" } |
snapshotTaken |
截图成功 | { path: "绝对图片路径" } |
videoLoaded |
视频加载成功 | null |
videoLoadFailed |
视频加载失败 | { message, url } |
error |
发生错误 | { message } |
warning |
警告信息 | { message } |
bufferingProgress |
缓冲中 | { progress: 0-100 } |
fullscreenEnter |
进入全屏后 | { url: "当前播放地址" } |
fullscreenExit |
退出全屏后 | { url: "当前播放地址" } |
开发注意事项
-
文件路径:
recordingStopped和snapshotTaken返回的都是绝对路径。在 UniApp 中使用时,可能需要转换为file://协议或使用相对路径(取决于具体 API 要求),但在本插件中直接返回原生路径。 -
权限要求:
- Android:需要
INTERNET权限,插件已自动配置。 - iOS:不需要特殊权限即可播放,但录制可能涉及文件写入权限。
- Android:需要
-
生命周期管理:建议在页面
onUnload或组件销毁时主动调用stopVideo(),虽然插件会自动处理,但主动释放资源是个好习惯。 -
RTSP 协议:
- 支持 RTSP/TCP 和 RTSP/UDP 两种传输协议
- 支持 H.264/H.265 编码格式
- 建议使用 TCP 协议以获得更稳定的连接
-
性能优化:
timeUpdate事件默认每 500ms 触发一次- 如果不需要实时进度,可以不监听此事件以减少开销
- 建议根据网络情况调整
setNetworkCache参数
-
错误处理:
- 建议监听
error和videoLoadFailed事件 - 可以通过
setAutoReconnect(true)启用自动重连 - 连接超时后可以调用
reconnect()手动重试
- 建议监听
全屏模式
插件支持全屏播放功能,两端实现方式不同:
- iOS:调用
openFullscreen()会在当前视图基础上全屏,支持手势控制。 - Android:调用
openFullscreen()会启动一个新的 Activity (FullscreenActivity) 进行沉浸式播放,支持自动隐藏状态栏和导航栏。
核心特性
- 低延迟播放:基于 VLC 引擎,支持低延迟的 RTSP 流播放
- 实时进度回调:通过
timeUpdate事件实时获取播放进度 - 录制与截图:支持边播边录,单帧截图功能
- 状态管理:完善的播放状态机,支持多种播放状态回调
- 网络优化:支持自动重连、网络缓存调整、连接超时设置
- 音频控制:支持音量调节、静音、多音轨切换
- 画面调整:支持画面比例、缩放、倍速播放
常见问题
Q: 为什么播放卡顿或延迟高?
A: 可以尝试以下方法:
- 调整网络缓存:
setNetworkCache(300)(单位:毫秒) - 检查网络连接质量
- 确认 RTSP 流的码率和分辨率是否合适

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