私のテストプログラムはffmpegの出力を定期的なチャンクで受け取るように見えるので、Perlプログラムでffmpegの出力を処理しようとしています。バッファリングが続行されます。それをリアルタイムで処理させるにはどうしたらいいですか?perlバッファリングffmpegの出力を停止する方法
私のテストプログラム(私は多分ffmpegののキャリッジリターンはperlが一つの大きな長い行か何かを見ることが原因と思っていたので、tr
コマンドがあります):私はffmpeg
コマンドを交換する際に
#!/usr/bin/perl
$i = "test.mkv"; # big file, long encode time
$o = "test.mp4";
open(F, "-|", "ffmpeg -y -i '$i' '$o' 2>&1 | tr '\r' '\n'")
or die "oh no";
while(<F>) {
print "A12345: $_"; # some random text so i know the output was processed in perl
}
すべてが正常に動作しますこのスクリプト:
#!/bin/bash
echo "hello";
for i in `seq 1 10`; do
sleep 1;
echo "hello $i";
done
echo "bye";
上記のスクリプトを使用すると、毎秒出力が表示されます。 ffmpeg
の場合、出力するまでには5〜10秒程度かかりますが、出力ごとに100行も出力されることがあります。
コマンドコールでffmpeg
より先にunbuffer
プログラムを使用しようとしましたが、効果がないようです。バッファリングしている可能性があります2>&1
ですか? 何か助けていただければ幸いです。
あなたはffmpegのの出力に慣れていない場合、それはSTDOUT
にファイル情報や原料の束を出力し、エンコード時に、それは、キャリッジで始まる
frame= 332 fps= 93 q=28.0 size= 528kB time=00:00:13.33 bitrate= 324.2kbits/s speed=3.75x
のような行を出力は、したがって、(代わりに新しい行を返しますtr
)をSTDERR
(したがって2>&1
)に設定します。
を@Borodinに行く必要がありますF、 ' - |:unix'、 "ffmpeg ......") ' –
@ChankeyPathak私はunixを追加しようとしましたが、残念なことに違いはありません。 –
@SebastianKing: '2>&1'は何をするのですか?どうしてそこに置いたのですか? – Borodin