尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

边录边传:audio-recorder-polyfill timeslice 分片实时上传实战指南,录音未结束就开始发送数据

边录边传:audio-recorder-polyfill timeslice 分片实时上传实战指南,录音未结束就开始发送数据 边录边传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),仅供参考
返回列表