Как правильно увеличить частоту кадров и скорость видео с помощью ffmpeg?

981
jstq

У меня есть видео со скоростью 5 кадров в секунду с keyint 120 и длиной 2,5 часа, которое я хочу ускорить в 6 раз, делая его fps = 30

Я сделал это с помощью этой команды, которую я нашел где-то на этом сайте

ffmpeg -i "...local_Record.mkv" -filter:v "fps=30, setpts=PTS/6" "...output1.mkv" 

Вывод получился запаздывающим, его воспроизведение в течение 3-5 секунд, а затем зависает. Если я прыгаю назад или вперед, он размораживается еще 3-5 секунд, а затем снова останавливается. После загрузки его на YouTube я обнаружил, что он не отстает, однако YouTube показывает его длину как оригинальные 2,5 часа. Это также показывает, что его процент обработки составляет 95% в течение 12+ часов (это означает, что это видео на 100% прослушивается и не будет обрабатываться, поскольку его продолжительность составляет 90 МБ и 20 минут, а YouTube может обрабатывать видео, которые 5 ГБ / час. долго через 10 минут)

Затем я попытался перекодировать видео, полученное с помощью этой команды.

ffmpeg -i "...mkv" -c:v libx264 -crf 18 -preset veryfast -max_muxing_queue_size 1024 output.mp4 

Это дало мне результат 133 МБ, который также отображается на YouTube как 2,5 часа и никогда не заканчивает обработку (может быть воспроизведен, но невидим, в диспетчере видео оба видео говорят, что он обработан на 95%)

Как сделать это правильно, чтобы видео не отставало, а YouTube мог правильно определить его длину?

отредактируйте - я нашел, в чем была проблема - в контейнере был какой-то звук, хотя вообще не должно было быть никакого звука (я записал его без звука). Поэтому после того, как я удалил этот звук с помощью mmg, mpc открыл его правильно, показав, что он длился 26 минут, а YouTube успешно обработал его за пару минут.

0

1 ответ на вопрос

1
Gyan

Порядок должен быть обратным,

ffmpeg -i in -filter:v "setpts=PTS/6,fps=30" out 

Сначала с помощью фильтра fps ffmpeg будет вставлять 25 повторяющихся кадров каждую секунду, чтобы преобразовать 5 кадров в секунду в 30, а затем ускорить его в 6 раз. При правильном порядке ffmpeg сжимает поток для получения 30 исходных кадров в секунду, а затем все фильтры fps заканчивают работу *, изменяя метаданные потока на 30 кадров в секунду.

* Предполагая источник с постоянной частотой кадров.

Также обратите внимание, что YT перекодирует все видео, поэтому ваш кодированный ключ не переносится YT.

Если у вас есть звук, вам нужно будет также ускорить это,

ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=6" out 

Обратите внимание, что до недавнего времени atempo имел ограничение 2, поэтому для более старых версий ffmpeg вы должны использовать

ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=2,atempo=2,atempo=1.5" out 
К сожалению, мне пришлось удалить 6 ГБ исходных видео, поэтому я не могу проверить вашу команду в данный момент, но сделаю это для будущих попыток. Я обновил свой вопрос с попытками исправить это уже ускорить видео. Я нашел какую-то команду для перекодирования видео в надежде исправить эту бесконечную ошибку обработки YouTube, которую я заметил, но она не сработала. Знаете ли вы способ «исправить» это видео, возможно, какой-то другой способ перекодировать его, чтобы youtube смог завершить обработку видео, и, возможно, даже понять, что это не 2,5 часа, а только 26 минут? jstq 5 лет назад 0
несмотря ни на что, я обнаружил, в чем была проблема - в контейнере был какой-то звук, хотя вообще не должно было быть никакого звука (я записал его без звука). Поэтому после того, как я удалил этот звук с помощью mmg, mpc понял, что его 26 минут, и YouTube успешно обработал его за пару минут. jstq 5 лет назад 0
doing this your way (setpts first) gives me this warning after encoding finished: 100000 buffers queued in out_0_0, something may be wrong. and its there for hours loading all my cpu cores for 100% doing nothing. If I cancel it, video is unplayable jstq 5 лет назад 0
Поделись полным логом. Gyan 5 лет назад 0

Похожие вопросы