AviSynth ChangeFPS: объединение видео с различной частотой кадров

У меня есть две видеозаписи одной и той же сцены, но с разными частотами кадров, которые я хотел бы объединить, используя скрипт AviSynth. Одно видео записывается со скоростью 30 кадров в секунду, другое - со скоростью 120 кадров в секунду. То, что я хотел бы сделать, это сохранить их временную синхронизацию, что означает, что для каждого кадра видео 30 кадров в секунду на выходе должно отображаться 4 кадра из видео 120 кадров в секунду. Я бы хотел, чтобы окончательный вывод видео воспроизводился со скоростью 30 кадров в секунду, чтобы продолжительность в 4 раза превышала исходные записи.

Из документации AviSynth, кажется, ChangeFPS это функция, которая мне понадобится, поскольку она удаляет и дублирует кадры, в то время как "AssumeFPS" просто меняет скорость воспроизведения (и мой план в основном состоит в четырехкратном увеличении каждого кадра клипа 30 кадров в секунду). Однако фильтр, кажется, не делает то, что говорит.

Если я попробую:

clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")

это совсем не влияет на скорость воспроизведения или количество кадров клипа 30 кадров в секунду, но удаляет каждый четвертый кадр из клипа 120 кадров в секунду, что совсем не то, что я хочу. К сожалению, добавление.ChangeFPS(7.5) к clip120 вместо этого не имеет такого же обратного эффекта - в этом случае он делает именно то, что и следовало ожидать. В качестве альтернативы, если я попробую:

clip30 = AviSource("0326.avi").AssumeFPS(7.5)
clip120 = AviSource("0326-120fps.avi")

эффекта нет вообще, оба клипа воспроизводятся со скоростью 30 кадров в секунду, что означает, что к моменту окончания клипа 30 кадров в секунду показывается только четверть клипа со скоростью 120 кадров в секунду.

Итак, как я могу объединить эти два клипа так, как я хочу? Мне не удалось найти какие-либо другие внутренние или внешние фильтры, которые бы помогли мне сделать это. Мне кажется, что если ChangeFPS сделал то, что говорит руководство, это было бы правильным для работы.

1 ответ

Решение

Я решил свою проблему, используя первый фрагмент из моего вопроса (изменив частоту кадров клипа 30 к / с до 120 к / с), но затем также установив AssumeFPS(30) для финального комбинированного видео, добавив эту функцию в конец последнего фильтра, который я использовал. Так, например:

clip30 = AviSource("0326.avi").ChangeFPS(120)
clip120 = AviSource("0326-120fps.avi")
StackHorizontal(clip30, clip120).AssumeFPS(30)

работает отлично. Теперь у меня есть видео, которое имеет продолжительность клипа 120 кадров в секунду при 30 кадрах в секунду (в четыре раза больше первоначальной длительности записи), причем каждый кадр 30 кадров в секунду увеличивается в четыре раза, как я и хотел.

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

Другие вопросы по тегам