Как я могу ускорить видео, удалив кадры? - PullRequest
6 голосов
/ 26 августа 2009

У меня есть видео, которое длится 30 минут. Я хочу сделать ускоренную версию, которая, скажем, 15 минут. Я мог бы сделать это, опуская каждый второй кадр. Как я могу сделать это на Linux?

Я играю с gstreamer, и это выглядит круто. Есть ли способ сделать это с помощью gstreamer? Какой будет командная строка gst-launch, чтобы сделать это?

Мое исходное видео в формате Motion JPEG, поэтому у меня есть кадры для удаления. Даже если бы он использовал ключевые кадры, все равно должен быть способ «удвоить скорость» фильма?

Мне нужен способ командной строки, так как я хочу автоматизировать его.

Ответы [ 5 ]

4 голосов
/ 10 декабря 2009

Вы можете просто установить частоту кадров в два раза выше. например если вход был действительно 30 / 1.001 FPS:

mencoder -fps 60/1.001 -oac copy -ovc copy -o output.avi input.avi

http://www.mplayerhq.hu/DOCS/HTML/en/index.html

Или пропустите кадры с помощью mencoder -sstep 0.1, чтобы пропустить вперед 0,1 секунды после каждого кадра.

mplayer -nosound -channels 2 -vf decimate=-2:16384:16384:1 mvi_3524.avi тоже работает, но, вероятно, медленно, и вы, вероятно, не сможете сделать это без распаковки / повторного сжатия каждого кадра.

mjpegtools имеет yuvfps для смешивания / удаления кадров в видео y4m. Смотри http://linux.die.net/man/1/mjpegtools.

Мне не очень повезло найти инструмент, который знает, как удалять кадры из видео mjpeg без распаковки / повторного сжатия. Поэтому вам, возможно, придется преобразовать mjpeg в каталог файлов .jpg, удалить нечетные и повторно собрать их в видео mjpeg с той же частотой кадров. Это не ухудшит качество изображения.

4 голосов
/ 14 октября 2011

Я недавно некоторое время оглядывался по поводу лучшего способа сделать это. Я экспериментировал с опцией mencoder -speed, а также с опцией libpts в libavfilter. Лучший способ, который я нашел, - вывод отдельных кадров, а затем перекодирование этих кадров в одно видео. В этом примере предполагается, что для получения наилучших результатов используется входное видео со скоростью 30 кадров в секунду и пропускается каждый второй кадр.

# Output the video at 15fps as jpegs
ffmpeg -i input.m4v -r 15 -f image2 /tmp/output-%06d.jpg
# Re-encode the frames at 30fps as h264
ffmpeg -r 30 -i "/tmp/output-%06d.jpg" -vcodec libx264 -threads 0 -an output.m4v
1 голос
/ 02 сентября 2013

У меня было видео длиной 16 м06 с частотой кадров 29,97, но я хотел ускорить его (сбросив кадры), чтобы оно воспроизводилось примерно в 16 раз быстрее нормальной. Это команда, которую я использовал:

ffmpeg -r:v "480/1" -i input.avi -an -r:v "12/1" output.avi
1 голос
/ 26 августа 2009

avidemux может изменять частоту кадров фильмов и предлагает управление командной строкой .

0 голосов
/ 03 июля 2014

Если у вас есть видео, закодированное с помощью mjpeg, вы можете избежать перекодирования вашего видео и иметь идентичные кадры - только меньше. Для этого я использую комбинацию ffmpeg и awk:

#!/bin/bash
INMOVIE=${1}
INRATE=${2}
OUTMOVIE="${INMOVIE%.avi}-25fps.avi"

ffmpeg -i ${INMOVIE} -c:v copy .frame_%08d.jpg
rm $(ls .frame_*.jpg |  awk " BEGIN { c=0.0; fd=1./${INRATE}; fr=25.; last=-1 } { current=int(NR * fr * fd); if (current > last) {last = current;} else { print \$0;} }" )
ffmpeg -pattern_type glob -i '.frame_*.jpg' -c:v copy ${OUTMOVIE}
rm -- .frame_*.jpg

Пояснение:

  • первая команда ffmpeg извлекает кадры из видео
  • следующая строка awk стирает те кадры, которые не нужны при кодировании видео с частотой кадров INRATE при 25fps
  • последняя строка ffmpeg объединяет оставшиеся кадры

Вы можете проверить, что кадры идентичны фильтру framemd5:

ffmpeg -i in.avi -f framemd5 in.md5
ffmpeg -i in-25fps.avi -f framemd5 in-25fps.md5

и найдите, что кадры действительно идентичны.

...