更新记录

1.5.2(2026-06-04)

  • 支持鸿蒙端

1.5.1(2026-06-01)

  • IOS侧支持当视频为4:3时显示全屏观看按钮

1.5.0(2026-05-31)

  • MD文档修改
查看更多

平台兼容性

uni-app x(4.66)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 12 - -

xwq-player-video

xwq-player-video 是一个面向 uni-app x 的原生视频播放组件,当前主要用于短视频列表、详情页续播以及带预加载的播放场景。

目录导航

快速上手摘要

首次接入建议先记住下面这几条:

  • 普通公开视频地址:优先使用 httpCache=truepreloadVideo=true
  • author_key= 的签名地址:优先使用 httpCache=falsepreloadVideo=true
  • author_key= 只表示会自动走直连预加载链路,不代表一定要配置 customReferercustomUserAgent
  • 只有源站明确要求校验 Referer / User-Agent 时,才需要传 customReferercustomUserAgent
  • customReferercustomUserAgent 传空串会自动忽略,不会误触发自定义请求头逻辑
  • 页面接入时可以直接参考下方“页面调用示例”,数据源可以直接复制“可直接复制的数据模板”里的模板

最常用的参数组合可以直接参考:

场景 httpCache preloadVideo customReferer / customUserAgent
普通公开 MP4 / CDN 地址 true true 不传
author_key= 的签名地址 false true 按源站要求决定
需要 Referer / User-Agent 的地址 false 或按需 true 传源站要求的值

推荐先从这三个模板里选一个开始接入:

  • normalVideoListTemplate:普通公开地址
  • authorKeyVideoListTemplate:签名地址但不需要额外请求头
  • authorKeyWithHeadersVideoListTemplate:签名地址且需要额外请求头

最小可运行示例:

<template>
    <xwq-player-video
        :list="videoList"
        :httpCache="true"
        :preloadVideo="true"
        :showProgress="true"
        objectFit="FIXED_HEIGHT"
    />
</template>

<script setup lang="uts">
    import type { VideoType } from '@/uni_modules/xwq-player-video/utssdk/interface'

    const videoList : Array<VideoType> = normalVideoListTemplate
</script>

模板替换说明:

  • 普通公开视频地址:使用 normalVideoListTemplate
  • author_key= 的签名地址且不需要额外请求头:使用 authorKeyVideoListTemplate
  • author_key= 的签名地址且源站还要求 Referer / User-Agent:使用 authorKeyWithHeadersVideoListTemplate

组件 Props

下表整理自 components/xwq-player-video/xwq-player-video.uvue

参数名 类型 默认值 说明
list Array<UTSJSONObject> [] 视频数据源,字段结构需满足 VideoType
autoNext boolean false 当前视频播放结束后,是否自动切换到下一条。
httpCache boolean true 是否启用 iOS 代理缓存。对于带签名或鉴权限制的视频地址,通常需要谨慎开启。
preloadVideo boolean false 是否启用 iOS 预加载。首屏和滑动切换后会按当前策略预热后续视频。
showProgress boolean true 是否显示底部播放进度条。
objectFit string '' 视频铺放模式,支持 FILLFITZOOMFIXED_WIDTHFIXED_HEIGHT
navBarColor string #00000000 Android 底部安全区背景色。
customUserAgent string '' iOS 自定义 User-Agent 请求头。空串会自动忽略。
customReferer string '' iOS 自定义 Referer 请求头。空串会自动忽略。
comId string '' 播放器实例唯一标识。不传时组件内部自动生成。

补充说明:

  • 鸿蒙端当前倍速能力请仅使用 0.50.81.01.251.5
  • 如果业务侧自行扩展倍速面板或自定义传值,建议不要传 0.751.752.0 等鸿蒙未支持的档位,避免出现切换后异常或黑屏

页面调用示例

下面按常见接入场景拆成两套示例。

示例 1:普通直链视频

适用于公共 CDN、普通 MP4 地址、无额外请求头要求的视频源。

<template>
    <view class="page-wrap">
        <xwq-player-video
            ref="playerRef"
            :list="videoList"
            :autoNext="false"
            :httpCache="true"
            :preloadVideo="true"
            :showProgress="true"
            objectFit="FIXED_HEIGHT"
            @onLoadNext="handleLoadNext"
            @onChange="handlePlayerChange"
            @onTimeUpdate="handleTimeUpdate"
        />
    </view>
</template>

