Я хочу снять видео продолжительностью, скажем, 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
но какие бы параметры я ни передал, хотя кадры и пропадают, длина видео остается прежней.
Элемент videorate
не является способом сделать это — он предназначен специально для изменения частоты кадров, но сохранения продолжительности (путем копирования или дублирования кадров). Вам нужно отправить «запрос на поиск» со скоростью = 6. Я не уверен, что это возможно только с помощью командной строки, но это было бы очень просто с помощью сценария Python или чего-то еще.
@nathaniel-bubis, я (много раз, см. историю) редактировал ответ для простого решения из командной строки. Вы также можете получить лучшую поддержку на discourse.gstreamer.org.
Создайте 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 секунд.
Я вижу длительность 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
Я использовал 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
для создания входного видео.
Я точно выполнил ваши команды, но возникла та же проблема. Глядя на gst-discoverer-1.0 output.mp4
, видишь duration: 0:01:00.000000000
Очень неожиданно! Я только что перепроверил с помощью тех же команд и Duration: 0:00:10.833333333
запустил gstreamer v1.20.3.
P.S. Забыл сказать «спасибо» @SeB за быструю и легкую команду создания тестового видео!
поскольку вы спрашиваете о командной строке gstreamer, а не о программном использовании, возможно, вам следует отнести это на superuser.com - если бы это был ffmpeg, я бы предложил переназначить PTS в соответствии с вашей формулой. узнать о временных метках презентации (PTS)