Общее количество кадров Avisynth не равно общему количеству кадров VirtualDub.

Похоже, что Dissolve и / или Fade изменяют общее количество кадров в скриптах.avs. Когда я добавляю общее количество кадров в скрипт avs, а затем загружаю скрипт avs в Vdub, общее количество кадров отличается. Мой пример из реальной жизни ниже показывает разницу в 822 кадра против 1368 кадров для того же сценария. Я провел несколько базовых тестов, которые подтверждают эту гипотезу. Конечно, я могу делать что-то глупое. Любое руководство будет с благодарностью. Пожалуйста, дайте мне знать, если я могу уточнить что-нибудь. Ffmpeg также использует тот же скрипт, что заставляет меня думать, что это проблема Avisynth. Или мое отсутствие навыков кодирования AVS.

Системные спецификации: Win7, версия FFmpeg: 20170223-dcd3418, общий доступ к win32, версия AVISynth: 2.6

Test1.avs = 200 кадров в длину = ожидаемое поведение

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
video = v1 + v2
return video

Test2.avs с возвратом Dissolve = 195 кадров в длину = неожиданное поведение

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
return Dissolve(v1, v2, 5)

Test3.avs с fadeOut(fadeIn = длина 202 кадра = непредвиденное поведение

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
fadeOut(fadeIn(v1 + v2, 60), 60)

Test4.avs с распадом и исчезновением = длина 197 кадров = неожиданное поведение

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
v3 = Dissolve(v1, v2, 5)
fadeOut(fadeIn(v3, 60), 60)

Test5.avs - простота, определяющая частоту кадров при растворении и исчезновении = 197 кадров = неожиданное поведение

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24, start=1, end=100)
v2=ImageReader("2.png", fps=24, start=1, end=100)
v3 = Dissolve(v1, v2, 5, 24)
fadeOut(fadeIn(v3, 60, $000000, 24), 60, $000000, 24)

realExample = 822 кадра в длину = ожидаемое поведение (это то, что я хочу)

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24).trim(1,106)
v3=ImageReader("3.png", fps=24).trim(1,471)
v9=ImageReader("9.png", fps=24).trim(1,58)
v10=ImageReader("10.png", fps=24).trim(1,35)
v11=ImageReader("11.png", fps=24).trim(1,152)
video = v1 + v3 + v9 + v10 + v11
return video

realExample = 1368 кадров в длину

LoadPlugin("C:\Program Files (x86)\AviSynth 2.5\plugins\VSFilter.dll")
v1=ImageReader("1.png", fps=24).trim(1,106)
v3=ImageReader("3.png", fps=24).trim(1,471)
v9=ImageReader("9.png", fps=24).trim(1,58)
v10=ImageReader("10.png", fps=24).trim(1,35)
v11=ImageReader("11.png", fps=24).trim(1,152)
d1 = Dissolve(v1, v3, 5)
d3 = Dissolve(v3, v9, 5)
d9 = Dissolve(v9, v10, 5)
d10 = Dissolve(v10, v11, 5)
fadeOut(fadeIn(d1 + d3 + d9 + d10,60),60)

1 ответ

Решение

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

В вашем Dissolve пример (Test2.avs), вы говорите, что 195 кадров неожиданно, но для меня это звучит правильно. "Растворение" двух клипов вместе означает, что конец одного клипа перекрывается с началом второго клипа, когда один постепенно исчезает в другом; это не то же самое, что затухание первого клипа и затем затухание во втором клипе. Перекрытие означает, что результат должен быть короче, чем сумма отдельных длин клипов. Вы объединили два клипа по 100 кадров и указали 5-кадровое перекрытие, поэтому 100 + 100 - 5 = 195.

В вашем FadeOut пример (Test3.avs), вы говорите, что 202 кадра неожиданно, но для меня это тоже звучит правильно. Документация для FadeIn /FadeOut государство:

В начале / конце добавляется дополнительная цветная рамка, что увеличивает общее количество кадров на один (или для FadeIO - на два).

Так как вы сделали один звонок FadeIn и один звонок FadeOut в test3.avsбыли добавлены два дополнительных кадра. Если вы не хотите этого, то вы можете использовать FadeIn0/FadeOut0 (или же FadeIO0 поскольку вы используете оба), хотя обратите внимание, что с этими функциями первый / последний кадр не будет точно черным. Если вы хотите точности, просто обрежьте первый и / или последний кадры перед использованием нормального FadeIn/FadeOut/FadeIO функции.

Ваши "реальные примеры" сравнивают яблоки с апельсинами. Версия с Dissolve значительно увеличивает количество кадров, потому что он объединяет одни и те же клипы несколько раз:

d1 = Dissolve(v1, v3, 5)
d3 = Dissolve(v3, v9, 5)
...
fadeOut(fadeIn(d1 + d3 + d9 + d10,60),60)

d1 а также d3 каждый включает в себя копию v3 клип, а потом ты склеил d1 а также d3 вместе в конце, означая, что v3 включен дважды. (Это также верно для v9 а также v10.)

Вы, вероятно, намеревались сделать что-то вроде:

video = Dissolve(v1, v3, 5)
video = Dissolve(video, v9, 5)
video = Dissolve(video, v10, 5)
video = Dissolve(video, v11, 5)
video = FadeOut(FadeIn(video, 60), 60)

или более кратко:

video = FadeIO(Dissolve(v1, v3, v9, v10, v11, 5), 60)

Результат должен быть длиной 804 кадра: (822 кадра из исходных клипов) - (4 точки растворения) * (5 кадров перекрытия за растворение) + (2 кадра из FadeIO).

Если вы на самом деле хотели объединить клипы с постепенным исчезновением и затем постепенным увеличением, то вы можете сохранить исходное количество кадров, выполнив:

video =   FadeIO0(v1, 60) \
        + FadeIO0(v3, 60) \
        + FadeIO0(v9, 60) \
        + FadeIO0(v10, 60) \
        + FadeIO0(v11, 60)
Другие вопросы по тегам