1

У меня есть видео со скоростью 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 мог правильно определить его длину?

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

1 ответ1

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .