首页 文章

Node.js错误发送流到Mplayer,发送文件工作正常

提问于
浏览
0

我正在尝试将mplayer作为子进程生成,有时会播放一个文件,有时会播放一个流 . 该文件工作正常,但是当我从文件创建流时,我收到此错误:

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

这不是文件权限问题,因为我将其作为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

2 回答

  • 0

    我猜这个错误看起来很糟糕的原因是net.Socket.on有一个潜在的问题,如here,代码被修改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.",建议是监听(陷阱)错误,以便它不会捕获它(捕获它)然后它上升到破坏程度 .

  • 0

    尝试

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

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

相关问题