
邊錄邊傳audio-recorder-polyfill timeslice 分片實時上傳實戰指南錄音未結束就開始發送數據【免費下載鏈接】audio-recorder-polyfillMediaRecorder polyfill to record audio in Edge and Safari項目地址: https://gitcode.com/gh_mirrors/au/audio-recorder-polyfillaudio-recorder-polyfill是一個 MediaRecorder 音頻錄音 polyfill讓 Edge 和 Safari 也能錄制聲音。它的timeslice參數能把錄音按固定毫秒切片通過dataavailable事件實時吐出音頻片段——你可以在錄音結束前就開始上傳數據這就是邊錄邊傳。本文是一份面向新手的實戰指南帶你 3 步完成分片實時上傳。為什么需要 timeslice 分片上傳傳統做法是錄完整個文件 → 拿到一個大 Blob → 一次性上傳。問題很明顯? 長錄音要等錄完才能上傳用戶干等 整段音頻存在內存里長錄音容易卡頓 網絡中斷時整次上傳全部作廢沒有斷點timeslice的思路是流水線化每 N 毫秒就從錄音器里倒出一段音頻立刻發往服務器。錄制、編碼、上傳三件事并行進行總耗時大幅縮短。官方推薦做法直接寫在 README.md 里If you need to upload record to the server, we recommend usingtimeslice.timeslice 分片是如何工作的原理并不復雜核心邏輯在 index.js 的start(timeslice)方法中start()不傳參數 → 錄完為止只在stop()時一次性派發dataavailablestart(timeslice)傳毫秒數 → 內部用setInterval定時調用requestData()每次requestData()通知 Web Worker 編碼器把已緩存的音頻數據打包dump編碼后的 Blob 通過dataavailable事件交給你的回調對應源碼片段index.js 第 102~106 行附近if (timeslice) { this.slicing setInterval(() { if (this.state recording) this.requestData() }, timeslice) }?? 注意細節暫停pause期間不會分片。setInterval仍在跑但只有state recording才會真正請求數據恢復錄制后繼續分片。另外stop()時會最后再調用一次requestData()把剩余的音頻榨干保證收尾片段不丟失隨后自動清除定時器。3 步接入分片實時上傳第 1 步請求麥克風并創建錄音器navigator.mediaDevices.getUserMedia({ audio: true }).then(stream { recorder new MediaRecorder(stream) })第 2 步監聽dataavailable收到片段立即上傳// 每隔 1 秒執行一次參數是這一段音頻文件 recorder.addEventListener(dataavailable, e { sendNextPiece(e.data) // 在這里發 fetch / XHR 到服務器 })第 3 步帶 timeslice 啟動錄音// 每秒倒出一份音頻數據 recorder.start(1000)就這樣錄音剛進行 1 秒第一片數據已經在路上了。項目自帶的在線演示里就有這個交互參考 test/demo/index.js 中startRecording(parts)分支——點Record by 1 second按鈕即可體驗每秒一個audio/wav片段的分片效果演示頁面結構見 test/demo/index.pug。分片拼接WAV 與 MP3 的差別上傳分片后服務端需要把它們拼回完整音頻格式選擇很關鍵編碼器分片行為服務端拼接方式WAV默認每片都是帶頭部的獨立文件去掉后 N-1 片的 44 字節 WAV 頭依次拼接數據MP3mpeg-encoder每片是獨立 MP3 幀直接按序追加字節即可WAV 默認編碼快、體積大見 wave-encoder/index.js想要更好的壓縮率可切換到 MP3 編碼器見 mpeg-encoder/index.jsimport mpegEncoder from audio-recorder-polyfill/mpeg-encoder AudioRecorder.encoder mpegEncoder AudioRecorder.prototype.mimeType audio/mpeg這是官方 README.md 中Limitations一節明確說明的行為WAV 的timeslice分片每次都帶文件頭而原生 MediaRecorder 只在第一片帶頭——寫服務端拼接邏輯時要記住這一點。timeslice 值怎么選4 個實用建議1000ms 起步官方示例就用 1 秒單片 WAV 約幾十 KBMP3 更小傳輸壓力輕?追求低延遲可降到 500ms但分片更碎服務端請求數翻倍弱網環境建議配合失敗重試某片上傳失敗時單獨重發該片即可不必整段重來測試分片時序可參考 test/index.test.js 中supports slicing in start method用例start(500)后驗證每秒恰好收到 2 片、暫停期間不分片、stop()后再收到最后一片常見問題FAQQdataavailable的e.data可以直接預覽嗎可以。演示代碼用URL.createObjectURL(e.data)把每片轉成audio播放見 test/demo/index.js 的saveRecord函數。Q瀏覽器不支持怎么辦先檢查MediaRecorder.notSupported為不支持 Web Audio API 的瀏覽器顯示提示這也是官方 Usage 一節的第一步。Qpolyfill 體積大嗎很小——gzip 后約 1.1 KB、零依賴且通過inline worker把 Web Worker 內聯進同一個文件無需額外加載 worker 腳本。小結recorder.start(timeslice)一個參數即可把錄完再傳變成邊錄邊傳每片獨立dataavailable事件天然支持逐片重試、弱網續傳服務端拼接前務必區分 WAV去頭拼接與 MP3直接追加兩種格式掌握timeslice你的語音聊天、實時聽寫、語音客服類產品就能少一個請等待上傳的轉圈圖標 ?【免費下載鏈接】audio-recorder-polyfillMediaRecorder polyfill to record audio in Edge and Safari項目地址: https://gitcode.com/gh_mirrors/au/audio-recorder-polyfill創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考