使用ffmpeg,javascript和nodejs实况audio

我对这件事很陌生。 请不要挂我的语法差。 我正试图创build一个概念certificate应用程序,我将在以后扩展。 它执行以下操作:我们有一个html页面,要求获得使用麦克风的权限。 我们捕获麦克风input,并通过websocket发送到节点js应用程序。

JS(客户端):

var bufferSize = 4096; var socket = new WebSocket(URL); var myPCMProcessingNode = context.createScriptProcessor(bufferSize, 1, 1); myPCMProcessingNode.onaudioprocess = function(e) { var input = e.inputBuffer.getChannelData(0); socket.send(convertFloat32ToInt16(input)); } function convertFloat32ToInt16(buffer) { l = buffer.length; buf = new Int16Array(l); while (l--) { buf[l] = Math.min(1, buffer[l])*0x7FFF; } return buf.buffer; } navigator.mediaDevices.getUserMedia({audio:true, video:false}) .then(function(stream){ var microphone = context.createMediaStreamSource(stream); microphone.connect(myPCMProcessingNode); myPCMProcessingNode.connect(context.destination); }) .catch(function(e){}); 

在服务器中,我们把每个传入的缓冲区,通过ffmpeg运行,并使用节点js'http'POST将标准输出到另一个设备。 该设备有一个扬声器。 我们基本上是试图创build一个从浏览器到设备的单向audio链接。

节点JS(服务器):

 var WebSocketServer = require('websocket').server; var http = require('http'); var children = require('child_process'); wsServer.on('request', function(request) { var connection = request.accept(null, request.origin); connection.on('message', function(message) { if (message.type === 'utf8') { /*NOP*/ } else if (message.type === 'binary') { ffm.stdin.write(message.binaryData); } }); connection.on('close', function(reasonCode, description) {}); connection.on('error', function(error) {}); }); var ffm = children.spawn( './ffmpeg.exe' ,'-stdin -f s16le -ar 48k -ac 2 -i pipe:0 -acodec pcm_u8 -ar 48000 -f aiff pipe:1'.split(' ') ); ffm.on('exit',function(code,signal){}); ffm.stdout.on('data', (data) => { req.write(data); }); var options = { host: 'xxx.xxx.xxx.xxx', port: xxxx, path: '/path/to/service/on/device', method: 'POST', headers: { 'Content-Type': 'application/octet-stream', 'Content-Length': 0, 'Authorization' : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'Transfer-Encoding' : 'chunked', 'Connection': 'keep-alive' } }; var req = http.request(options, function(res) {}); 

该设备只支持连续的POST,只有几种格式(ulaw,aiff,wav)

这个解决scheme似乎不工作。 在设备扬声器,我们只听到像白噪声的东西。

此外,我想我可能有一个问题,我发送到ffmpeg标准的缓冲区 – >试图将任何出来的websocket转储到.wav文件,然后用VLC播放它 – >它播放logging中的一切在大约1秒内快速 – > 10秒的录音。

我是audio处理的新手,现在已经search了大约3天了解如何改进这一点,什么也没有find。

我会问社区2件事情:

  1. 我的方法有问题吗? 我还能做些什么来完成这项工作? 如果需要,我会发布更多的细节。

  2. 如果我正在做的是重新发明轮子,那么我想知道其他软件/第三方服务(如亚马逊或其他)可以完成同样的事情。

谢谢。