Использование ffmpeg для изменения частоты кадров

Я пытаюсь преобразовать видеоклип (MP4, yuv420p) с 30 кадров в секунду до 24 кадров в секунду. Количество кадров правильное, поэтому мой выход должен измениться с 20 минут со скоростью 30 кадров в секунду до 25 минут со скоростью 24 кадра в секунду. Все остальное должно оставаться неизменным.

Попытайтесь, чтобы все, что я пытаюсь использовать с ffmpeg, преобразует частоту кадров, но меняет количество кадров, сохраняя одну и ту же продолжительность, или меняет продолжительность без изменения частоты кадров.

Итак, я обычно пробовал такие вещи:

ffmpeg -y -r 30 -i seeing_noaudio.mp4 -r 24 seeing.mp4

(Я делаю это на окнах, но обычно это будет на linux). Это преобразует частоту кадров, но уменьшает кадры, поэтому общая длительность не изменяется.

Или я пробовал

ffmpeg -y -i seeing_noaudio.mp4 -filter:v "setpts=1.25*PTS" seeing.mp4

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

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

Помогите пожалуйста

Ответ 1

С повторным кодированием:

ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4

Без повторного кодирования:

Первый шаг - извлечение видео в исходный бит-поток

ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264

Ремикс с новой частотой кадров

ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4

Ответ 2

Просто укажите желаемую частоту кадров в опции "-r" перед входным файлом:

ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4

Параметры влияют на следующий файл ПОСЛЕ их. "-r" перед тем, как входной файл заставляет переосмыслить свой заголовок, как если бы видео было закодировано с заданной частотой кадров. Рекомпрессия не требуется. Была небольшая утилита avifrate.exe для непосредственного исправления заголовков файлов avi для изменения частоты кадров. Вышеуказанная команда ffmpeg, по сути, делает то же самое, но должна копировать весь файл.

Ответ 3

Насколько я знаю, вы не можете сделать это с ffmpeg без перекодирования. У меня был файл с 24 кадрами в секунду, который я хотел на скорости 25 кадров в секунду, чтобы соответствовать другому материалу, с которым я работал. Я использовал команду ffmpeg -i inputfile -r 25 outputfile которая отлично работала с вводом webm, matroska и привела к выводу h264, matroska с использованием кодера: Lavc56.60.100

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

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

#!/bin/bash
#This script will decompress all files in the current directory, video to huffyuv and audio to PCM
#unsigned 8-bit and place the output #in an avi container to ease frame accurate editing.
for f in *
do
ffmpeg -i "$f" -c:v huffyuv -c:a pcm_u8 "$f".avi
done

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

Ответ 4

Вы можете использовать эту команду, и продолжительность видео остается неизменной.

ffmpeg -i input.mp4 -r 24 output.mp4

Ответ 5

Вы можете рассмотреть возможность использования фильтра fps. Это не изменит скорость воспроизведения видео:

ffmpeg -i <input> -filter:v fps=fps=30 <output>

Хорошо поработал для уменьшения fps с 59.6 до 30.