<script setup lang="uts">
    import { ref } from 'vue'
    import xwqPlayerVideo from '@/uni_modules/xwq-player-video/components/xwq-player-video/xwq-player-video.uvue'
    import type { VideoType } from '@/uni_modules/xwq-player-video/utssdk/interface'

    let playerRef = ref<InstanceType<typeof xwqPlayerVideo> | null>(null)
    const videoList : Array<VideoType> = normalVideoListTemplate

    const handleLoadNext = () => {
        console.log('加载下一页数据')
    }

    const handlePlayerChange = (detail : UTSJSONObject) => {
        console.log('当前播放视频变化', detail)
    }

    const handleTimeUpdate = (detail : UTSJSONObject) => {
        console.log('播放进度更新', detail)
    }
</script>

<style>
    .page-wrap {
        flex: 1;
    }
</style>

示例 2:带 author_key 的签名地址,但不需要额外请求头

适用于以下场景:

  • 视频地址带有 author_key= 这类签名参数
  • 源站本身不要求额外校验 RefererUser-Agent
  • 首播不适合走普通代理缓存链路

说明:

  • author_key= 链接会自动走直连预加载链路
  • 这种场景下通常不需要配置 customReferercustomUserAgent
<template>
    <view class="page-wrap">
        <xwq-player-video
            :list="videoList"
            :autoNext="false"
            :httpCache="false"
            :preloadVideo="true"
            :showProgress="true"
            objectFit="FIXED_HEIGHT"
        />
    </view>
</template>

<script setup lang="uts">
    import type { VideoType } from '@/uni_modules/xwq-player-video/utssdk/interface'

    const videoList : Array<VideoType> = authorKeyVideoListTemplate
</script>

<style>
    .page-wrap {
        flex: 1;
    }
</style>

示例 3:既有签名地址,又要求请求头

适用于以下场景:

  • 视频地址带有 author_key= 这类签名参数
  • 源站同时还要求校验 RefererUser-Agent
<template>
    <view class="page-wrap">
        <xwq-player-video
            :list="videoList"
            :autoNext="false"
            :httpCache="false"
            :preloadVideo="true"
            :showProgress="true"
            objectFit="FIXED_HEIGHT"
            customReferer="https://example.xxxx.cn/"
            customUserAgent="AppleCoreMedia/1.0.0.21E230 (iPhone; U; CPU OS 17_4 like Mac OS X; zh_cn)"
        />
    </view>
</template>

<script setup lang="uts">
    import type { VideoType } from '@/uni_modules/xwq-player-video/utssdk/interface'

    const videoList : Array<VideoType> = authorKeyWithHeadersVideoListTemplate
</script>

<style>
    .page-wrap {
        flex: 1;
    }
</style>

如果你只是想表达“这是一个签名地址,但不需要额外请求头”,最小配置可以简化成下面这样:

<xwq-player-video
    :list="videoList"
    :httpCache="false"
    :preloadVideo="true"
    :showProgress="true"
    objectFit="FIXED_HEIGHT"
/>

组件事件

下表整理自 components/xwq-player-video/xwq-player-video.uvuedefineEmits 和事件转发逻辑。

事件名 回调参数 说明
@onLoadNext 播放列表滑动到接近尾部时触发,用于请求下一页数据。
@onTitleHandler UTSJSONObject 点击标题区域时触发。
@onToolsHandler UTSJSONObject 点击右侧工具栏按钮时触发。
@onPlaying UTSJSONObject 视频开始播放或恢复播放时触发。
@onPause UTSJSONObject 视频暂停时触发。
@onEnded UTSJSONObject 当前视频播放结束时触发。
@onTimeUpdate UTSJSONObject 播放进度更新时持续触发。
@onChange UTSJSONObject 当前播放视频切换时触发。
@onLookAllHandle UTSJSONObject 点击“查看全集”按钮时触发。
@onSelectVideDialogHandle UTSJSONObject 点击底部选集区域时触发。
@onFullscreenExit UTSJSONObject 原生全屏容器退出后触发,用于页面同步外层布局。

组件暴露方法

下表整理自 components/xwq-player-video/xwq-player-video.uvuedefineExpose 暴露的方法。

方法名 参数 说明
play() 播放当前视频。
pause() 暂停当前视频。
playVideo(index) index: number 跳转并播放指定索引的视频。
updateSeekBarProgress(position, progress) position: number, progress: number 更新指定视频的播放进度和进度条位置。
showDialogPlayback() 打开倍速选择弹窗。
requestFullScreen(val) val: boolean 请求进入或退出全屏播放。

使用注意事项

1. httpCache 适用场景

  • 普通直链视频、公共 CDN 地址、无额外鉴权限制的视频地址,优先考虑开启 httpCache
  • 开启后,iOS 侧会优先走代理缓存链路,有利于复播和滑动列表时复用已缓存片段
  • 如果视频地址本身带有强校验、防盗链、签名鉴权或时效性参数,需要结合下面几条一起判断

