微信小程序video

1.video是原生組件

原生組件的層級是最高的,想要覆蓋在video上,只能用cover-view 和 cover-image 組件,這2個可以無限嵌套。適用場景:給視頻加標題。

2.檢測video播放進度用bindtimeupdate:

這個是微信返回當前播放進度的接口。文檔上說是每250ms調用一次,實際測試在ios上1s調用一次。

通過e.detail.currentTime可以拿到當前進度,單位:s。

這裡提個問題,給你一段視頻,給一組音頻信息,音頻信息裡包含開始時間,音頻的src。讓你根據視頻播放的進度播放音頻,你會怎麼做?

這是其實是配音場景,把視頻和音頻給同步起來。如果能固定250ms調用一次,這個問題就不大,但事實上,微信在各種系統上的實現方式有差異,並不保證250ms播放一次。

首先我們排除,在視頻一開始就setTimeout到每個音頻的這種方式,因為視頻在播放的過程可能會緩衝,但setTimeout會依照設定的執行。

這個問題最好的解決方式,在bindtimeupdate裡找到距離給定播放音頻的當前視頻時間,然後再setTimeout,這樣即使視頻緩存,播放時間最大的誤差也不會超過bindtimeupdate調用的頻率。

video暫停的時候還要清除setTimeout。部分代碼:

 bindPlayFunc:function(e){ 

console.log(111);
// bgM.obeyMuteSwitch = false;
let palyTime = new Date().getTime();
if(curMp3){
console.log('seek:'+currentTime);
curMp3.seek(currentTime);
curMp3.play();
}
},
timeUpdate:function(e){
this.data.dub.dub_json.forEach((arr,index)=>{
//微信真機上播放完之後,第二遍播放獲取不到duration
if(!mp3Arr[index].dur && mp3Arr[index].duration){
mp3Arr[index].dur = mp3Arr[index].duration;
}
const interval = 1000;
if(mp3Arr[index] && mp3Arr[index].paused && arr.time - e.detail.currentTime*1000<=interval && arr.time>=e.detail.currentTime*1000){
console.log('index:'+index);
if(TimeTaskArr[index]){
console.log('刪除定時:'+index);
clearTimeout(TimeTaskArr[index]);
}

TimeTaskArr[index] = setTimeout(()=>{
mp3Arr.forEach((mp3)=>{
mp3.pause();
})
console.log('定時播放:'+index);
console.log('播放url:' + mp3Arr[index].src);
mp3Arr[index].play();
},arr.time - e.detail.currentTime*1000);
}
})
},

3.video組件可以通過wx.createVideoContext控制

我們想在js裡控制video的播放暫停等,必須用wx.createVideoContext這個接口。如果你的video只是播放,不需要操作其他的,那這個接口用不上。

以video組件的id為參數可以構造一個VideoContext 對象,VideoContext 對象有一系列控制微信播放的方法:paly(),stop(),seek()...

4.seek()方法

VideoContext.seek(position) 跳轉到指定位置,position的單位是秒,這個精度很低了,我自己傳的是毫秒轉換過來的,可以帶有小數。比如:

VideoContext.seek(1.3) //跳到視頻1.3s的位置

這個跳轉在最新的安卓系統上有問題,表現為 調用這個方法後,視頻播放的位置在指定的前面。

微信小程序video


分享到:


相關文章: