更新记录
1.0.0(2026-09-03)
- 初始化项目框架
- 支持 MP4/H265/FLV/HLS 多格式播放
- 支持 RTMP/HTTP-FLV/HLS 直播拉流
- H265 硬件解码(自动检测 + 软解回退)
- 直播自动重连(指数退避策略)
- 全屏/退出全屏
- 音量、亮度、倍速控制
- 画面适配模式(fit/fill/crop)
- 截图功能
- Android/iOS/HarmonyOS 三端兼容
平台兼容性
uni-app x(5.0)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
6.0 |
16 |
√ |
- |
d-video-player
uni-app x UTS 原生视频播放器插件
支持 H265 硬解、FLV/HLS/RTMP 直播拉流,提供完整的播放器 API,兼容 Android/iOS/HarmonyOS 三端。
特性
- MP4、H265、FLV、HLS 多格式支持
- 直播拉流:RTMP、HTTP-FLV、HLS
- H265 硬件解码(自动检测,软解回退)
- 自动重连(指数退避策略)
- 全屏/退出全屏
- 音量/亮度控制
- 倍速播放(0.25x-4.0x)
- 画面适配(fit/fill/crop)
- 截图(base64)
- 直播流切换到
安装
// manifest.json
{
"uni_modules": {
"d-video-player": {
"version": "1.0.0"
}
}
}
快速开始
import { VideoPlayer } from '@/uni_modules/d-video-player'
const player = new VideoPlayer()
// 初始化
player.create({ width: 300, height: 200 })
// 加载点播
player.setSource({ url: 'https://example.com/video.mp4', type: 'auto' })
player.play()
// 加载直播
player.playLive({
url: 'https://example.com/live.flv',
protocol: 'auto',
bufferDuration: 2000,
reconnect: true,
reconnectDelay: 3000,
reconnectCount: 5
})
API
初始化
| 方法 |
说明 |
create(options) |
创建播放器实例 |
destroy() |
销毁播放器 |
源配置
interface VideoSource {
url: string
type?: 'flv' | 'hls' | 'mp4' | 'rtmp' | 'auto'
headers?: Record<string, string>
startTime?: number
}
interface LiveSource {
url: string
protocol?: 'rtmp' | 'flv' | 'hls' | 'auto'
headers?: Record<string, string>
bufferDuration?: number // 默认 2000ms
minBufferDuration?: number // 最小缓冲
reconnect?: boolean // 自动重连
reconnectDelay?: number // 重连间隔,默认 3000ms
reconnectCount?: number // 最大重连次数,默认 5
}
interface PlaybackConfig {
autoplay?: boolean
loop?: boolean
muted?: boolean
volume?: number
playbackRate?: number
isLive?: boolean
enableH265?: boolean
enableCache?: boolean
}
播放控制
| 方法 |
说明 |
setSource(source) |
设置点播源 |
setConfig(config) |
设置播放配置 |
play() |
开始播放 |
pause() |
暂停播放 |
stop() |
停止播放 |
seekTo(position) |
跳转到指定位置(ms) |
resume() |
恢复播放 |
playLive(source) |
开始直播 |
stopLive() |
停止直播 |
switchStream(url) |
切换直播流 |
pauseLive() |
暂停直播渲染 |
resumeLive() |
恢复直播渲染 |
状态查询
| 方法 |
返回 |
getPlayState() |
idle/loding/playing/paused/buffering/completed/error |
getLiveState() |
idle/connecting/connected/buffering/live/reconnecting/error |
getCurrentPosition() |
当前播放位置(ms) |
getDuration() |
总时长(ms) |
getVolume() |
音量 0-1 |
getPlaybackRate() |
当前倍速 |
getStreamInfo() |
流信息 |
getCurrentBitrate() |
当前码率(bps) |
isPlaying() |
是否正在播放 |
isFullscreen() |
是否全屏 |
音视频控制
| 方法 |
说明 |
setVolume(0-1) |
设置音量 |
setMute(bool) |
设置静音 |
setPlaybackRate(rate) |
设置倍速 |
setMirror(bool) |
设置镜像 |
画面控制
| 方法 |
说明 |
setAspectRatio('fit/fill/crop') |
画面适配模式 |
setBrightness(0-1) |
设置屏幕亮度 |
takeSnapshot() |
截图,返回 base64 |
全屏
| 方法 |
说明 |
enterFullscreen() |
进入全屏 |
exitFullscreen() |
退出全屏 |
事件
| 事件 |
回调参数 |
说明 |
onPlayStateChange |
(state: string) |
播放状态变化 |
onProgress |
(current: number, duration: number) |
播放进度 |
onError |
(errCode: number, errMsg: string) |
错误回调 |
onLiveStateChange |
(state: string) |
直播状态变化 |
onFirstFrame |
() |
首帧渲染 |
onSeekComplete |
() |
Seek 完成 |
onH265Fallback |
() |
H265 硬解回退 |
onReconnectAttempt |
(attempt: number, max: number) |
重连尝试 |
onFullscreenChange |
(isFullscreen: boolean) |
全屏状态变化 |
onBuffering |
(percent: number) |
缓冲进度 |
错误码
| 错误码 |
说明 |
| 9020001 |
播放器初始化失败 |
| 9020002 |
源地址解析失败 |
| 9020003 |
H265 硬解不可用 |
| 9020004 |
FLV 解封装失败 |
| 9020005 |
网络连接失败 |
| 9020006 |
播放超时 |
| 9020007 |
渲染器创建失败 |
| 9020008 |
不支持的操作 |
| 9020009 |
缓存写入失败 |
| 9020010 |
权限不足 |
| 9020011 |
直播连接失败 |
| 9020012 |
直播流格式不支持 |
| 9020013 |
直播重连耗尽 |
| 9020014 |
直播超时 |
| 9020015 |
直播已停止 |
各平台限制
| 特性 |
Android |
iOS |
HarmonyOS |
| MP4 |
✅ |
✅ |
✅ |
| H265 |
✅ 硬解+软解回退 |
✅ VideoToolbox |
✅ 系统解码器 |
| FLV |
✅ 自定义解封装 |
✅ AVPlayer/DisplayLayer |
✅ HTTP 拉流 |
| HLS |
✅ ExoPlayer |
✅ AVPlayer |
✅ AVPlayer |
| RTMP |
✅ 自定义拉流 |
✅ FFmpeg |
⚠️ 需 FFmpeg 桥接 |
| 全屏 |
✅ |
✅ |
✅ |
| 截图 |
✅ |
✅ |
⚠️ 有限支持 |
许可证
MIT