Как изменить частоту кадров видео без перекодирования

13

Я пытаюсь изменить частоту кадров видео MP4 (это видео GoPro с частотой 120 кадров в секунду, я хочу воспроизвести его со скоростью 30 кадров в секунду для эффекта медленного движения).

Я использую avconv для этого:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Это технически работает, но переигрывает фильм. В дополнение к медленному, это, безусловно, проблема качества. Технически должен быть способ просто установить fps в заголовке видео, как я могу это изменить? (Любой инструмент, отличный от avconv, тоже будет работать.)

    
задан EboMike 03.11.2013 в 23:42
источник

4 ответа

11

MP4Box может это сделать.

Команда

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

создает файлы test и test_track1.h264 . Теперь вы можете создать файл mp4 с любой поддерживаемой частотой кадров (30 в этом примере):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box является частью пакета gpac , поэтому убедитесь, что он установлен.

    
ответ дан Mitch 04.11.2013 в 07:30
источник
6

Изменение частоты кадров в заголовке видео (контейнера) не влияет на сам видеопоток (или аудиопоток). Reencoding - единственный вариант.

Видеопотоки имеют временные метки, а в большинстве видеофрагментов взаимозависимы друг от друга из-за межкадрового сжатия. Некоторые игроки могут ускорить и замедлить видео, но не встроенными командами или чем-то еще. Ни один игрок не может изменить частоту кадров на лету, когда контейнерная команда попросит об этом. Видеофайл окажется вне спецификации (т. Е. Не соответствует стандартам), и 99,9% игроков откажутся от этого. Совершенно невозможно сделать то, что вы хотите, без перекодировки. Конечно, вы можете подождать с перекодировкой до последнего шага редактирования.

    
ответ дан thom 04.11.2013 в 01:30
3

В случае, если ваше основное намерение состоит в том, чтобы воспроизвести его в замедленном режиме, а не для того, чтобы сохранить файл как MP4, вы можете использовать инструмент GUI MKVmerge, чтобы перевести его в контейнер Matroska, который может легко изменить частоту кадров. Ремуксинг намного лучше, чем перекодирование, поскольку он изменяет только метаданные, а не сам поток.

Сначала вы устанавливаете пакет

sudo apt-get install mkvtoolnix-gui

Затем вы запускаете графический интерфейс MKVmerge. Вы столкнулись с таким окном

Просто нажмите кнопку добавления и выберите файл или просто перетащите файл в папку «Входные файлы». На этом этапе вы сможете выбрать видеопоток в своем видео. Вы также можете удалить другие потоки, так как они будут как-то мешать.

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

Изменить на «Форматировать конкретные действия»

Вы можете увидеть, что есть поле «FPS», где вы можете ввести значение кадров в секунду. Похоже, вы планировали замедлить работу в четыре раза, поэтому ваша цель составит около 7 кадров в секунду. Вы также можете использовать опцию «Растянуть».

После этого вы можете просто изменить имя выходного файла (если хотите) и нажать «Начать мультиплексор».

Программа запустится, и у вас должен быть файл.

    
ответ дан v010dya 10.11.2014 в 18:52
1

Я также хотел без потерь замедлить мои 120 фильмов FPS до 30 FPS. Я сделал скрипт, который делает это, изменяя темп звука и изменяя FPS непосредственно в контейнере MP4. Требуются следующие инструменты:

  1. avconv для преобразования аудиопотоков
  2. sondstretch , чтобы замедлить темп звука
  3. gpac , чтобы получить MP4Box , чтобы изменить FPS

Сценарий, используемый для преобразования, находится здесь:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE=""
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Этот скрипт создает копию MP4 с постпостером _slow.

    
ответ дан OSi 28.02.2016 в 11:43