我怎样才能使用child_process.spawn暂停媒体播放器?

我试图用一个node.js程序使用child_process.spawn来控制 mplayer 。

我在暂停播放后遇到问题。 出于某种原因,即使mplayer还没有完成播放,也会发送exit事件。

我究竟做错了什么?

下面的代码工作正常(我可以听到音乐播放),直到第二个暂停命令。

 var spawn = require( 'child_process' ).spawn; var mplayer; var file = '/Users/snorpey/Music/Blink-182/Untitled/01 Feeling This.m4a'; mplayer = spawn( 'mplayer', [ file ] ); mplayer.on( 'exit', function(){ console.log( 'EXIT.' ); } ); setTimeout( pause, 5000 ); setTimeout( pause, 9000 ); function pause() { console.log( 'PAUSE', mplayer.stdin ); mplayer.stdin.write( 'p\n' ); } 

mplayer.stdin的第一个输出如下所示:

 { _handle: { writeQueueSize: 0, owner: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, errorEmitted: false, bytesRead: 0, _bytesDispatched: 0, allowHalfOpen: undefined, writable: true, readable: false } 

第二个是这样的:

 { _handle: null, _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: true, errorEmitted: false, bytesRead: 0, _bytesDispatched: 2, allowHalfOpen: undefined, writable: false, readable: false, _connecting: false, _connectQueue: null, _idleNext: null, _idlePrev: null, _idleTimeout: -1 } 

我得到以下错误:

 events.js:66 throw arguments[1]; // Unhandled 'error' event ^ Error: This socket is closed. at Socket._write (net.js:517:19) at Socket.write (net.js:509:15) at Object.pause [as _onTimeout] (/Users/snorpey/Sites/Development/mplayer/pause.js:14:16) at Timer.list.ontimeout (timers.js:101:19) 

不要试图testing或debugging一些想法想到:

使用mplayer的从属模式。 通过在启动时-slave提供-slave标志来实现这一点。 有关更多信息,请参阅http://www.mplayerhq.hu/DOCS/tech/slave.txt

设置代码来显示mplayers想告诉你什么。 可能比观察套接字状态更有意义。

 var spawn = require( 'child_process' ).spawn; var mplayer; var file = '/Users/snorpey/Music/Blink-182/Untitled/01 Feeling This.m4a'; mplayer = spawn( 'mplayer', [ '-slave', file ] ); mplayer.on( 'exit', function () { console.log( 'EXIT.' ); } ); // obviously you'll want something smarter than just logging... mplayer.stdout.on('data', function (data) { console.log('mplayer stdout: ' + data); }); mplayer.stderr.on('data', function (data) { console.log('mplayer stderr: ' + data); }); setTimeout( pause, 5000 ); setTimeout( pause, 9000 ); function pause() { console.log( 'PAUSE' ); mplayer.stdin.write( 'pausing\n' ); }