我正在录制音频,将其作为 Blob 发送到 Node.js 服务器。随后,该服务器会将其发送给所有当前未进行录制的已连接用户。
将 Blob 发送出去:
将 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错误(我链接的图像)。
编辑2: 我尝试看看是否使用除blob之外的其他格式会起作用,选择使用base64编码字符串。看起来这在所有设备和浏览器上都有效,除了IOS和Safari。我得到的印象是它与IOS如何解释/加载数据有关...