js獲取上傳音視頻的時(shí)長(zhǎng)
獲取上傳視頻路徑,將該路徑放入video標(biāo)簽,獲取視頻時(shí)長(zhǎng)
方式一:隱藏一個(gè)音頻標(biāo)簽,播放獲取。
<video style="display:none;" controls="controls" id="videoData" oncanplaythrough="geTime(this)"></video>
<input type="file" onchange="changeFile(this)" />
<script type="text/JavaScript">
function geTime(ele) {
var hour = parseInt((ele.duration)/3600);
var minute = parseInt((ele.duration%3600)/60);
var second = Math.ceil(ele.duration%60);
console.log("這段視頻的時(shí)長(zhǎng)為:"+hour+"小時(shí),"+minute+"分,"+second+"秒");
}
function changeFile(ele){
var video = ele.files[0];
var url = URL.createObjectURL(video);
console.log(url);
document.getElementById("videoData").src = url;
}
</script>
方式二;通過(guò)new Audio的方式獲取:
<input type="file" onchange="changeFile(this)" >
<script>
function changeFile(ele) {
var content = ele.files[0]
var url = URL.createObjectURL(content);//獲取錄音時(shí)長(zhǎng)
var audioElement = new Audio(url);//audio也可獲取視頻的時(shí)長(zhǎng)
var duration;
audioElement.addEventListener("loadedmetadata", function (_event) {
duration = audioElement.duration;
console.log(duration/60);
});
}
</script>
說(shuō)明:
1.URL.createObjectURL()方法會(huì)創(chuàng)建一個(gè) DOMString,其中包含一個(gè)表示參數(shù)中給出的對(duì)象的URL。這個(gè) URL 的生命周期和創(chuàng)建它的窗口中的 document 綁定。這個(gè)新的URL 對(duì)象表示指定的 File 對(duì)象或 Blob 對(duì)象。(個(gè)人感覺(jué)可以把對(duì)象轉(zhuǎn)換成url使用,十分靈活方便,特別是對(duì)于文件對(duì)象)。
2.loadedmetadata 當(dāng)指定的音頻/視頻的元數(shù)據(jù)已加載時(shí),會(huì)發(fā)生 loadedmetadata 事件。音頻/視頻的元數(shù)據(jù)包括:時(shí)長(zhǎng)、尺寸(僅視頻)以及文本軌道。
上傳之前限制一下視頻的時(shí)長(zhǎng)
由于用阿里云解析視頻的時(shí)候,是按照視頻時(shí)長(zhǎng)收費(fèi)的,為了節(jié)省測(cè)試費(fèi)用,老板要我在上傳之前限制一下視頻的時(shí)長(zhǎng)!這里通過(guò)video 的視頻預(yù)覽來(lái)實(shí)現(xiàn)的。(參考:https://www.jianshu.com/p/dc60d8dc07de)
const gettime = (video, size) => {
const promise = new Promise(resolve => {
video.addEventListener('canplaythrough', e => {
console.log(58, e, e.target.duration, size)
if (e.target.duration <= size) {
resolve(true)
} else {
resolve(false)
}
})
})
return promise
}
export const checkSize = async (files, size) => {
// console.log(56, Number.isNaN(Number(size)), size)
if (!files || !files[0]) return false
// 這一條是正式服務(wù)器不需要這段所以當(dāng)size 為undefined 時(shí)默認(rèn) 返回 true
if (Number.isNaN(Number(size))) return true
const checktimevideo = document.getElementById('checktimevideo')
if (checktimevideo) {
document.body.removeChild(checktimevideo)
}
const video = document.createElement('video')
const url = URL.createObjectURL(files[0])
video.src = url
video.id = 'checktimevideo'
video.style.display = 'none'
document.body.appendChild(video)
return await gettime(video, size)
}
// 這個(gè)函數(shù)調(diào)用的時(shí)候也非常簡(jiǎn)單
<input
type='file'
onChange = { async e => {
e.persist() // 這個(gè)是用來(lái)處理 SyntheticEvent 問(wèn)題的
const isok = await checkSize(e.target.files[0], 200) // 200 表示200秒
} }
/>
浙公網(wǎng)安備 33010602011771號(hào)