6

Node.js アプリケーションから FFMPEG を実行できる必要があります。この問題は、FFMPEG に固有のものではなく、コマンド ライン引数を適切に指定することに関係している可能性が高いと思いますが、問題を絞り込むことができなかったので、問題全体を提示します。

コマンドプロンプトから次のコマンドを正常に実行できます。

C:\Brad\ffmpeg.exe -f dshow -i audio="Microphone (SoundMAX Integrated" testaaa.mp3

FFMPEG は期待どおりに起動し、オーディオ デバイスからオーディオを録音し、MP3 ファイルを書き込みます。ここで、Node.js アプリケーション内で同じことを試みます。

childProcess = child_process.spawn('C:\\Brad\\ffmpeg.exe', ['-f', 'dshow', '-i', 'audio="Microphone (SoundMAX Integrated"', 'testaaa.mp3']);
childProcess.stderr.on('data', function (data) {
    console.log('StdioSource received data from STDERR: ' + data);
});

Node.js 内から、FFMPEG が失敗します。 エラーは単純です:

[dshow @ 0000000001eded80] Could not find audio device.
audio="Microphone (SoundMAX Integrated": Input/output error

-list_devices true何らかの理由でこれは奇妙なパーミッション エラーであると考えて、Node アプリケーション内からFFMPEG を実行することにしました。確かに、問題のデバイスがリストされています。

[dshow @ 000000000228ecc0] DirectShow video devices
[dshow @ 000000000228ecc0] Could not enumerate video devices.
[dshow @ 000000000228ecc0] DirectShow audio devices
[dshow @ 000000000228ecc0]  "Microphone (SoundMAX Integrated"

FFMPEG の引数でオーディオ入力デバイスを正しく指定できない理由、または Node.js の子プロセスとして実行しているときに FFMPEG がオーディオ入力デバイスを認識しない理由について何か考えはありますか?

どんなヒントでも大歓迎です。

4

2 に答える 2

11

ブランドンは正しい軌道に乗っています。Windows コマンド ラインで引数を二重引用符で囲むと、シェルによってそれらが取り除かれ、プログラムではそれらが引用符で囲まれていないと見なされます。を使用child_process.spawn()すると、シェルをバイパスしているため、プログラムはリテラル引用符を引数の一部として認識し、それらを処理する準備ができていません。

たとえば、FFMPEG に指定したのと同じ引数を使用して実行するpargs.jsだけで構成される小さなノード スクリプト を作成すると、次のようになります。console.log(process.argv);

C:\Documents and Settings\Eric Bohlman>node pargs -f dshow -i audio="Microphone(SoundMAX Integrated" testaaa.mp3
[ 'node',
  'C:\\Documents and Settings\\Eric Bohlman\\pargs',
  '-f',
  'dshow',
  '-i',
  'audio=Microphone (SoundMAX Integrated',
  'testaaa.mp3' ]

C:\Documents and Settings\Eric Bohlman>

ご覧のとおり、シェルは引用符を使用した後に引用符を削除してaudio=...、スペースで引数が壊れないようにしています。

Linux システムで一般的に使用される bash とは異なり、Windows シェル (少なくとも XP SP3 以降) は単一引用符を削除したり、グループ化に使用したりしないことに注意してください。したがって、誰かの bash コマンド ラインの例を見ていて、単一引用符が使用されている場合、通常、Windows で動作するには、それらを二重引用符に置き換える必要があります。

于 2012-09-07T07:40:51.893 に答える
2

ebolhmanがとても鮮やかに説明したように、デフォルトでは、spawn 関数はコマンドを実行するためのシェルを作成しません。したがって、引用符は取り除かれません。それでも spawn \ spawnSync を使用したい場合は、引数を次の方法

require('child_process').spawn('ExePathHere', arrOfArguments, { shell: true });

エグゼ自体は、彼が処理できない引用符なしで引数を取得します

于 2017-09-25T11:14:19.287 に答える