AviSynth Out of Memory Error (100 секунд наложения изображений)

Я хочу наложить несколько изображений на мое видео в разное время. У меня есть пользовательская функция, определенная как

function myFunction(clip c, int coordinateX, int from, int to) {
    c = c.trim(0, from-1) + c.trim(from, to).Overlay(myImage, x=coordinateX, y=667, mask=myImageMask, opacity=1) + c.trim(to+1, 0)
    return c
}

который по сути занимает myImage изображение и поместите его в определенную часть клипа.

Я называю свою функцию как

video = video.myFunction(320, 1, 187)

и у меня есть куча таких, как это (я пытаюсь сделать какую-то анимацию с несколькими изображениями)

video = video.myFunction(320, 1, 187)
video = video.myFunction(480, 1, 187)
video = video.myFunction(640, 1, 187)
video = video.myFunction(320, 187, 374)
video = video.myFunction(480, 187, 374)
video = video.myFunction(640, 187, 374)
video = video.myFunction(319, 374, 561)

и все работает нормально, если таких вызовов меньше ~400. Если я превышаю этот предел, происходит "Недостаточно памяти" (я использую VirtualDub).

AviSynth VirtualDub Ошибка нехватки памяти

Я полагаю, это потому, что AviSynth должен обработать все вызовы, чтобы выяснить результат (хотя только ~3 из этих 100 вызовов относятся к конкретному отдельному кадру). Если я, однако, удалить video = в начале строки у меня могло быть 10000 из них, и нет ошибки "Недостаточно памяти", но, конечно, у меня нет видео.

Есть ли исправить это? Сотни / тысячи наложений изображений в разное время на видеоклипе?

2 ответа

Попробуйте преобразовать видео и все изображения в цветовое пространство YUY2 перед наложением с помощью "ConvertToYUY2()", это может уменьшить количество повторных преобразований при каждом вызове, как описано здесь - http://avisynth.nl/index.php/Overlay Это при условии, что ваше видео и изображения в RGB. Вероятно, вы можете попробовать использовать цветовое пространство YV12, возможно, это сэкономит еще больше памяти. Обратите внимание, что это приведет к незначительному снижению качества, поскольку цветовые каналы имеют более низкое разрешение в форматах, отличных от YV24, плюс также есть ошибки преобразования.

Попробуйте поиграть с функцией SetMemoryMax(). Но убедитесь, что у вас достаточно свободной памяти.

Также обратите внимание, что если вы работаете в 32-битной среде, максимальный объем памяти будет 2 ГБ.

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