Я пытаюсь обработать программный процесс Perl с выходом ffmpeg encode, однако моя тестовая программа только, кажется, получает вывод ffmpeg в периодических кусках, поэтому я предполагаю, что есть какой-то вид буферизации. Как я могу заставить его обрабатывать его в режиме реального времени?Как остановить perl-буферизацию ffmpeg output
Моя тестовая программа (команда tr
там, потому что я думал, что, может быть, возврат каретки FFmpeg, причиняли Perl, чтобы увидеть одну большую длинную линию или что-то):
#!/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
}
Все отлично работает, когда я заменить ffmpeg
команду с этот скрипт:
#!/bin/bash
echo "hello";
for i in `seq 1 10`; do
sleep 1;
echo "hello $i";
done
echo "bye";
При использовании приведенного выше сценария я вижу выход каждую секунду, когда это происходит. С ffmpeg
он составляет примерно 5-10 секунд или до тех пор, пока он не выйдет, и будет выводить иногда по 100 строк на каждый вывод.
Я пробовал использовать программу unbuffer
впереди ffmpeg
в вызове команды, но, похоже, это не имеет никакого эффекта. Возможно, это 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
).
Попробуйте 'открытой (F, '- |: unix', "ffmpeg ......") ' –
@ChankeyPathak Я попробовал добавить: unix, но, к сожалению, это не похоже ни на что другое. –
@SebastianKing: Вы понимаете, что делают '2> & 1'? Почему вы положили его туда? – Borodin