Как ускорить видео (сделать таймлапс) с помощью gstreamer?

Я хочу снять видео продолжительностью, скажем, 1 минуту и ​​ускорить его, чтобы оно длилось всего 10 секунд (x6). Я не хочу просто менять скорость отображения, мне бы хотелось в этом примере удалить 5 из 6 кадров, чтобы уменьшить размер и продолжительность видео.

Как я могу добиться этого с помощью командной строки gstreamer?

Я попробовал использовать фильтр videorate:

gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \
! queue ! h264parse ! avdec_h264 ! videoconvert ! videorate 
! video/x-raw,framerate=180/1 ! x264enc ! mp4mux ! filesink location=output.mp4

но какие бы параметры я ни передал, хотя кадры и пропадают, длина видео остается прежней.

поскольку вы спрашиваете о командной строке gstreamer, а не о программном использовании, возможно, вам следует отнести это на superuser.com - если бы это был ffmpeg, я бы предложил переназначить PTS в соответствии с вашей формулой. узнать о временных метках презентации (PTS)

Christoph Rackwitz 21.02.2024 11:38

Элемент videorate не является способом сделать это — он предназначен специально для изменения частоты кадров, но сохранения продолжительности (путем копирования или дублирования кадров). Вам нужно отправить «запрос на поиск» со скоростью = 6. Я не уверен, что это возможно только с помощью командной строки, но это было бы очень просто с помощью сценария Python или чего-то еще.

AHM 22.02.2024 11:14

@nathaniel-bubis, я (много раз, см. историю) редактировал ответ для простого решения из командной строки. Вы также можете получить лучшую поддержку на discourse.gstreamer.org.

SeB 26.02.2024 22:24
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте 1-минутный образец видео 320x240@30 для тестирования с помощью:

gst-launch-1.0 videotestsrc pattern=ball num-buffers=1800 ! video/x-raw,format=NV12,width=320,height=240,framerate=30/1 ! x264enc ! h264parse ! qtmux ! filesink location=test_h264.mp4

Этот обходной путь включает в себя первую команду, запускающую конвейерное декодирование в необработанное видео I420 и отправку на стандартный вывод, а также другую команду gstreamer, запускающую конвейер, считывающий необработанное видео со стандартного ввода со скоростью 180 кадров в секунду, а затем использование видеоскорости для понижения 5 кадров из 6 обратно до 30 кадров в секунду. затем кодируем в H264 и помещаем в контейнер mp4:

gst-launch-1.0 -q filesrc location=test_h264.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=I420,width=320,height=240,framerate=30/1 ! fdsink \
| gst-launch-1.0 fdsrc ! videoparse format=i420 width=320 height=240 framerate=180 ! video/x-raw,format=I420,width=320,height=240,framerate=180/1 ! videorate ! video/x-raw,format=I420,framerate=30/1 ! x264enc ! h264parse ! 'video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)2, profile=(string)high, width=(int)320, height=(int)240, framerate=(fraction)30/1' ! qtmux ! filesink location=testOut.mp4

# Check video details
gst-discoverer-1.0 -v testOut.mp4

# Check sizes:
ls -l test*.mp4

# Play it
gst-play-1.0 testOut.mp4
Ответ принят как подходящий

Используйте параметр rate для оценки видео.

Вот ваш обновленный конвейер:

gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \
! queue ! h264parse ! avdec_h264 ! videoconvert ! \
\
videorate rate=6 \
\
! video/x-raw,framerate=180/1 ! x264enc ! mp4mux ! filesink location=output.mp4

Я думаю, вы хотите одновременно уменьшить частоту кадров:

gst-launch-1.0 filesrc location=in.mp4 ! qtdemux name=demux demux.video_0 \
! queue ! h264parse ! avdec_h264 ! videoconvert ! \
\
videorate rate=6 \
! video/x-raw,framerate=30/1 ! \
\
x264enc ! mp4mux ! filesink location=output.mp4

(Несколько месяцев назад я задал кому-то этот вопрос в списке рассылки. Большое им спасибо!)

Спасибо! это почти работает — видео ускоряется, но видео сохраняет ту же продолжительность в 1 минуту, за исключением того, что все движение упаковано в первые 10 секунд.

Nathaniel Bubis 28.02.2024 19:31

Я вижу длительность 10,83, используя: ffprobe или vlc (хотя в моей версии gstreamer gst-discoverer-1.0 по какой-то причине возникают ошибки сегмента), использование этого конвейера также дает 10,83 секунды: gst-launch-1.0 filesrc location = "output.mp4" ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

wmcelderry 28.02.2024 22:54

Я использовал gst-launch-1.0 videotestsrc pattern=ball num-buffers=1800 ! video/x-raw,format=NV12,width=320,height=240,framerate=30/1 ! x264enc ! h264parse ! qtmux ! filesink location=in.mp4 для создания входного видео.

wmcelderry 28.02.2024 22:57

Я точно выполнил ваши команды, но возникла та же проблема. Глядя на gst-discoverer-1.0 output.mp4, видишь duration: 0:01:00.000000000

Nathaniel Bubis 29.02.2024 13:37

Очень неожиданно! Я только что перепроверил с помощью тех же команд и Duration: 0:00:10.833333333 запустил gstreamer v1.20.3.

wmcelderry 05.03.2024 21:47

P.S. Забыл сказать «спасибо» @SeB за быструю и легкую команду создания тестового видео!

wmcelderry 05.03.2024 21:49

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