Node.js から ffmpeg 走らせてたら pipe 書き込み量の上限でハングアップしたらしい話
備忘録です(言い訳)。 あと、書いている内容は書いている時の知識に基づくので、誤りがある可能性があります。
状況
買った・ダウンロードした VJ 素材を VDMX で使えるように一括変換するバッチ処理的なものを Node.js で書いてます。
変換には内部で ffmpeg を呼び出しているのですが、進捗を取得できるよう -progress -
というオプションをつけて標準出力に情報を書き出し、
それを Node.js スクリプト側で受け取る実装にしていました。
ところが、一定時間 経過すると呼び出している ffmpeg がハングアップするも、 ffmpeg 自体は死んでいないというよくわからない状態に必ずなるようになりました。
なお、呼び出しているのと全く同じコマンドを bash で実行すると ffmpeg はちゃんと完走するため、さらによくわからん状態です。
原因(らしきもの)の特定
はじめ htop とにらめっこしたりして紆余曲折を経ていたのですが、神頼みで ffmpeg hangup
で検索したところ、
下記の Stack overflow の QA にヒットしました。
It hangs because after a certain point it can not write to it's output pipe any longer.
なるほど、ffmpeg の進捗情報を pipe 経由で大量に受け取ってたのが原因かもしれません。
ということで ChildProcess.spawn
するときに { stdio: 'ignore' }
をしたところ、無事に完走できるようになりました。
パイプ以外で ffmpeg の進捗を受け取る
ごめんなさい現在探っている状態なので、見つけ・思いつき次第追記したいと思います。
(追記 2019.04.30) Node.js 側のバッファの問題?
古めですがこちらの issue に気になる内容があり、適宜 proc.stdout.on('data', (chunk) => {})
してやれば止まらず実行し続けるとのことでした。
そういえばと思い、(すでに stdout の方は .on('data')
で拾っていたので)stderr に対して上記の対応をしたところ、
{ stdio: 'ignore' }
をしなくても止まらず完走するようになりました。