2. preloadVideo 适用场景

  • 当首个视频起播较慢,或滑动到下一条视频时存在明显等待,可以开启 preloadVideo
  • 开启后,组件会在首屏和滑动切换后提前预热后续视频
  • 对短视频连续播放场景更有帮助,单视频详情页是否开启取决于你的页面交互和带宽策略

3. customUserAgent / customReferer 适用场景

  • 如果视频源站要求特定 User-AgentReferer,需要显式传入 customUserAgentcustomReferer
  • 只要这两个参数中任意一个传入非空值,iOS 侧就会走自定义请求头的直连预加载与播放链路
  • 空串或只包含空白字符的值会被自动忽略,不会误触发自定义请求头逻辑

4. author_key 链接说明

  • 如果视频地址中包含 author_key= 这类签名参数,即使没有配置 customUserAgentcustomReferer,iOS 侧也会走直连预加载链路
  • 这样做是为了避免代理缓存链路对部分带签名地址的首播和预加载稳定性造成影响
  • 这类地址建议优先配合 preloadVideo 使用,通常不建议把它当作纯普通缓存地址处理
  • 只有当源站明确要求校验 Referer / User-Agent 时,才需要继续配置 customUserAgentcustomReferer

5. 参数组合建议

场景 httpCache preloadVideo customUserAgent/customReferer
普通公开 MP4 / CDN 地址 建议开启 按需开启 不需要
需要 Referer / User-Agent 的地址 视情况开启 建议开启 需要配置
author_key 的签名地址 可开但不会走代理首播链路 建议开启 按源站要求决定,非强制
首播敏感、切换频繁的短视频流 视源站能力决定 建议开启 按源站要求配置

6. 鸿蒙端倍率使用限制

  • 鸿蒙端当前建议仅使用 0.50.81.01.251.5 这 5 档倍率
  • 如果你在业务层自定义了倍速面板,建议保持和插件内置鸿蒙档位一致
  • 不建议在鸿蒙端传 0.751.752.0 等未支持档位,否则可能出现倍率切换异常、切视频黑屏或播放状态不稳定

推荐配置速查表

如果你只想快速判断参数怎么配,可以直接参考下表。

视频地址场景 httpCache preloadVideo customReferer customUserAgent 说明
普通公开 MP4 / CDN 地址 true true 或按需 不传 不传 优先走普通缓存和预加载链路。
author_key= 的签名地址 false 或按需 true 按源站要求决定 按源站要求决定 会自动走直连预加载,不代表一定需要请求头。
源站要求 Referer 的地址 false 或按需 true 必传 按源站要求决定 只传源站要求的头即可。
源站要求 User-Agent 的地址 false 或按需 true 按源站要求决定 必传 只传源站要求的头即可。
同时要求 RefererUser-Agent 的地址 false 或按需 true 必传 必传 iOS 会按自定义头直连链路处理。
不确定是否需要请求头的地址 false 起步 true 先不传 先不传 先验证能否播放,失败后再根据源站要求补头。

常见问题 FAQ

1. 为什么开启 httpCache 后反而出现黑屏或首播异常?

  • 常见原因是视频地址带有防盗链、签名鉴权、时效性参数,代理缓存链路转发后源站校验失败
  • 这类场景建议优先关闭 httpCache,并开启 preloadVideo
  • 如果源站还要求特定请求头,需要继续配置 customUserAgentcustomReferer

2. 为什么 author_key 链接不会走代理首播链路?

  • author_key= 这类地址通常属于带签名的时效性播放地址
  • 为了减少代理缓存链路对签名校验和首播稳定性的影响,iOS 侧会把这类地址归到直连预加载链路
  • 所以即使打开了 httpCache,这类链接首播和预加载仍然会优先按直连方式处理

3. author_key 链接是不是一定要配置 customUserAgent / customReferer

  • 不一定
  • author_key= 只表示该地址会自动走直连预加载链路,不代表源站一定要求额外请求头
  • 只有当你的服务端或源站明确要求校验 Referer / User-Agent 时,才需要配置这两个参数

4. 什么情况下必须配置 customUserAgent / customReferer

  • 当视频源站明确要求校验 User-AgentReferer 时必须配置
  • 常见现象包括:浏览器里能播、App 里不能播,或者直接返回 403、无数据、首播一直等待
  • 如果不确定源站是否要求这些头,可以先抓服务端日志或网络日志确认

