前言
要实现APP端:
页面A录制视频,并保存到本地;
页面B播放保存到本地的视频;
我的业务需求:在页面A中录制视频,保存到本地并,从页面B中也可以获取到保存的视频并播放。这个过程中不会出现从相册选择视频的操作。所以本文不涉及保存到相册的功能
演示
页面A:添加视频
页面A:弹出框
页面A:录制
页面B:读取视频
代码
录制视频、保存本地
关键API
用于打开相机:
用于将视频存在本地:
用于记录视频本地path:
代码:
//界面A
<view class="dflex-j-sb border-b padding-xs">
<view >视频</view>//文字
//icon,点击开始录制视频
<uni-icons type="plus" size="25" @click="videoRecording"></uni-icons>
</view>
界面A的js部分
//录视频
videoRecording() {
let that = this;
//弹出提示框
uni.showModal({
content: '视频最长录制30s',
showCancel: false,
success: () => {
//录视频
uni.chooseVideo({
count: 1,//只录制一个视频
sourceType: ['camera'],//开启视频相机
maxDuration: 30,//时长30s
mediaType: ['video'],//类型为视频
success: res => {
//录制成功
that.videoRecordingPath = res.tempFilePath;
//存储到本地
that.saveToLocal();
fail: (err) => {
//提示
uni.showToast({
title: '视频录制失败!',
duration: 2000
});
}
})
}
});
},
// 存到本地
saveToLocal() {
uni.showLoading({
title: '保存中...'
});
uni.saveFile({
tempFilePath: this.videoRecordingPath,
success: (res) => {
uni.hideLoading();
this.svideoPath = res.savedFilePath;
//记录保存地址,将来在页面B中通过地址读取文件
uni.setStorageSync('videoPath',this.svideoPath )
}
})
},
读取视频
关键API
用于获取本地视频:
用于读取视频:
代码:
//界面B,读取视频,并自动播放1帧作为缩略图
<view class="video-wrapper">
<video :src="videoPath" controls class="video-size" id="editVideo" show-play-btn="true" show-fullscreen-btn="false" show-progress="true" :autoplay="autoPlay" @timeupdate="video_time_update"></video>
</view>//读取视频
readVideo() {
//获取视频本地存储路径
let params=uni.getStorageSync('videoPath')
//读取本地文件
uni.getSavedFileInfo({
filePath: params, //
success: (res)=> {
//读取视频信息,注意,必须要这么包裹写:先读取本地文件,再读取视频信息。只写getVideoInfo不写getSaveFileInfo在跨页面的时候无法读取本地存的储视频
uni.getVideoInfo({
src:params,
success: (res) => {
this.videoImgShow=true;
this.videoPath = params
},
fail: (err) => {
}
})
}
});
},
//缩略图,在APP端读取视频后,默认是黑屏。想要以第一帧作为缩略图通常使用canvas获取视频第一帧生成图片。但是这里用了个讨巧的方法,即:加载视频后播放
//一帧暂停,达到缩略图的效果。
video_time_update(e) {
// e.detail.duration 为视频总长度,在没有加载到视频的时候总长度为 -0.0001
// 当获取到视频长度后进入if
//debugger;
if (this.video_time_update_status && e.detail.duration > 0) {
// 第一次进入if 关闭更新状态,防止循环暂停
this.video_time_update_status = false;
// 获取视频
this.videoContext = uni.createVideoContext('editVideo');
// 暂停视频
this.videoContext.pause();
}
}
完结