341 lines
14 KiB
Plaintext
341 lines
14 KiB
Plaintext
|
|
<template>
|
|||
|
|
<!-- 此组件为前端引用阿里云的点播视频插件,可经过鉴黄,返回video_id,以及url-->
|
|||
|
|
<view class="~cu-load ~load-modal ~load-icon" v-if="loadModal">
|
|||
|
|
<!-- <view>{{ progressPercent }}%</view>-->
|
|||
|
|
<!-- <view class='gray-text'>加载中...</view>-->
|
|||
|
|
<image src="https://image.fulllinkai.com/202207/07/e58b3d9613b86f1baa48e929337edf85.gif" mode="widthFix"
|
|||
|
|
style="width: 150rpx;height: auto;"></image>
|
|||
|
|
<view class="~gray-text">上传中(<span class="~bold"> {{ progressPercent }}% </span>)</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
|
|||
|
|
import wepy from '@wepy/core'
|
|||
|
|
import {service} from '../config.js'
|
|||
|
|
import https from '../mixins/https'
|
|||
|
|
import base from '../mixins/base'
|
|||
|
|
import VODUpload from '../mixins/aliyun-upload-sdk-1.0.3.min'
|
|||
|
|
|
|||
|
|
// import ShareMessage from '../mixins/ShareMessage'
|
|||
|
|
wepy.component({
|
|||
|
|
mixins: [base, https],
|
|||
|
|
props: {
|
|||
|
|
pic: {
|
|||
|
|
type: String,
|
|||
|
|
default: '',
|
|||
|
|
twoWay: true
|
|||
|
|
},
|
|||
|
|
options: {
|
|||
|
|
type: Object,
|
|||
|
|
default: {},
|
|||
|
|
twoWay: true
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
uploader: {},
|
|||
|
|
videos: [],
|
|||
|
|
loadModal: false,
|
|||
|
|
progressPercent: 0,
|
|||
|
|
videosCount: 9 // 最多可以选择的视频数
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
ready() {
|
|||
|
|
this.getSignature()
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
methods: {
|
|||
|
|
getSignature() {
|
|||
|
|
let that = this
|
|||
|
|
|
|||
|
|
let uploader = new VODUpload({
|
|||
|
|
userId: '1303984639806000',
|
|||
|
|
timeout: that.options.timeout || 60000,
|
|||
|
|
region: that.options.region || 'cn-shanghai',
|
|||
|
|
// 添加文件成功
|
|||
|
|
addFileSuccess: (uploadInfo) => {
|
|||
|
|
console.log('addFileSuccess' + JSON.stringify(uploadInfo))
|
|||
|
|
that.uploader.startUpload()
|
|||
|
|
},
|
|||
|
|
// 开始上传
|
|||
|
|
onUploadstarted: function (uploadInfo) {
|
|||
|
|
console.log('文件开始上传...')
|
|||
|
|
console.log('onUploadStarted:' + JSON.stringify(uploadInfo))
|
|||
|
|
// var url
|
|||
|
|
// if (uploadInfo.isImage) {
|
|||
|
|
// url = 'https://alivc-demo.aliyuncs.com/demo/getImageUploadAuth?imageType=default&imageExt=' + that._getSuffix(uploadInfo.url) + '&title=title&tags=tags'
|
|||
|
|
// } else {
|
|||
|
|
// url = 'https://alivc-demo.aliyuncs.com/demo/getVideoUploadAuth?title=' + uploadInfo.url + '&fileName=' + uploadInfo.url + '&fileSize=' + uploadInfo.fileSize + '&description=description&coverURL=' + uploadInfo.coverUrl + '&tags=tags'
|
|||
|
|
// }
|
|||
|
|
let data = {
|
|||
|
|
// title: uploadInfo.url,
|
|||
|
|
// fileSize: uploadInfo.fileSize,
|
|||
|
|
// description: 'description',
|
|||
|
|
// coverURL: uploadInfo.coverUrl,
|
|||
|
|
// tags: 'tags',
|
|||
|
|
file_name: uploadInfo.url
|
|||
|
|
}
|
|||
|
|
that.$post({
|
|||
|
|
url: `${service.host}/ali/upload/video`, data
|
|||
|
|
})
|
|||
|
|
.then(({code, data}) => {
|
|||
|
|
console.log(data, 'data====')
|
|||
|
|
if (code == 0) {
|
|||
|
|
console.log(data.body.VideoId)
|
|||
|
|
uploader.setUploadAuthAndAddress(uploadInfo, data.body.UploadAuth, data.body.UploadAddress, data.body.VideoId)
|
|||
|
|
} else {
|
|||
|
|
that.$showToast('上传失败了')
|
|||
|
|
uploader.stopUpload()
|
|||
|
|
}
|
|||
|
|
wx.hideLoading()
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 文件上传成功
|
|||
|
|
onUploadSucceed: function (uploadInfo) {
|
|||
|
|
console.log(JSON.stringify(uploadInfo))
|
|||
|
|
console.log('文件上传成功!')
|
|||
|
|
that.loadModal = false
|
|||
|
|
that.getVideoUrl(uploadInfo.videoId)
|
|||
|
|
},
|
|||
|
|
// 文件上传失败
|
|||
|
|
onUploadFailed: function (uploadInfo, code, message) {
|
|||
|
|
console.log('onUploadFailed: file:' + uploadInfo.file.name + ',code:' + code + ', message:' + message)
|
|||
|
|
console.log('文件上传失败!')
|
|||
|
|
uploader.stopUpload()
|
|||
|
|
},
|
|||
|
|
// 取消文件上传
|
|||
|
|
onUploadCanceled: function (uploadInfo, code, message) {
|
|||
|
|
console.log(JSON.stringify(uploadInfo) + code + message)
|
|||
|
|
console.log('文件已暂停上传!')
|
|||
|
|
uploader.stopUpload()
|
|||
|
|
},
|
|||
|
|
// 文件上传进度,单位:字节, 可以在这个函数中拿到上传进度并显示在页面上
|
|||
|
|
onUploadProgress: function (uploadInfo, totalSize, progress) {
|
|||
|
|
let files = []
|
|||
|
|
console.log()
|
|||
|
|
if (uploadInfo.isImage) {
|
|||
|
|
files = that.images || []
|
|||
|
|
} else {
|
|||
|
|
files = that.videos || []
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
files.forEach((file, idx) => {
|
|||
|
|
if (file.url === uploadInfo.url) {
|
|||
|
|
file.progress = progress
|
|||
|
|
if (uploadInfo.isImage) {
|
|||
|
|
that.setData({
|
|||
|
|
images: files
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
that.setData({
|
|||
|
|
videos: files
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
let progressPercent = Math.ceil(progress)
|
|||
|
|
console.log('文件上传中...' + progressPercent)
|
|||
|
|
wx.hideLoading()
|
|||
|
|
that.loadModal = true
|
|||
|
|
that.progressPercent = progressPercent
|
|||
|
|
},
|
|||
|
|
// 上传凭证超时
|
|||
|
|
onUploadTokenExpired: function (uploadInfo) {
|
|||
|
|
// // 如果是上传方式二即根据 STSToken 实现时,从新获取STS临时账号用于恢复上传
|
|||
|
|
// // 上传文件过大时可能在上传过程中 sts token 就会失效, 所以需要在 token 过期的回调中调用 resumeUploadWithSTSToken 方法
|
|||
|
|
// // 这里是测试接口, 所以我直接获取了 STSToken
|
|||
|
|
// $('#status').text('文件上传超时!')
|
|||
|
|
// var stsUrl = 'http://demo-vod.cn-shanghai.aliyuncs.com/voddemo/CreateSecurityToken?BusinessType=vodai&TerminalType=pc&DeviceModel=iPhone9,2&UUID=67999yyuuuy&AppVersion=1.0.0'
|
|||
|
|
// $.get(stsUrl, function (data) {
|
|||
|
|
// var info = data.SecurityTokenInfo
|
|||
|
|
// var accessKeyId = info.AccessKeyId
|
|||
|
|
// var accessKeySecret = info.AccessKeySecret
|
|||
|
|
// var secretToken = info.SecurityToken
|
|||
|
|
// var expiration = info.Expiration
|
|||
|
|
// uploader.resumeUploadWithSTSToken(accessKeyId, accessKeySecret, secretToken, expiration)
|
|||
|
|
// }, 'json')
|
|||
|
|
},
|
|||
|
|
// 全部文件上传结束
|
|||
|
|
onUploadEnd: (uploadInfo) => {
|
|||
|
|
console.log('文件上传完毕 onUploadEnd: uploaded all the files')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
console.log(uploader, 'uploader')
|
|||
|
|
this.uploader = uploader
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 获取视频URL
|
|||
|
|
getVideoUrl(videoId) {
|
|||
|
|
let vm = this
|
|||
|
|
vm.$showLoading('加载中...')
|
|||
|
|
let data = {
|
|||
|
|
video_id: videoId
|
|||
|
|
}
|
|||
|
|
vm.$post({url: `${service.host}/ali/video/info`, data}).then(({code, data}) => {
|
|||
|
|
console.log(data, data.body.PlayInfoList.PlayInfo[0].PlayURL, '1131231')
|
|||
|
|
vm.$emit('uploadVideoSuccess', data.body.PlayInfoList.PlayInfo[0].PlayURL, videoId)
|
|||
|
|
wx.hideLoading()
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
uploadFile(file) { // 上传视频
|
|||
|
|
let vm = this
|
|||
|
|
let videosCount = --vm.videosCount
|
|||
|
|
vm.videosCount = videosCount
|
|||
|
|
vm.videos = vm.videos.concat(file)
|
|||
|
|
let uploader = vm.uploader
|
|||
|
|
let userData = '{"Vod":{}}'
|
|||
|
|
console.log(file, 'file')
|
|||
|
|
console.log(uploader, 'file')
|
|||
|
|
wx.hideLoading()
|
|||
|
|
uploader.addFile(file, null, null, null, userData)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 视频压缩
|
|||
|
|
compressVideo(tempFilePath) {
|
|||
|
|
console.log(tempFilePath)
|
|||
|
|
// wx.showLoading({title: '视频压缩中...', mask: true})
|
|||
|
|
let that = this
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.compressVideo({
|
|||
|
|
quality: 'high',
|
|||
|
|
src: tempFilePath,
|
|||
|
|
success: (res) => {
|
|||
|
|
console.log(res)
|
|||
|
|
// console.log((res.size / 1024).toFixed(2))
|
|||
|
|
// console.log(parseFloat(res.size / 1024).toFixed(2))
|
|||
|
|
// let size = parseFloat(res.size / 1024).toFixed(2)
|
|||
|
|
// console.log('压缩后视频大小为' + size)
|
|||
|
|
// console.log('压缩后视频的链接' + res.tempFilePath)
|
|||
|
|
resolve(res)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 剪辑视频
|
|||
|
|
editorVideo(tempFilePath) {
|
|||
|
|
console.log(tempFilePath)
|
|||
|
|
// wx.showLoading({title: '视频压缩中...', mask: true})
|
|||
|
|
let that = this
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.openVideoEditor({
|
|||
|
|
filePath: tempFilePath,
|
|||
|
|
// minDuration: 3, // 限制时间
|
|||
|
|
// maxDuration: 30, // 限制时间
|
|||
|
|
success: (res) => {
|
|||
|
|
if (parseFloat(res.duration / 1000).toFixed(0) > 30) { // 视频大于30秒
|
|||
|
|
reject(res)
|
|||
|
|
} else {
|
|||
|
|
resolve(res) // 视频剪辑后少于30秒
|
|||
|
|
}
|
|||
|
|
console.log('剪辑后的视频时长:' + parseFloat(res.duration / 1000).toFixed(0))
|
|||
|
|
console.log('剪辑后的视频大小:' + res.size)
|
|||
|
|
console.log('剪辑后的视频链接:' + res.tempFilePath)
|
|||
|
|
console.log('剪辑后的视频图片链接:' + res.tempThumbPath)
|
|||
|
|
},
|
|||
|
|
fail: (res) => {
|
|||
|
|
// that.$showToast(res.errMsg)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
choosevideo(maxTime = 30) {
|
|||
|
|
let vm = this
|
|||
|
|
console.log('上传视频的方法')
|
|||
|
|
wx.chooseMedia({
|
|||
|
|
count: 1, // 上传视频的个数
|
|||
|
|
mediaType: ['video'], // 限制上传的类型为video
|
|||
|
|
sourceType: ['album', 'camera'], // 视频选择来源
|
|||
|
|
maxDuration: maxTime, // 拍摄限制时间
|
|||
|
|
compressed: true,
|
|||
|
|
camera: 'back', // 采用后置摄像头
|
|||
|
|
success: (res) => { // 获取临时存放的视频资源
|
|||
|
|
let tempFilePath = res.tempFiles[0].tempFilePath
|
|||
|
|
// 获取该视频的播放时间
|
|||
|
|
let duration = res.tempFiles[0].duration
|
|||
|
|
console.log('视频播放时间为' + duration)
|
|||
|
|
// 视频封面
|
|||
|
|
let thumbTempFilePath = res.tempFiles[0].thumbTempFilePath
|
|||
|
|
console.log('视频封面为' + thumbTempFilePath)
|
|||
|
|
// 获取视频的大小(MB单位)
|
|||
|
|
let size = parseFloat(res.tempFiles[0].size / 1024 / 1024).toFixed(1)
|
|||
|
|
console.log('视频大小为' + size)
|
|||
|
|
// 获取视频的高度
|
|||
|
|
let height = res.tempFiles[0].height
|
|||
|
|
console.log('视频高度为' + height)
|
|||
|
|
// 获取视频的宽度
|
|||
|
|
let width = res.tempFiles[0].width
|
|||
|
|
console.log('视频宽度为' + width)
|
|||
|
|
let file = {
|
|||
|
|
url: tempFilePath,
|
|||
|
|
coverUrl: thumbTempFilePath,
|
|||
|
|
fileSize: size
|
|||
|
|
}
|
|||
|
|
// 校验大小后,符合进行上传
|
|||
|
|
if (duration > maxTime) {
|
|||
|
|
let beyongSize = parseFloat(duration - 30).toFixed(0)
|
|||
|
|
// 获取视频超出限制大小的数量
|
|||
|
|
wx.showModal({
|
|||
|
|
title: '提示',
|
|||
|
|
content: '上传的视频时长超限,超出' + beyongSize + '秒,是否剪辑视频!',
|
|||
|
|
success(res) {
|
|||
|
|
if (res.confirm) {
|
|||
|
|
console.log('用户点击确定')
|
|||
|
|
vm.$showLoading('压缩中...')
|
|||
|
|
vm.compressVideo(tempFilePath).then((data) => { // 先压缩视频,再剪辑视频
|
|||
|
|
vm.$showLoading('准备编辑中...')
|
|||
|
|
vm.editorVideo(data.tempFilePath).then((resV2) => {
|
|||
|
|
console.log(resV2)
|
|||
|
|
file = {
|
|||
|
|
url: resV2.tempFilePath,
|
|||
|
|
coverUrl: resV2.thumbTempFilePath,
|
|||
|
|
fileSize: resV2.size
|
|||
|
|
}
|
|||
|
|
vm.uploadFile(file) // 视频在30秒内,上传视频
|
|||
|
|
}).catch((err) => {
|
|||
|
|
console.log(err, '========================')
|
|||
|
|
let time = parseFloat(err.duration / 1000).toFixed(0)
|
|||
|
|
console.log(time)
|
|||
|
|
if (time > maxTime) { // 视频大于30秒,重新上传视频
|
|||
|
|
return wx.showModal({
|
|||
|
|
title: '提示',
|
|||
|
|
content: `视频超过${parseFloat(time - maxTime).toFixed(0)}秒,请重新上传哦!`,
|
|||
|
|
showCancel: false,
|
|||
|
|
success(res) {
|
|||
|
|
console.log('用户点击确定')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
} else if (res.cancel) {
|
|||
|
|
console.log('用户点击取消')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
vm.$showLoading('压缩中')
|
|||
|
|
vm.compressVideo(tempFilePath).then((data) => { // 先压缩视频,然后再上传
|
|||
|
|
console.log(data)
|
|||
|
|
file = {
|
|||
|
|
url: data.tempFilePath,
|
|||
|
|
coverUrl: thumbTempFilePath,
|
|||
|
|
fileSize: data.size
|
|||
|
|
}
|
|||
|
|
wx.hideLoading()
|
|||
|
|
// 上传视频
|
|||
|
|
vm.uploadFile(file)
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style type="less">
|
|||
|
|
|
|||
|
|
</style>
|