5. customUserAgent / customReferer 传空串会怎么样?

  • 空串或只包含空白字符的值会被自动忽略
  • 这种情况下不会触发自定义请求头逻辑,播放器会按普通地址处理
  • 这意味着你可以安全地把这两个字段作为可选配置透传给插件

6. 为什么开启 preloadVideo 后还是感觉第一个视频慢?

  • preloadVideo 更擅长优化首屏之后的视频切换体验,以及首个视频的资源准备链路
  • 如果第一个视频本身地址响应慢、鉴权慢、DNS 慢,预加载也无法完全抵消源站本身的耗时
  • 这时建议优先检查视频源响应速度、签名地址生成时机,以及是否需要自定义请求头

7. httpCachepreloadVideo 可以同时开启吗?

  • 可以,同时开启时会根据地址类型自动选择更合适的链路
  • 普通地址更偏向代理缓存链路,带请求头或带 author_key 的地址更偏向直连预加载链路
  • 如果你的列表里混合了多种视频地址,这是比较推荐的配置方式之一

8. 鸿蒙端为什么切换倍率后再切视频可能黑屏?

  • 常见原因是传入了鸿蒙未支持的倍率档位,而不是业务层切页逻辑本身有问题
  • 鸿蒙端请优先确认当前倍率是否属于 0.50.81.01.251.5
  • 如果你自己封装了自定义倍速按钮或弹窗,建议直接复用这组档位,不要额外扩展成 Android / iOS 的档位集合

错误现象排查建议表

如果你遇到的不是“不会配参数”,而是“已经接上了但表现不对”,可以先对照下面这张表排查。

现象 常见原因 优先检查项 建议处理
打开后黑屏 源站鉴权失败、代理链路不适配、地址已过期 是否带签名参数、是否要求请求头、httpCache 是否开启 先关闭 httpCache,开启 preloadVideo,再按源站要求补 customReferer / customUserAgent
返回 403 / 无权限 缺少 RefererUser-Agent 或签名失效 服务端是否校验请求头、签名参数是否过期 按源站要求配置 customReferer / customUserAgent,同时确认播放地址是否仍有效。
第一个视频起播慢 源站首包慢、鉴权慢、签名链接响应慢 是否开启 preloadVideo、源站响应时间、是否直连预加载 优先开启 preloadVideo,必要时关闭 httpCache,并检查源站首包耗时。
能播放但切换下一条慢 后续视频未有效预热、列表切换过快 preloadVideo 是否开启、后续地址是否都可预加载 开启 preloadVideo,并确认后续视频地址没有被请求头或签名限制拦截。
普通链接播放正常,签名链接异常 代理缓存链路对签名地址不稳定 URL 是否包含 author_key=、是否强制走缓存 对签名地址优先使用直连预加载链路,避免把它当普通缓存地址处理。
传了 customReferer / customUserAgent 仍然失败 请求头值不正确,或源站还有其他校验 请求头值是否与服务端要求完全一致 用源站要求的真实值替换示例值,必要时配合服务端日志确认。
空串请求头配置后仍按普通地址处理 空串被自动忽略 是否实际传入了有效非空值 这是预期行为;只有传入非空且非空白字符串时,才会启用自定义请求头逻辑。

推荐接入流程

如果你是第一次接入这个插件,建议按下面顺序验证,能更快定位问题属于“地址本身”、“签名链路”还是“请求头要求”。

第一步:先用普通地址验证基础播放

  • 先准备一个无需鉴权、无需额外请求头的普通 MP4 或 CDN 地址
  • 建议先配置:httpCache=truepreloadVideo=true
  • 先确认基础播放、切换下一条、进度更新、事件回调都正常

第二步:再验证签名地址是否能正常播放

  • 把数据源切换成带 author_key= 的签名地址
  • 先不要急着配置 customReferer / customUserAgent
  • 建议先配置:httpCache=falsepreloadVideo=true
  • 如果此时能正常播放,说明你的源站只是签名地址,不一定要求额外请求头

第三步:如果签名地址失败,再判断是否需要请求头

  • 如果带 author_key 的地址依然黑屏、403 或一直等待
  • 再确认源站是否要求校验 Referer / User-Agent
  • 只有在源站明确要求的情况下,再追加 customReferercustomUserAgent

第四步:最后再决定是否重新开启 httpCache

  • 普通公开地址通常可以保留 httpCache=true
  • 带签名参数、带时效性校验或带特殊源站限制的地址,通常建议优先保持 httpCache=false
  • 如果你一定要在复杂源站场景下开启缓存,建议先做真机验证,不要只依赖单个测试地址

