前陣子開始忙一個小活安皱,時間巨緊调鬓,胖兔夜以繼日地coding,爬了一個又一個巨坑酌伊。其實(shí)對碼農(nóng)來說腾窝,各種坑見得多了,能填則填居砖,不能填則避虹脯。然而,總有一些坑回避不了奏候、必須解決循集,咋辦?找度娘蔗草,查谷歌咒彤,問大牛疆柔、詢Stackflow等等,都是常見路數(shù)镶柱∑庞玻可要還解決不了呢?那就恭喜了奸例,自個兒慢慢爬,什么時候爬出來向楼,只有天知道了查吊。
話說這個項(xiàng)目是基于electron的一個桌面程序,里面一個editor窗口湖蜕,其中含有html5的video控件逻卖。注意,坑要來了昭抒!在兩臺機(jī)器上分別運(yùn)行评也,ffmpeg版本一樣,視頻編碼一樣灭返,electron版本一樣(內(nèi)置chromium版本當(dāng)然也一樣)盗迟,但在兩臺機(jī)器上運(yùn)行,一臺可以打開熙含,另一臺就不能打開罚缕!于是各種查錯過程展開了。怎静。邮弹。。(此處省略3000字)
根據(jù)html5 video控件的設(shè)計(jì)蚓聘,視頻加載過程中腌乡,依次發(fā)生loadstart、durationchange夜牡、loadedmetadata与纽、loadeddata、progress氯材、canplay渣锦、canplaythrough這7個事件。跟蹤發(fā)現(xiàn)在出錯的機(jī)器上氢哮,video控件在loadstart之后就出錯了(別問我為什么只有一臺機(jī)器錯袋毙,崩潰第一次)。
這是跟蹤出來的錯誤截圖:查找DEMUXER_ERROR_COULD_NOT_OPEN冗尤,以及FFmpegDemuxer: open context failed這樣的錯誤听盖,基本找不到有用的信息胀溺,除了Chromium “FFmpegDemuxer: open context failed” when playing audio這一篇,可它給出的建議是重新?lián)Q一個chromium版本皆看。于是我把electron的版本從1.8.7升級到2.0.6仓坞,然而,問題依舊腰吟,不出錯的機(jī)器仍然不出錯无埃,出錯的機(jī)器仍然出錯!
爬坑到這里基本走入死胡同了毛雇。然而嫉称,意外的操作發(fā)現(xiàn),出錯的機(jī)器上灵疮,只要手工按一下F5织阅,editor居然就能打開了!video控件從loadstart一直到canplaythrough都不會再出現(xiàn)錯誤(別問我為什么F5就能好震捣,崩潰第二次)荔棉。
問題還沒解決,因?yàn)閑lectron程序一旦打包生成可執(zhí)行文件蒿赢,按F5就無效了润樱!再說讓用戶手工按 一下F5這算什么?沒辦法羡棵,只能繼續(xù)解決祥国。
先在腳本里嘗試重新調(diào)用video.load(),發(fā)現(xiàn)起不了作用晾腔,多等一段時間也不行(測試中5秒以后仍然load失斏嘞 ),接著在onerror事件里讓整個窗口重新刷新灼擂,這下終于OK了(別問我為什么壁查,崩潰第三次)。最后的代碼片段如下:
preview.addEventListener('error', event => {
console.log('video error occured.', event.srcElement.error);
// Avoid first time video load error. Don't ask me why this fucking happening
setTimeout(() => {
window.location.reload();
}, 100);
});
Editor窗口終于可以正常顯示剔应,總算從坑里爬出來了睡腿。雖然還是滿腦袋問號,暫時也沒空理會峻贮,繼續(xù)爬下一個坑去席怪。。纤控。
小小經(jīng)驗(yàn)挂捻,記錄在案。