2015-03-22 4 views
0

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

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

ответ

0

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

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

Короткий ответ: попробуйте обновить модуль с радостью до последнего.

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

+0

Спасибо. Я прочитал другие сообщения, но он не все нажал. Теперь я понимаю их и проблему после прочтения вашего объяснения. – swmcdonnell

0

Попробуйте

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

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

+0

Я не совсем уверен, что вы имеете в виду. Разве мне не нужно создавать переменную для потока перед тем, как надеть («ошибка»)? Если это так, это будет следующий оператор вместо цепочки, и я не думаю, что это изменило бы (но я постараюсь, если вы скажете мне, где его поместить). – swmcdonnell

Смежные вопросы