Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 如何正确结束或销毁扬声器实例而不出现“非法硬件指令”错误?_Javascript_Node.js - Fatal编程技术网

Javascript 如何正确结束或销毁扬声器实例而不出现“非法硬件指令”错误?

Javascript 如何正确结束或销毁扬声器实例而不出现“非法硬件指令”错误?,javascript,node.js,Javascript,Node.js,我有一个通过扬声器模块播放远程mp3源的脚本,它工作正常。但是,如果我想停止播放mp3流,我会遇到两个问题: 如果我停止对远程源进行流式传输,例如,通过调用下面代码第11行中的stream.pause,则stdout将充满警告: [../deps/mpg123/src/output/coreaudio.c:81]警告:回调缓冲区下溢中没有任何音频数据 警告本身是有意义的,因为我不再向它提供任何数据,但它非常频繁地输出数据,这是一个大问题,因为我想将其用于CLI应用程序 如果我试图在下面代码的第1

我有一个通过扬声器模块播放远程mp3源的脚本,它工作正常。但是,如果我想停止播放mp3流,我会遇到两个问题:

如果我停止对远程源进行流式传输,例如,通过调用下面代码第11行中的stream.pause,则stdout将充满警告:

[../deps/mpg123/src/output/coreaudio.c:81]警告:回调缓冲区下溢中没有任何音频数据

警告本身是有意义的,因为我不再向它提供任何数据,但它非常频繁地输出数据,这是一个大问题,因为我想将其用于CLI应用程序

如果我试图在下面代码的第13行中结束调用speaker.end的speaker,则会出现以下错误:

[1] 8950非法硬件指令节点index.js

除了一些Raspberry Pi线程之外,我一直找不到关于这个错误的任何东西,我很困惑是什么导致了非法的硬件指令

我怎样才能妥善处理这个问题?我可以通过管道将缓冲区下溢警告传递给dev/null之类的对象吗?或者这是一种糟糕的处理方法吗?或者我可以用另一种方式结束/销毁speaker实例吗

我正在macOS v10.12.1上运行Node v7.2.0、npm v4.0.3和Speaker v.0.3.0

const request = require('request')
const lame = require('lame')
const Speaker = require('speaker')
var decoder = new lame.Decoder()
var speaker = new Speaker()
decoder.pipe(speaker)
var req = request.get(url_to_remote_mp3)
var stream = req.pipe(decoder)

setTimeout(() => {
  stream.pause()
  stream.unpipe()
  speaker.end()
}, 1000)

您将希望对该模块及其使用的库使用github问题,以确保没有其他人已经解决了该问题,如果没有,请打开一个描述该问题的bug,以便其他模块用户可以引用它,因为这是他们将首先查看的地方

处理此问题的一个好方法可能是修改扬声器模块的本机部分,除非您的声音库版本不匹配。

我认为问题可能出在cordaudio.c猜测中。这看起来像是缓冲区:当你刷新它时,写入的内容会变大。我最好的猜测是,在刷新缓冲区后,write_coreaudo中的usleep时间计算错误。我认为程序可能睡眠时间太长,因此缓冲区太大,无法播放

我不清楚为什么美国LEEP的时间是这样计算的

无论如何。。。这对我很有用:

更改node_modules/speaker/deps/mpg123/src/output/coreaudio.c:258

-usleep FIFO_持续时间/2*1000000; +usleep FIFO_持续时间/2*100000; 然后在节点_modules/speaker/目录中,运行:

节点gyp构建 您应该能够使用:

const request=要求“请求” 常量lame=需要“lame” const Speaker=需要“Speaker” 常量url=http://aasr-stream.iha.dk:9870/dtr.mp3' 常量解码器=新的跛行解码器 让演讲者=新演讲者 扬声器解码器 const req=request.geturl var stream=req.pipedecoder 设置超时=>{ 控制台。记录“关闭扬声器” 演讲者,结束 }, 2000 设置超时=>{ console.log“关闭节点” }, 4000 。。。对我来说,没有错误,在预期的时候停止


<>我希望这对你也适用。

我考虑在Github上打开一个问题而不是在这里问,但是维护者似乎没有回应一个类似的问题,所以我认为我的机会可能会更好,也许我会重新考虑。GITHUB的问题是这个问题的关键参考,所以你应该链接。同时在github上为他人写下问题,检查是否存在任何分叉,并在Speaker使用的底层本机库下查找问题。