Ошибка Node.js при отправке потока в Mplayer, отправка файла работает нормально

Я пытаюсь создать mplayer как дочерний процесс, иногда с файлом для воспроизведения, а иногда с потоком для воспроизведения. Файл работает нормально, но когда я создаю поток из файла, я получаю эту ошибку:

events.js:85 бросить; // Необработанное событие «ошибка» ^ Ошибка: чтение 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

person swmcdonnell    schedule 22.03.2015    source источник


Ответы (2)


Я предполагаю, что причина, по которой ошибка выглядит так плохо, заключается в том, что существует основная проблема с net.Socket.on, как видно здесь, а код был изменен здесь. Таким образом, joyent, по-видимому, является кодом, лежащим в основе ошибки. Моя попытка выше заключалась в том, чтобы сделать ловушку для всех ошибок, которая «проглатывает» ошибку и помещает ее в журнал.

Что такое TCP RST? Прочитайте об этом здесь. Иногда маршрутизатор или ваш интернет-провайдер хотят убедиться, что открытое TCP-соединение все еще прослушивается, и поэтому они вводят сброс. Ожидается, что стек вашего приложения будет отвечать таким образом, чтобы они не прерывали сеанс.

Более короткий ответ: попробуйте обновить модуль Joyent до последней версии.

Из этого ответа, «Чистое и правильное решение: технически, в узле, всякий раз, когда вы генерируете событие «ошибка» и никто его не слушает, оно будет генерировать. Чтобы оно не генерировалось, поместите на него прослушиватель и обработайте его самостоятельно. зарегистрируйте ошибку с дополнительной информацией.", предлагается прослушать (перехватить) ошибку, чтобы она не вызывала исключение. Джойент выдает ошибку. Если его не поймать (заманить в ловушку), то он поднимается до уровня разрушения.

person Michael Blankenship    schedule 27.03.2015
comment
Спасибо. Я читал другие сообщения, но не все щелкнуло. Теперь я понимаю их и проблему после прочтения вашего объяснения. - person swmcdonnell; 07.04.2015

Пытаться

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

...где-то до звонка. Вы в основном отделяете логику ошибок от самого потока. Если дочерний процесс еще не запущен или закрылся до вызова родительского процесса, привязки нет. <- Предполагать

person Michael Blankenship    schedule 22.03.2015
comment
Я не совсем уверен, что вы имеете в виду. Разве я не должен создавать переменную для потока перед включением (ошибка)? Если да, то это будет следующий оператор, а не связанный оператор, и я не думаю, что это будет иметь значение (но я попробую, если вы скажете мне, куда его поместить). - person swmcdonnell; 23.03.2015