Transmisión en vivo usando FFMPEG para la api de audio web

Estoy tratando de transmitir audio usando node.js + ffmpeg a navegadores conectados en LAN solo usando la api de audio web.

No uso el elemento porque está agregando su propio búfer de 8 a 10 segundos y quiero obtener la máxima latencia posible (de 1 a 2 segundos como máximo).

El audio se reproduce con éxito, pero el audio es muy entrecortado y ruidoso.

Aquí está mi archivo node.js (lado del servidor):

var ws = require('websocket.io'), server = ws.listen(3000); var child_process = require("child_process"); var i = 0; server.on('connection', function (socket) { console.log('New client connected'); var ffmpeg = child_process.spawn("ffmpeg",[ "-re","-i", "A.mp3","-f", "f32le", "pipe:1" // Output to STDOUT ]); ffmpeg.stdout.on('data', function(data) { var buff = new Buffer(data); socket.send(buff.toString('base64')); }); }); 

Y aquí está mi HTML:

 var audioBuffer = null; var context = null; window.addEventListener('load', init, false); function init() { try { context = new webkitAudioContext(); } catch(e) { alert('Web Audio API is not supported in this browser'); } } var ws = new WebSocket("ws://localhost:3000/"); ws.onmessage = function(message) { var d1 = base64DecToArr(message.data).buffer; var d2 = new DataView(d1); var data = new Float32Array(d2.byteLength / Float32Array.BYTES_PER_ELEMENT); for (var jj = 0; jj < data.length; ++jj) { data[jj] = d2.getFloat32(jj * Float32Array.BYTES_PER_ELEMENT, true); } var audioBuffer = context.createBuffer(2, data.length, 44100); audioBuffer.getChannelData(0).set(data); var source = context.createBufferSource(); // creates a sound source source.buffer = audioBuffer; source.connect(context.destination); // connect the source to the context's destination (the speakers) source.start(0); }; 

¿Alguien puede aconsejar lo que está mal?

Saludos, Nayan

Está tomando fragmentos de datos, creando nodos separados de ellos e iniciándolos en función de la sincronización de la red. Para que el audio sea correcto, la reproducción de los búferes debe realizarse sin interrupción y una sincronización precisa de la muestra. Necesitas cambiar fundamentalmente tu método.

La forma en que lo hago es mediante la creación de un ScriptProcessorNode que administra su propio búfer de muestras PCM. En proceso, lee las muestras en el búfer de salida. Esto garantiza una reproducción suave de audio.

Lo tengo funcionando !!

Todo lo que tenía que hacer es ajustar el número de canal.

He configurado FFMPEG para que emita audio mono y funcionó a la perfección. Aquí está mi nuevo comando FFMOEG:

 var ffmpeg = child_process.spawn("ffmpeg",[ "-re","-i", "A.mp3", "-ac","1","-f", "f32le", "pipe:1" // Output to STDOUT ]);