Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js中将声音输送到扬声器时,音频会发生漂移_Javascript_Node.js_Audio_Stream_Pipe - Fatal编程技术网

Javascript 在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( '

在我正在开发的一个程序中,消除echo是一件大事,其他开发人员已经注意到程序中的echo存在漂移。为了找出问题出在哪里,我撕开了代码,最后发现无论我做什么,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文件,底部是在开始正确对齐后录制的版本。

我认为可能是节点扬声器模块包,所以我决定使用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的问题