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 должен обработать все вызовы, чтобы выяснить результат (хотя только ~3 из этих 100 вызовов относятся к конкретному отдельному кадру). Если я, однако, удалить video =
в начале строки у меня могло быть 10000 из них, и нет ошибки "Недостаточно памяти", но, конечно, у меня нет видео.
Есть ли исправить это? Сотни / тысячи наложений изображений в разное время на видеоклипе?
2 ответа
Попробуйте преобразовать видео и все изображения в цветовое пространство YUY2 перед наложением с помощью "ConvertToYUY2()", это может уменьшить количество повторных преобразований при каждом вызове, как описано здесь - http://avisynth.nl/index.php/Overlay Это при условии, что ваше видео и изображения в RGB. Вероятно, вы можете попробовать использовать цветовое пространство YV12, возможно, это сэкономит еще больше памяти. Обратите внимание, что это приведет к незначительному снижению качества, поскольку цветовые каналы имеют более низкое разрешение в форматах, отличных от YV24, плюс также есть ошибки преобразования.
Попробуйте поиграть с функцией SetMemoryMax(). Но убедитесь, что у вас достаточно свободной памяти.
Также обратите внимание, что если вы работаете в 32-битной среде, максимальный объем памяти будет 2 ГБ.