Общее количество кадров 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)