import { fileToUrl, revokeObjectURL } from 'uni-platform/helpers/file'
|
import { t } from 'uni-core/helpers/i18n'
|
import _createInput from './create_input'
|
import { interact } from 'uni-mixins'
|
|
const {
|
invokeCallbackHandler: invoke
|
} = UniServiceJSBridge
|
|
let videoInput = null
|
|
export function chooseVideo ({
|
sourceType,
|
extension
|
}, callbackId) {
|
if (videoInput) {
|
document.body.removeChild(videoInput)
|
videoInput = null
|
}
|
|
videoInput = _createInput({
|
sourceType: sourceType,
|
extension,
|
type: 'video'
|
})
|
document.body.appendChild(videoInput)
|
|
videoInput.addEventListener('change', function (event) {
|
const file = event.target.files[0]
|
const callbackResult = {
|
errMsg: 'chooseVideo:ok',
|
tempFile: file,
|
size: file.size,
|
duration: 0,
|
width: 0,
|
height: 0,
|
name: file.name
|
}
|
let filePath
|
Object.defineProperty(callbackResult, 'tempFilePath', {
|
get () {
|
filePath = filePath || fileToUrl(this.tempFile)
|
return filePath
|
}
|
})
|
|
const video = document.createElement('video')
|
if (video.onloadedmetadata !== undefined) {
|
const filePath = fileToUrl(file)
|
// 尝试获取视频的宽高信息
|
video.onloadedmetadata = function () {
|
revokeObjectURL(filePath)
|
invoke(callbackId, Object.assign(callbackResult, {
|
duration: video.duration || 0,
|
width: video.videoWidth || 0,
|
height: video.videoHeight || 0
|
}))
|
}
|
// 部分浏览器(如微信内置浏览器)未播放无法触发loadedmetadata事件
|
setTimeout(() => {
|
video.onloadedmetadata = null
|
revokeObjectURL(filePath)
|
invoke(callbackId, callbackResult)
|
}, 300)
|
video.src = filePath
|
} else {
|
invoke(callbackId, callbackResult)
|
}
|
// TODO 用户取消选择时,触发 fail,目前尚未找到合适的方法。
|
})
|
|
videoInput.click()
|
|
if (!interact.getStatus()) {
|
console.warn(`${t('uni.chooseFile.notUserActivation')}`)
|
}
|
}
|