3

У меня есть две камеры в моем саду, снимающие в формате JPEG изображения двух растений, которые меня интересуют.

У одного из них уже есть наложенная метка времени, и это не доставляет мне проблем, я делаю ежедневный фильм с:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4  -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

И фильм получается идеальным, с изображениями в идеальной последовательности.

Что касается другого, метод, который я использую, является двухэтапным, который я хотел бы преобразовать в один шаг. Он берет каждую картинку, накладывает на каждую, хранит в папке tmp, из которой сценарий делает фильм.

Это работает, но очень трудоемко и ухудшает качество из-за процесса двойного кодирования.

Итак, я решил сделать один шаг с помощью любого из приведенных ниже сценариев:

cat *.jpg | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text="Partial filename of each image, containing date-time": fontcolor=yellow@0.8: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

Вопрос 1: Это работает, но я не могу обработать имя файла, чтобы вставить его в фильтр.

Был бы другой способ:

find . -type f -name '*.jpg' -exec TEST=$'{}' \; -exec cat {} \; | ffmpeg -y -f image2pipe -i - -an -threads 4 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf: text=$TEST: fontcolor=yellow@0.8: x=7: y=7" -vcodec libx264 -s vga -r 24 -b:v 512k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 -b-pyramid 1 -8x8dct 1 -coder 1 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -loglevel info "../video_test.mp4"

Как вы можете видеть, намерение получить имя файла в переменной, обработать его и использовать в фильтре.

Вопрос 2 Здесь есть две проблемы. Во-первых, изображения не сортируются по имени файла, поэтому не по времени. Второй 'find' не работает, как я ожидал, с двумя командами exec.

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

TIA JSS

1 ответ1

0

Я не знаю FFmpeg, и у меня его нет, поэтому я не могу это проверить.  Но вы говорите, что cat *.jpg (и, например, echo *.jpg) выдаст вам файлы в правильном порядке.  В этом случае вы должны иметь возможность делать то, что вы хотите с

for f in *.jpg
do
   ffmpeg -y … args … text="$f": … more args … -loglevel info "../video_test.mp4" < "$f"
done

или, если вы настаиваете на использовании cat:

for f in *.jpg
do
   cat "$f" | ffmpeg -y … args … text="$f": … more args … -loglevel info "../video_test.mp4"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .