audio 標籤 載入url 音訊總時長問題
阿新 • • 發佈:2021-02-06
H5的audio標籤,在使用過程中,出現有些情況出現總時長,有些時候沒有總時長的情況。
有總時長:src是本地檔案時,及使用雲端儲存url地址時,顯示總時長。
<div id="audioDiv">
<audio id="aud" controls preload>
<source src="a.wav" type="audio/wav">
</audio>
</div>
無總時長:src地址是後臺伺服器讀取音訊檔案後,回寫的資料流並且響應頭不包含Content-Length 。
<div id="audioDiv">
<audio id="aud" controls preload>
<source src="http://localhost:12386/audio" type="audio/wav">
</audio>
</div>
後臺伺服器程式碼:audio標籤獲取不到總時長的緣故是當後臺寫回資料流,響應頭沒有Content-Length時,無法獲取到總時長,只有加上該響應頭,audio標籤才能正確的獲取總時長。
@RequestMapping("audio") public void audio(HttpServletResponse response) throws IOException { File f = new ClassPathResource("a.wav").getFile(); FileInputStream fis = new FileInputStream(f); // 無所謂,application/octet-stream也可以,不寫也可以 response.setHeader("Content-Type", "audio/wav"); // 關鍵所在,如果後臺直接讀取檔案流寫回客戶端,無Content-Length,則audio標籤無法獲取總時長 response.setHeader("Content-Length", f.length() + ""); byte[] buf = new byte[4096]; int len; while ((len = fis.read(buf)) != -1) { response.getOutputStream().write(buf, 0, len); } response.getOutputStream().flush(); }