Node.js 向 Mplayer 发送流时出错,发送文件正常

Node.js Error Sending Stream to Mplayer, Sending File Works Fine

我正在尝试将 mplayer 作为子进程生成,有时播放文件,有时播放流。该文件工作正常,但是当我从该文件创建流时,出现此错误:

events.js:85 扔呃; // 未处理的 'error' 事件 ^ 错误:读取 ECONNRESET 在 exports._errnoException (util.js:746:11) 在 Pipe.onread (net.js:550:26)

这不是文件权限问题,因为我 运行 它作为 sudo 并且仍然有同样的问题。

为了测试流式处理的潜在问题,我从读取流创建了一个写入流,并且没有问题。

我不太确定下一步该做什么。如果有任何建议或帮助,我将不胜感激。

代码如下:

var fs = require('fs');
var spawn = require('child_process').spawn;
var file = "/usr/local/apps/ha6/web/voice/ga.wav";
var file2 = "/usr/local/apps/ha6/web/voice/ga2.wav";

function filePlay() {
    var mplayer = spawn("mplayer", ["-slave", file], {stdio: ['pipe', 'ignore', 'ignore']});
    mplayer.on("exit", function () {
        console.log("exit");
    });
}

function streamPlay() {
    var str = fs.createReadStream(file).on("error", function (error) {
        console.log("Error creating read stream:" + error);
    });

    var mplayer = spawn("mplayer", ["-slave "], {stdio: ['pipe', 'ignore', 'ignore']}).on("error", function (error) {
        console.log("Spawn error " + error);
    });

    str.pipe(mplayer.stdin);
}


function testPiping() {
    var str = fs.createReadStream(file).on("error", function (error) {
        console.log("Error creating read stream:" + error);
    });
    var str2 = fs.createWriteStream(file2).on("error", function(error) {
        console.log("Error creating write stream:" + error);
    });
    str.pipe(str2);
    console.log("Pipe a success!");
}

filePlay();     // works fine
testPiping();   // works fine
streamPlay();   // ECONNRESET error

尝试

stream.on("error", function(e) { console.log(e); });

...通话前的某个地方。您基本上是将错误逻辑与流本身分开。如果子进程尚未 运行 或在父进程调用之前已关闭,则没有绑定。 <- 猜猜

我猜错误看起来如此糟糕的原因是 net.Socket.on 存在潜在问题,如 here and the code was revised here 所示。所以 joyent 似乎是底层错误中的代码。我上面的尝试是制作一个包罗万象的错误捕获器,"swallows" 错误并将其放入日志中。

什么是 TCP RST?阅读它 here。有时路由器或您的 ISP 想要验证打开的 TCP 连接是否仍在侦听,因此他们会注入重置。您的应用程序堆栈应该以这样一种方式响应,以满足他们不会放弃会话。

更简短的回答:尝试将 joyent 模块升级到最新版本。

根据 this 回答 "Clean and correct solution: Technically, in node, whenever you emit an 'error' event and no one listens to it, it will throw. To make it not throw, put a listener on it and handle it yourself. That way you can log the error with more information.",建议是 listen(捕获)错误,这样它就不会抛出异常。 Joyent 正在抛出错误。如果你不抓住它(捕捉它)那么它就会上升到破坏的程度。