使用FFMPEG实时stream式传输到networkingaudioAPI

我正在尝试使用node.js + ffmpeg将audiostream式传输到仅使用WebaudioAPI连接的浏览器。

不使用元素,因为它添加了自己的缓冲区8到10秒,我想获得最大的高延迟(最大大约1到2秒)。

audio播放成功,但audio非常波涛汹涌。

这里是我的node.js(服务器端)文件:

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')); }); }); 

这里是我的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); }; 

任何人都可以build议什么是错的?

问候,Nayan

您正在处理大量数据,从中创build单独的节点,并根据networking时间启动它们。 要使audio正确无误,缓冲区的播放必须没有中断和采样精确的时间。 你需要从根本上改变你的方法。

我这样做的方法是创build一个pipe理自己的PCM样本缓冲区的ScriptProcessorNode。 在进程中,它将采样读入输出缓冲区。 这保证了audio的stream畅播放。

我得到它的工作!

我所要做的就是调整频道的数量。

我已经设置FFMPEG输出单声道audio,它的工作就像一个魅力。 这是我新的FFMOEG命令:

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