びぃえるくぅと。

ガラケーは打楽器。

Node.js から ffmpeg 走らせてたら pipe 書き込み量の上限でハングアップしたらしい話

備忘録です(言い訳)。 あと、書いている内容は書いている時の知識に基づくので、誤りがある可能性があります。

状況

買った・ダウンロードした VJ 素材を VDMX で使えるように一括変換するバッチ処理的なものを Node.js で書いてます。

変換には内部で ffmpeg を呼び出しているのですが、進捗を取得できるよう -progress - というオプションをつけて標準出力に情報を書き出し、 それを Node.js スクリプト側で受け取る実装にしていました。

ところが、一定時間 経過すると呼び出している ffmpeg がハングアップするも、 ffmpeg 自体は死んでいないというよくわからない状態に必ずなるようになりました。

なお、呼び出しているのと全く同じコマンドを bash で実行すると ffmpeg はちゃんと完走するため、さらによくわからん状態です。

原因(らしきもの)の特定

はじめ htop とにらめっこしたりして紆余曲折を経ていたのですが、神頼みで ffmpeg hangup で検索したところ、 下記の Stack overflow の QA にヒットしました。

stackoverflow.com

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 側のバッファの問題?

github.com

古めですがこちらの issue に気になる内容があり、適宜 proc.stdout.on('data', (chunk) => {}) してやれば止まらず実行し続けるとのことでした。

そういえばと思い、(すでに stdout の方は .on('data') で拾っていたので)stderr に対して上記の対応をしたところ、 { stdio: 'ignore' } をしなくても止まらず完走するようになりました。

Copyright © 2015 Yadex205