1. 程式人生 > 其它 >audio 標籤 載入url 音訊總時長問題

audio 標籤 載入url 音訊總時長問題

技術標籤:前端Javaaudioduration音訊總時長

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();
    }