LinuxForum.Fans
Тема

ffmpeg и конвеер Bash

Автор: ormorph 5 сообщений 3644 просмотров
#319396

Кто знает реально ли обрабатывать поток в реальном времени средствами bash?

У меня сложилось стойкое мнение что Bash этого не умеет, например если надо обработать вывод программы поток текстовой информации которой очень продолжительное время идет, получается только сбрасывать эту информацию в файл, а затем только обрабатывать.
Примером такого потока может быть вывод ffmpeg в консоль.

например конструкция:
ffmpeg [параметры]|while read file и т.д.

Сначала дождется пока поток не закончится и только потом станет его обрабатывать.

#319398
"ormorph⇓" написал:
У меня сложилось стойкое мнение что Bash этого не умеет, например если надо обработать вывод программы поток текстовой информации которой очень продолжительное время идет, получается только сбрасывать эту информацию в файл, а затем только обрабатывать.

это только впечатление...

"ormorph⇓" написал:
например конструкция:ffmpeg [параметры]|while read file и т.д.

можно полный рабочий пример?
пока могу предположить, что проблема с буферизацией: http://mywiki.wooledge.org/BashFAQ/009

#319407
"Fat-Zer⇓" написал:
можно полный рабочий пример?
пока могу предположить, что проблема с буферизацией: http://mywiki.wooledge.org/BashFAQ/009

На ссылке используются сторонние программы для перенарправления потоков и обработки потоков, а если нужно использовать определенные числа этого потока и производить вычисление, то средствами bash это проблемно.
И то вроде описываются что параметры действуют норм, на самом деле неа

Вот самый простой пример:
захват экрана и звука

text
ffmpeg -f alsa -ac 2 -i pulse -acodec pcm_s16le -f x11grab -s 1366x768 -r 10 -i :0.0 -vcodec mpeg4 -sameq test.mp4 2>&1|cat|sed -u 's/time/BONUS/'

Главное чтобы у вас ffmpeg был собран с поддержкой всех этих кодеков, можете любые другие параметры конвертации попробовать.

Зы: тут объединение потоков идет потому что вывод значения time идет по stderr

#319414
"ormorph⇓" написал:
Главное чтобы у вас ffmpeg был собран с поддержкой всех этих кодеков, можете любые другие параметры конвертации попробовать.
Зы: тут объединение потоков идет потому что вывод значения time идет по stderr

не очень пойму, чего ты пытаешься добиться/чего не так... если вывод идёт не на терминал, то ffmpeg пишет статистику только в самом конце....

[added]
был неправ... но тут сам ffmpeg виноват... он CR'ами свою статистику разделяет, а sed обрабатывает всё только построчно...

в качестве костыля предложу такую конструкцию:
ffmpeg -y -f alsa -ac 2 -i hw:1 -acodec pcm_s16le -f x11grab -s 1680x1050 -r 10 -i :0.0 -vcodec mpeg4 -sameq test.mp4 2>&1 | stdbuf -o0 tr '\r' '\n' | sed -u 's/time/BONUS/'

#319539
"Fat-Zer⇓" написал:
в качестве костыля предложу такую конструкцию:
ffmpeg -y -f alsa -ac 2 -i hw:1 -acodec pcm_s16le -f x11grab -s 1680x1050 -r 10 -i :0.0 -vcodec mpeg4 -sameq test.mp4 2>&1 | stdbuf -o0 tr '\r' '\n' | sed -u 's/time/BONUS/'

Ага это оно самое, проблему решить удалось, только обработать нормально получается только используя конвейер+while цикл, но удалось.

"Fat-Zer⇓" написал:
не очень пойму, чего ты пытаешься добиться/чего не так... если вывод идёт не на терминал, то ffmpeg пишет статистику только в самом конце....

Просто хотел прицепить после команды захвата команду сжатия файла, с помощью ffmpeg.
Как раз надо было обработать текстовую информацию чтобы вывести на сколько процентов выполнен процесс сжатия(конвертирования) файла и вывести в диалог zenity.



Все получилось :)

Войдите или зарегистрируйтесь, чтобы ответить.