1

child_process.spawnを使用してnode.jsプログラムでmplayerを制御 しようとしています。

一時停止した後、再生を再開できません。何らかの理由で、exitmplayerの再生が終了していなくてもイベントが送信されます。

私は何が間違っているのですか?

次のコードは、2番目の一時停止コマンドまで正常に機能します(音楽の再生が聞こえます)。

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 }

このような2番目のもの:

{ _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)
4

1 に答える 1

2

テストやデバッグを試みることなく、いくつかの考えが思い浮かびます。

mplayerのスレーブモードを使用します。これを行うには-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' );
}
于 2012-10-05T07:54:01.490 に答える