我正在录制音频,将其作为blob发送到nodejs服务器.然后,nodejs服务器将其发送给当前未记录的所有连接用户.
发送blob:
mediaRecorder.onstop = function(e) { var blob = new Blob(this.chunks,{ 'type' : 'audio/ogg; codecs=opus' }); socket.emit('radio',blob); };
接收blob的服务器:
socket.on('radio',function(blob) { socket.broadcast.emit('voice',blob); });
收听blob的监听器:
socket.on('voice',function(arrayBuffer) { var blob = new Blob([arrayBuffer],{ 'type' : 'audio/ogg; codecs=opus' }); var audio = document.getElementById('audio'); audio.src = window.URL.createObjectURL(blob); audio.play(); });
这适用于除safari和任何ios设备之外的所有浏览器/设备.通过safari的检查员进一步了解我发现:
safari是否需要在其标题中包含其他内容才能正确解释blob对象?我已经研究过接受过的音频类型,试过aac / mp3 / ogg没有任何成功.在进一步阅读后,我听说过在safari和IOS中存在流媒体blob音频/视频数据的错误,尽管我不太清楚任何细节.
仪式方向的指导将非常有帮助!
编辑:它看起来像这行audio.src = window.URL.createObjectURL(blob);在接收blob中是导致blob错误的原因(图像i链接)
编辑2:我试图看看使用除blob之外的其他格式是否有效,选择base64编码的字符串.看起来这适用于除IOS和Safari之外的所有设备和浏览器.我得到的印象是它与IOS如何解释/加载数据有关…
解决方法
对我来说,解决方案是将一个源元素插入到audio元素中,并使用sourceElement.src属性来引用blob.我甚至不需要将音频元素附加到DOM.以下示例,希望它可以帮助某人.
var audioElement = document.createElement('audio') var sourceElement = document.createElement('source') audioElement.appendChild(sourceElement) sourceElement.src = '<your blob url>' sourceElement.type = 'audio/mp3' // or whatever audioElement.load() audioElement.play()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。