Javascript 在Node.js中将声音输送到扬声器时,音频会发生漂移
在我正在开发的一个程序中,消除echo是一件大事,其他开发人员已经注意到程序中的echo存在漂移。为了找出问题出在哪里,我撕开了代码,最后发现无论我做什么,Node.js中的音频都会漂移 复制步骤 1。具有用于采样的.wav音频录制 2.有一个音频录制程序来录制扬声器的输出,并将麦克风指向扬声器进行直接录制 3。首先,使用普通音频播放器应用程序录制正在播放的.wav。分析这两个文件,注意这两个文件中没有音频漂移 4.在Node.js中创建以下脚本Javascript 在Node.js中将声音输送到扬声器时,音频会发生漂移,javascript,node.js,audio,stream,pipe,Javascript,Node.js,Audio,Stream,Pipe,在我正在开发的一个程序中,消除echo是一件大事,其他开发人员已经注意到程序中的echo存在漂移。为了找出问题出在哪里,我撕开了代码,最后发现无论我做什么,Node.js中的音频都会漂移 复制步骤 1。具有用于采样的.wav音频录制 2.有一个音频录制程序来录制扬声器的输出,并将麦克风指向扬声器进行直接录制 3。首先,使用普通音频播放器应用程序录制正在播放的.wav。分析这两个文件,注意这两个文件中没有音频漂移 4.在Node.js中创建以下脚本 var process = require( '
var process = require( 'process' );
var argv = require('minimist')( process.argv.slice(2) );
var Speaker = require( 'speaker' );
var fs = require( 'fs' );
var wav = require( 'wav' );
var wavReader = fs.createReadStream( String( argv._[ 0 ] ) )
.pipe( wav.Reader() );
var buffer = null;
wavReader.on( 'format', function( format ) {
console.log( "Playing wav.", format );
wavReader.on( 'data', function( chunk ) {
if( buffer )
buffer = Buffer.concat( [ buffer, chunk ] );
else
buffer = chunk;
} )
.on( 'end', function() {
new Speaker( format ).write( buffer );
} );
} );
5。执行与前面相同的录制过程,但这次录制Node.js脚本的输出。请注意录制的文件与原始文件中的音频漂移
这就是我在步骤5中执行上述操作时看到的情况。在我的屏幕截图中,顶部是原始的.wav文件,底部是在开始正确对齐后录制的版本。
我认为可能是节点扬声器模块包,所以我决定使用aplay for alsa重新编写代码
var process = require( 'process' );
var argv = require('minimist')( process.argv.slice(2) );
var fs = require( 'fs' );
var wav = require( 'wav' );
var spawn = require('child_process').spawn;
var wavReader = fs.createReadStream( String( argv._[ 0 ] ) )
.pipe( wav.Reader() );
var buffer = null;
wavReader.on( 'format', function( format ) {
console.log( "Playing wav.", format );
var aplay = spawn( 'aplay', [
"-r", String( format.sampleRate ),
"-c", String( format.channels ),
"-f", "S16_LE"
]
);
wavReader.pipe( aplay.stdin );
} );
但是,此代码中也会出现相同的音频漂移。我希望这不是Node.js的限制,我不必切换到C++来解决这个问题。我的Node.js版本是v0.10.30。我用C中的alas测试了相同的功能。结果表明,问题只在播放8000Hz音频时出现。我想也许我的声卡在重新采样时表现不太好。我在另一台计算机上尝试了相同的功能,没有出现漂移。所以这毕竟不是Node.js的问题