在Node.js中将声音传递给扬声器时的音频漂移

时间:2015-09-02 12:55:43

标签: javascript node.js audio stream pipe

在我开发的一个程序中,消除回声是一个大问题,其他开发人员已经注意到程序中的回声有一个漂移。为了查看问题所在,我将代码分开,最后发现无论我做什么,音频都会在Node.js中漂移。

重现的步骤

1。有一个.wav录音用于采样。

2. 有一个录音程序来记录扬声器的输出并将麦克风指向扬声器以便直接录制。

3. 首先,使用普通音频播放器应用程序录制正在播放的.wav。分析这两个文件并注意两者中没有音频漂移。

4. 在Node.js中创建以下脚本

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文件,底部是在开头正确对齐后的记录版本。 Audio Drift

我想也许是节点扬声器模块包,所以我决定使用aplay为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

1 个答案:

答案 0 :(得分:0)

我用C中的alas测试了相同的功能。只有在播放8000Hz音频时才会出现问题。我想,也许我的声卡在重新采样时表现不佳。我在另一台计算机上尝试了相同的功能,没有漂移。所以它毕竟不是Node.js问题。