9

Я использую ffmpeg для извлечения ключевых кадров из видео. Это команда:

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

Как я могу получить индекс каждого ключевого кадра, извлеченного в видео? Например, для первого I-кадра индекс будет равен 0, для второго - 24 и т.д.

2 ответа2

15

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

Предполагается, что вы работаете в Linux/Unix:

Извлечь кадры и типы кадров

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1

Команда grep фильтрует строки с I в них и подсчитывает их индекс (используя опцию -n ). Команда cut выбирает только первый столбец выходных данных (индекс). Обратите внимание, что этот индекс основан на 1, а не на 0.

Переименовать выходные файлы на основе индекса

Вы можете фактически передать эти индексы в список:

ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt

Затем составьте список всех миниатюр:

ls -1 thumbnails*.jpeg > thumbnails.txt

Затем вставьте эти два вместе:

paste thumbnails.txt frame_indices.txt > combined.txt

Теперь список содержит название миниатюры и индекс. Выполните переименование на основе этого:

while read -r thumbnail index; do
  newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
  mv -- "$thumbnail" "thumbnail-$newIndex.jpeg"  # rename file
done < combined.txt

Выше будет переименовать thumbnail-01.jpeg в thumbnail-0.jpeg . Обратите внимание, что в выходном индексе нет нуля. Если вы хотите добавить к нулю, скажем, 5 цифр, используйте printf:

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

В Windows вы делаете то же самое с ffprobe но анализируете вывод иначе. Не знаю, как выполнить переименование там, хотя.

0

Если вы хотите использовать FFMPEG, как указано ранее, вы можете перечислить весь или частичный список, а также создать JPG со следующими:

ffmpeg.exe \
  -i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
  -t 15 \
  -vf select="eq(pict_type\,PICT_TYPE_I)" \
  -vsync 2 \
  -s 160x90 \
  -f image2 thumbnails-%02d.jpeg \
  -loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"

Удалите -t 15 без ограничения по времени или измените в соответствии с требованиями. Удалите -s 160x90 -f image2 thumbnail-%02d.jpeg или измените в соответствии с удалением миниатюр.

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