Витяг індексу ключових кадрів з відео за допомогою ffmpeg


17

Я використовую ffmpeg для отримання ключових кадрів з відео. Це команда:

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

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



Подивіться на використання ffprobe, а потім опублікуйте процес виведення, щоб отримати індекс?
dstob

@dstob ви могли б пояснити більше про те, що ви маєте на увазі? як я новачок у ffmpeg.
Фатен Халіфа

@LordNeckbeard Номер кадру у відеокадрах, напр. перший кадр відео був би в індексі 0 Я хочу знати індекс кожного ключового кадру у відеокадрах.
Фатен Халіфа

Ви хочете, щоб номер кадру був надрукований на ескізі (на самому зображенні)?
логіан

Відповіді:


21

Як і згадується @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але розібрали вихід по-різному. Не маю ідеї, як виконати перейменування там.


Ця помилка відображається: 'grep' не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл.
Фатен Халіфа

2
Це тому, що ви в Windows. Як я вже говорив, ця відповідь передбачає Linux або Unix. Ви не були більш конкретними у своєму питанні. Це можна досягти в Windows, використовуючи Cygwin або подібні шари GNU / Linux для Windows.
slhck

Це величезна допомога, дякую. Одне виправлення: я думаю, що показники у вашій першій команді відключені в три рази, тому що для кожного рядка є [FRAME]рядок і рядок. [/FRAME]pict_type
Джек О'Коннор

2
@ JackO'Connor Якщо використовується -of csvпараметр для, існує лише один рядок на кадр ffprobe. Однак ви описуєте формат виводу за замовчуванням.
slhck

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або змініть відповідно до знімка ескізів.


У Windows 7 CMD це не вдається в \. Зміна \ на ^ викликає збій у програмі: I ". Чи є у вас версія, яка працює в Windows?
ChrisJJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.