Команда FFMPEG для автоматического разделения видео и создания миниатюр

Я пытаюсь написать команду FFMPEG, которая:

  • принимает как вход видео ввод.mp4 и изображение рис.jpg
  • Поскольку выход разбивает ввод.mp4 на 20-секундные видео, переименовывая их по порядку; для каждого разделенного видео он создает эскиз изображения, копируя рис.jpg, записывая на нем соответствующий номер заказа и сохраняя его с тем же номером заказа в качестве имени.

Для примера вот что должна содержать папка после запуска скрипта:

input.mp4 <-- video to be splitted
pic.jpg <-- Base for thumbnail

[0].mp4 <-- first 20 seconds of input.mp4
[0].jpg <-- thumbnail image with "0" printed on

[1].mp4 <-- second 20 seconds of input.mp4
[1].jpg <-- thumbnail image with "1" printed on

... and so on

Это моя команда на данный момент:

ffmpeg -i input.mp4 -i pic.jpg -f segment -segment_time 20 -map 0:a -map 0:v -vcodec copy -reset_timestamps 1 output[%d].mp4 -map 1:v -vf "drawtext=text=%d:fontcolor=white:fontsize=75:x=1002:y=100:" pic[%d].jpeg

но дает несколько проблем:

  • %d не распознается drawtext (пишет бродячий % до d)
  • Если я уберу %d из drawtext (заменив его на 'Exampletext'), скрипт правильно разделит видео, но создаст только рис[1].jpg, на котором ничего не написано. Других файлов .jpg не создается.

Уведомление Я не могу использовать скрипты bash или подобные

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

tl;dr - не могу. Это может быть возможно в 3 шага.

%d is not recognized by drawtext (it says stray % before d)

Как не должно быть. Нигде в его документации не говорится о поддержке строк формата c-printf.

If I remove %d from drawtext (substituting it with 'Exampletext'), the script splits correctly the video, but creates only pic[1].jpg, without anything written on it. No other .jpg files seem to be created.

Это ожидаемое поведение, так как входной поток pic.jpg умирает после 1 кадра (потому что это неподвижное изображение = всего 1 кадр). Вы можете зациклить входное изображение (посмотрите документацию image2 демультиплексора), но вы должны заранее знать количество сегментов, которые вы собираетесь создать (не говоря уже о том, что это спорный вопрос, потому что предполагаемая drawtext операция не работает).

Единственный обходной путь, который я могу придумать, - это сделать это в 3 этапа:

  1. позвоните FFmpeg, чтобы выполнить работу segment
  2. подсчитайте количество созданных сегментов и создайте файл субтитров (достаточно .srt). Каждый сегмент считается занимающим 1 секунду каждый.
  3. снова вызовите FFmpeg с вводом pic.jpg, зациклив его, чтобы получить количество кадров, соответствующее количеству сегментов при частоте кадров 1 кадр/с. Используйте фильтр subtitle, чтобы записать номера сегментов, указанные в подзаголовке.

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

Другие вопросы по теме