App端uni.chooseVideo不支持视频剪辑,必须通过原生插件(如uni-video-trimmer)调用AVFoundation或MediaCodec等实现截取,前端JS无法直接处理。

App端无法直接用uni.chooseVideo剪辑视频
uni-app 的 uni.chooseVideo 在 App 端(iOS/Android)只支持选择完整视频,不提供裁剪、截取时长等能力——这是原生平台限制,不是 API 缺失。H5 和小程序端虽有部分裁剪 UI,但 App 端压根不走那套逻辑。
真正能控制视频长度的,必须落到原生层处理。你看到的“剪辑”效果,本质是调用原生 SDK 做视频帧提取或转码。
- App 端
uni.chooseVideo返回的tempFilePath是完整文件路径,duration字段仅作只读参考,不能靠它截取 - 想截取前 30 秒?不能靠前端 JS 拆文件,必须传给原生模块执行 FFmpeg 或系统 AVFoundation/ExoPlayer 能力
- 如果你没接入原生插件,任何基于
canvas或MediaRecorder的“前端剪辑”在 App 端都无效(这些 API 在 WebView 中受限或不可用)
必须用原生插件实现视频截取,推荐 uni-video-trimmer
社区较稳定的方案是使用封装了原生能力的插件,比如开源插件 uni-video-trimmer(支持 iOS/Android),它把视频选取 + 时间范围拖动 + 导出压缩封装成一个组件。
注意它不是纯 JS 库:安装后需在 nativePlugins 配置中声明,并在 manifest.json 的 App 模块里勾选对应原生权限(如相册、存储写入)。
- 导入后用法简单:
,回调返回新生成的tempFilePath和精确duration - 它默认调用系统级视频编辑器(iOS 使用
AVMutableVideoComposition,Android 用MediaCodec+MediaMuxer),不依赖 FFmpeg,启动快、兼容性好 - 若需自定义编码参数(如固定 720p、码率 2Mbps),得改插件源码里的 native 部分,JS 层不暴露这些选项
自己写原生模块时,关键要处理 Android 的 MediaMetadataRetriever 与 iOS 的 AVAssetExportSession
如果已有原生开发能力,或需要深度定制(比如带滤镜、多段拼接),就得自己写原生模块。核心差异不在 JS,而在两个平台的底层 API 行为:
- Android 上用
MediaMetadataRetriever可快速获取帧和时间戳,但截取必须用MediaCodec解码 +MediaMuxer复用,否则会丢音画同步 - iOS 上
AVAssetExportSession最省事,但导出耗时且不支持硬编;若要实时预览剪辑区域,得用AVMutableVideoComposition+CALayer渲染,再用AVAssetWriter写入 - 无论哪边,输出路径必须用
plus.io.convertLocalFileSystemURL()转成 uni-app 可读的 file:// URL,否则uni.uploadFile会报错file not found
视频长度处理的边界情况容易被忽略
你以为传个 startTime 和 endTime 就完事?实际线上常崩在这几个点:
- 输入视频只有 12 秒,却设
endTime: 60→ 原生层不会自动 clamp,可能 crash 或静音导出,务必在 JS 层先校验duration并做 min/max 截断 - Android 低版本(plus.video.getVideoInfo 检查
codecName - iOS 真机上,从相册选的 HEIC+HEVC 视频,
AVAsset可能返回duration = 0,得用loadValuesAsynchronously(forKeys:)等异步加载完成再取值