第五步:列表场景重点验证首屏和下一条

  • 确认第一个视频起播时间是否可接受
  • 确认滑动到下一条、下下条时是否明显变快
  • 如果首屏正常但切换慢,优先检查 preloadVideo
  • 如果普通地址正常但签名地址异常,优先检查 author_key 链路和请求头配置

可直接复制的数据模板

下面把 README 里示例使用到的 videoList 模板统一整理出来,接入时可以直接复制后改地址和文案。

模板 1:普通直链视频列表

const normalVideoListTemplate : Array<VideoType> = [
    {
        isPlaying: false,
        duration: 0,
        vduser: '追风少女',
        nickname: '妈妈不要哭泣',
        videoId: '672b6be8e4ca03e4581a0063',
        playurl: 'https://example.com/short_dram/002.mp4',
        vdtitle: '01黄亚男早年丧偶,带着年幼的两个儿子和一个女儿艰难度日',
        position: 0,
        showTitleArrow: true,
        toolInfo: [
            { icon: 'shoucang', text: '追剧' },
            { icon: 'dianzan', text: '点赞', num: 99 },
            { icon: 'share', text: '分享' }
        ],
        showLookAllBtn: true,
        lookAllBtnText: '观看完整短剧 · 全80集1',
        showBottomArea: false,
        bottomAreaBtnText: '选集 · 全80集 · vip免费'
    }
]

模板 2:author_key 签名地址列表

const authorKeyVideoListTemplate : Array<VideoType> = [
    {
        isPlaying: false,
        duration: 0,
        vduser: '追风少女💓( ˘ ³˘)💋',
        nickname: '签名短剧示例',
        videoId: 'author-key-demo-001',
        playurl: 'https://example.com/video/001.m3u8?author_key=abc123',
        vdtitle: '示例:带签名参数的短剧视频地址',
        position: 0,
        showTitleArrow: true,
        toolInfo: [
            { icon: 'shoucang', text: '追剧' },
            { icon: 'dianzan', text: '点赞', num: 99 },
            { icon: 'share', text: '分享' }
        ],
        showLookAllBtn: true,
        lookAllBtnText: '观看完整短剧 · 全80集1',
        showBottomArea: false,
        bottomAreaBtnText: '选集 · 全80集 · vip免费'
    }
]

模板 3:author_key + 自定义请求头列表

const authorKeyWithHeadersVideoListTemplate : Array<VideoType> = [
    {
        isPlaying: false,
        duration: 0,
        vduser: '追风少女💓( ˘ ³˘)💋',
        nickname: '签名 + 请求头示例',
        videoId: 'author-key-header-demo-001',
        playurl: 'https://example.xxxx.cn/static/ceshi/263.mp4?author_key=abc123',
        vdtitle: '示例:签名地址且源站要求附加请求头',
        position: 0,
        showTitleArrow: true,
        toolInfo: [
            { icon: 'shoucang', text: '追剧' },
            { icon: 'dianzan', text: '点赞', num: 99 },
            { icon: 'share', text: '分享' }
        ],
        showLookAllBtn: true,
        lookAllBtnText: '观看完整短剧 · 全80集1',
        showBottomArea: false,
        bottomAreaBtnText: '选集 · 全80集 · vip免费'
    }
]

VideoType 数据说明

VideoType 的可直接复制示例已经统一整理到上面的 可直接复制的数据模板 小节。

  • 普通公开地址示例:normalVideoListTemplate
  • author_key 签名地址示例:authorKeyVideoListTemplate
  • author_key + 自定义请求头示例:authorKeyWithHeadersVideoListTemplate

下面保留字段级说明,方便你按需自行组装数据源。

VideoType 字段说明

下表整理自 utssdk/interface.uts 中的 VideoType

字段名 类型 必填 说明
isPlaying boolean 当前视频是否处于播放状态。
duration number 视频总时长,单位秒。
vduser string 上传用户名称。
nickname string 页面展示昵称。
videoId string 视频唯一标识。
playurl string 实际播放地址。
vdtitle string 视频标题或简介。
position number 当前播放进度,单位秒。
showTitleArrow boolean 是否显示标题右侧箭头。
toolInfo Array<ToolInfoType> 右侧互动工具栏数据。
showLookAllBtn boolean 是否显示“查看全集”按钮。
lookAllBtnText string “查看全集”按钮文案。
showBottomArea boolean 是否显示底部操作区域。
bottomAreaBtnText string 底部操作区域左侧按钮文案。

ToolInfoType 字段补充

VideoType.toolInfo 中每一项都应满足以下结构:

字段名 类型 必填 说明
icon string 工具图标资源名。
text string 工具文案。
num number | null 工具对应的数字,可为空。

其他插件预览

隐私、权限声明

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

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

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