У меня есть программно определенное радио, воспроизводящее аудиопоток с сервера WebSocket, и клиент, который потребляет данные и воспроизводит их с помощью AudioBufferSourceNode.Webaudio Воспроизведение из WebSocket имеет выпадения
В основном это работает. Единственная проблема заключается в том, что каждые несколько секунд происходят кратковременные выпадения, предположительно вызванные накладными расходами, связанными с созданием каждого последующего экземпляра AudioBufferSourceNode. Спецификация проекта WebAudio говорит, что AudioBuffer следует использовать для воспроизведения звуков, длительностью не более одной минуты, и чтобы более длинные звуки воспроизводились с использованием MediaElementSourceNode. Это не работает для меня, потому что мне нужно воспроизводить аудио из источника WebSocket, и я не знаю, как создать элемент мультимедиа (например, аудио-элемент HTML5) для работы с WebSocket.
Возможно, я пытаюсь сделать то, что WebAudio не может поддерживать, объединив экземпляры AudioBufferSourceNode и ожидая, что они будут играть один за другим без проблем. Но, похоже, должен быть способ воспроизвести данные WebSocket через WebAudio, и действительно, auroa.js (вместе с плагином aurora-websocket.js), похоже, это делает. Я закодировал клиента, используя aurora.js, но я столкнулся с другими проблемами, для которых я создал проблему auroa.js на Github. Тем временем я надеюсь, что могу сделать в своем клиенте то, что они, похоже, сделали, используя WebAudio для беспрепятственного воспроизведения данных из WebSocket.
Вот приведенный вид моего кода, чтобы показать реализацию, которую я использую.
var context = ...
var gainNode = ...
var playBuffer = function(buf) {
var source = context.createBufferSource();
source.buffer = buf;
source.connect(gainNode);
source.start();
};
var socket = ...
socket.binaryType = 'arraybuffer';
socket.addBinaryListener(function (data) {
context.decodeAudioData(data, playBuffer);
});
socket.connect...
Я также попробовал реализацию, в котором я отслеживать входящие буфера из WebSocket и воспроизводить их в порядке получения, через AudioBufferSourceNode, после того, как «закончились» событие, полученная от предыдущего AudioBufferSourceNode. Это имеет ту же проблему, что и выше.
Спасибо. У меня было время начала обработки, пока вы показываете; Я вытащил как одну из вещей, которые я пробовал, чтобы заставить ее работать, и забыл вернуть ее. Итак, у меня все еще были исключения из-за правильного времени.Я переключился с ogg/vorbis на wav/lpcm data, ad все в порядке. Возможно, это была проблема с кодером vorbis, который написал мой коллега; но у меня не было выпадений при использовании aurora.js и vorbis.js (но vorbis.js ушел с ошибкой памяти через 13 минут 25 секунд). Несжатые данные подходят для нашего приложения. – MidnightJava
Что касается частоты дискретизации, наш источник является выборкой на 32000, а AudioContext сообщает о частоте дискретизации 41100. Я не слышу никаких артефактов на границах буфера, но это не аудио высокой точности. Это доказательство концепции программного обеспечения радио с использованием RTL-устройства, и мы просто потоковое моно. – MidnightJava
Ах. Большинство кодов с потерями заполняют данные, поэтому, возможно, вы получаете несогласованные длины. – cwilso