更新记录
1.0.0(2026-04-01)
初始版本,支持单帧/批量截图、本地/网络视频、等比缩放
平台兼容性
uni-app(4.0)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-vue插件版本 |
app-nvue |
app-nvue插件版本 |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
| - |
- |
- |
- |
√ |
1.0.0 |
√ |
1.0.0 |
5.0 |
1.0.0 |
12 |
1.0.0 |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(5.0)
| Chrome |
Safari |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
微信小程序 |
| - |
- |
5.0 |
1.0.0 |
12 |
1.0.0 |
- |
- |
其他
dh-video-thumbnail UTS 原生视频截图插件(Android + iOS)

基于 Android / iOS 的原生帧提取插件,支持毫秒级精度的单帧截图、批量截图、缩略图生成,以及本地/网络视频。
快速开始
import { getThumbnail, getThumbnails } from '@/uni_modules/dh-video-thumbnail';
// 单帧截图:提取第 3 秒帧
getThumbnail({
videoPath: 'file:///var/mobile/.../video.mp4',
time: 3000, // 毫秒
width: 320, // 0 = 原始宽度
quality: 80, // 0-100
keepAspectRatio: true,
success: (res) => {
console.log(res.path); // file:///tmp/dh_vt_xxx.jpg
console.log(res.width); // 320
console.log(res.height); // 180
},
fail: (err) => {
console.log(err.errCode, err.errMsg);
},
});
// 批量截图:按 2 秒间隔截取前 6 帧
getThumbnails({
videoPath: 'file:///var/mobile/.../video.mp4',
interval: 2000,
count: 6,
width: 200,
success: (res) => {
console.log(res.paths); // string[]
console.log(res.times); // number[](毫秒)
},
});
API
getThumbnail(options)
提取单帧截图。
| 参数 |
类型 |
默认值 |
说明 |
videoPath |
string |
— |
视频路径,支持 file:// 本地路径或 http/https 网络链接 |
time |
number |
0 |
提取时间点(毫秒),超出时长取最后一帧 |
width |
number |
0 |
缩略图宽度(px),0 使用原始宽度 |
height |
number |
0 |
缩略图高度(px),0 使用原始高度 |
quality |
number |
80 |
JPEG 压缩质量(0–100) |
keepAspectRatio |
boolean |
true |
是否等比缩放 |
success |
Function |
— |
成功回调,参数为 ThumbnailResult |
fail |
Function |
— |
失败回调,参数为 ThumbnailFail |
complete |
Function |
— |
完成回调,成功失败均触发 |
ThumbnailResult
| 字段 |
类型 |
说明 |
path |
string |
图片本地路径(file://) |
width |
number |
实际宽度(px) |
height |
number |
实际高度(px) |
getThumbnails(options)
批量提取多帧截图。时间点来源二选一:times(指定时间点数组)或 interval + count(自动间隔)。times 优先。
| 参数 |
类型 |
默认值 |
说明 |
videoPath |
string |
— |
视频路径 |
times |
number[] |
— |
时间点数组(毫秒),与 interval 二选一 |
interval |
number |
— |
自动间隔(毫秒),与 times 二选一 |
count |
number |
10 |
interval 模式下最多生成帧数 |
width |
number |
0 |
缩略图宽度(px) |
height |
number |
0 |
缩略图高度(px) |
quality |
number |
80 |
JPEG 压缩质量(0–100) |
keepAspectRatio |
boolean |
true |
是否等比缩放 |
success |
Function |
— |
成功回调,参数为 BatchThumbnailResult |
fail |
Function |
— |
失败回调 |
complete |
Function |
— |
完成回调 |
BatchThumbnailResult
| 字段 |
类型 |
说明 |
paths |
string[] |
图片路径数组,与 times 一一对应 |
times |
number[] |
实际时间点数组(毫秒) |
某帧提取失败时会自动跳过,不影响其他帧。
错误码
| 错误码 |
说明 |
8040001 |
视频文件不存在 |
8040002 |
视频格式不支持或无法解析 |
8040003 |
帧提取失败(时间超出范围或解码失败) |
8040004 |
图片保存失败 |
8040005 |
网络视频下载失败 |
8040006 |
参数无效(如 videoPath 为空) |
示例
网络视频截图(自动缓存)
getThumbnail({
videoPath: 'https://example.com/demo.mp4',
time: 10000,
width: 480,
height: 270,
keepAspectRatio: true,
success: (res) => console.log(res.path),
fail: (err) => {
if (err.errCode === 8040005) {
console.log('网络下载失败,请检查网络');
}
},
});
按指定时间点批量截图
getThumbnails({
videoPath: 'file:///var/mobile/.../video.mp4',
times: [0, 5000, 10000, 15000, 20000],
width: 320,
quality: 70,
success: (res) => {
res.paths.forEach((path, i) => {
console.log(`第 ${res.times[i] / 1000}s:`, path);
});
},
});
注意事项
- 提取的图片保存在系统临时目录(
tmp/),App 重启后会被清除,如需持久化请自行复制到其他路径
- 网络视频会下载到临时目录并缓存,相同 URL 不重复下载
- iOS 帧提取允许 ±1 秒容差以命中最近关键帧,性能更优
keepAspectRatio: false 时会拉伸到精确的 width × height,可能变形
- 批量截图在后台线程执行,不会阻塞 UI