2017-04-25 53 views
3

我正在錄製音頻,將其作爲blob發送到nodejs服務器。然後,nodejs服務器將其發送給當前未記錄的所有連接用戶。音頻Blob無法在IOS/Safari中工作

發送斑:

mediaRecorder.onstop = function(e) { 
    var blob = new Blob(this.chunks, { 'type' : 'audio/ogg; codecs=opus' }); 
    socket.emit('radio', blob); 
}; 

服務器接收的斑點:

socket.on('radio', function(blob) { 
    socket.broadcast.emit('voice', 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瀏覽器的檢查以進一步我發現這一點:

1st blob object returned 2nd blob object returned 3rd blob object returned

Safari瀏覽器是否需要BLOB對象別的東西在它的頭被適當解釋?我研究過接受的音頻類型,嘗試aac/mp3/ogg沒有任何成功。在進一步閱讀之後,我聽說過這樣一個事實,即在Safari和IOS中存在流式傳輸blob音頻/視頻數據的錯誤,儘管我不太清楚任何細節。

在儀式方向的指導將是非常有益的!

編輯:它看起來像這條線audio.src = window.URL.createObjectURL(blob);在接收斑被什麼導致斑點的錯誤(像我聯繫)

編輯2:我想看看如果使用的不是斑點等其他格式將工作,選擇base64編碼的字符串。看起來這可以在除IOS和Safari之外的所有設備和瀏覽器上使用。我得到的印象是它與IOS如何解釋/加載數據有關......

+1

你有沒有找到解決這個問題的方法? – scottmizo

回答

0

我一直沒能找到一個使用音頻元素的解決方案,但是Web Audio Api似乎做了絕招:https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

var audioContext = new (window.AudioContext || window.webkitAudioContext); 
    socket.on('voice', function(arrayBuffer) { 
     audioContext.decodeAudioData(arrayBuffer, audioData => { 
     var source = audioContext.createBufferSource(); 
     source.buffer = audioData; 
     source.connect(audioContext.destination); 
     source.start() 
    }); 

您可能仍需要在iOS上的問題,因爲任何音頻/視頻必須由用戶操作觸發。

相關問題