Я использую livestreamer
и ffmpeg
для захвата изображений из прямой трансляции со скоростью 0,1 кадра в секунду:
livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=1/10 out%04d.png" https://www.ustream.tv/channel/number worst
Я не мог заставить ffmpeg перезаписать свой вывод, поэтому он продолжает создавать новые файлы с шаблоном out%04d.png
. Это нормально, я могу следить за самым новым файлом и удалять старые. Однако процесс livestreamer
иногда завершается по разным причинам, и я хотел бы перезапустить его автоматически, если я хочу его запустить.
Попытка использовать подоболочку не отреагировала на CTRL-C, как я ожидал, потому что сигнал не передается по подоболочке:
#!/bin/bash
( while true; do
livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=0.1 out%04d.png" https://www.ustream.tv/channel/number worst
done ) &
while true; do
newestImage=${code to find newest image}
postProcess $newestImage
deleteOldImages
sleep 5
done
Когда я отправляю SIGINT
вышеприведенному сценарию, подоболочка остается активной, даже когда я закрываю оболочку, в которой я запускала родительский сценарий. Выходной каталог заполнен новыми файлами, а код, который должен их удалить, больше не работает. trap
тоже не помогла:
trap "kill $SUBSHELL_PID" SIGINT
( ... ) & # subshell as above
SUBSHELL_PID=&!
С этим я даже не смог прервать родительский сценарий. Очевидно, я совсем не разбираюсь в обработке сигналов в bash, поэтому я рад любому совету, который поможет мне двигаться вперед. Мне нужно перезапустить фрейм-граббер, пока работает родительский скрипт, и следить за старыми файлами, чтобы удалить их.
Редактировать: Может ли подоболочка быть плохой идеей? Могу ли я как-нибудь запустить livestreamer
в фоновом режиме и либо убить его, когда захочу, либо перезапустить, когда он сам выйдет?