Ffmpeg: выбор кадров в% позиции видео

Я пытаюсь создать миниатюру видеоизображения 2x2, содержащую кадры с 20%, 40%, 60% и 80% видео. Я вижу, что мне нужно использовать видеофильтр с выбором, но не могу решить, какие варианты это сделают. Я хочу сделать что-то вроде этого:

ffmpeg -i video.avi -frames 1 -vf "select=not(mod(pos\,0.2)),tile=2x2" tile.png

Где позиция будет позицией в видео от 0.0 до 1.0. Как это сделать или какие у меня варианты?

Ответ 1

  • Метод 1: интервалы кадров

    Это может занять некоторое время в зависимости от ввода или возврата N/A для определенных типов входов (см. в этом случае метод, основанный на длительности).

    Получить общее количество кадров video:

    ffprobe <input> -select_streams v -show_entries stream=nb_frames -of default=nk=1:nw=1 -v quiet
    

    Команда выведет целочисленное значение, например:

    18034
    

    В приведенном выше примере интервал кадра nb_frames / 5 = 18034 / 5 = 3607

    Наконец, команда ffmpeg:

    ffmpeg -i <input> -filter:v "select=(gte(n\,3607))*not(mod(n\,3607)),tile=2x2" -frames:v 1 -vsync vfr -y tile.png
    
  • Метод 2: интервалы продолжительности

    Те же идеи, что и выше, но используйте продолжительность в секундах. Это может занять некоторое время, и сообщенная продолжительность может быть недействительной (например: если файл усечен).

    ffprobe <input> -select_streams v -show_entries stream=duration -of default=nk=1:nw=1 -v quiet
    

    Он возвращает реальное значение, например:

    601.133333
    

    Ваш интервал 601 / 5 ~= 120 секунд:

    ffmpeg -i <input> -filter:v "select=(gte(t\,120))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,120)),tile=2x2" -frames:v 1 -y tile.png
    
  • Метод 3: поиск и извлечение

    Найдите определенное время с помощью -ss -i, извлеките один кадр и используйте imagemagick montage для создания плитки.

    Пример вывода для таймера обратного отсчета 10 минут:

    введите описание изображения здесь