Программно добавить 100 наложений изображений на видеоклип

Я ищу программное решение для редактирования видео, которое могло бы предоставить API для добавления наложений изображений и текста в определенное время/кадры в определенных координатах видеоклипа (1080p), а также для изменения размера до 720p и т. д.

Я попробовал AviSynth, но был заблокирован после примерно 400 оверлеев из-за «ошибки нехватки памяти» - см. -of-image-overlays">Ошибка AviSynth нехватки памяти (100 сек. наложения изображений)

Есть ли что-нибудь еще, что я мог бы попробовать (пример кода был бы потрясающим)?


person svenkapudija    schedule 11.09.2013    source источник


Ответы (1)


Вы всегда можете использовать коммерческое решение, которое я рекомендую, например Adobe After Effects, в котором есть API, которым вы можете управлять с помощью JavaScript (jsx файлов).

Коммерческие решения для видео и композитинга, как правило, более надежны и имеют лучшие возможности кэширования и буферизации, чем альтернативы с бесплатными/открытыми исходными кодами, что означает, что они потенциально могут добавлять больше слоев в композицию без нехватки памяти.

(Просто в качестве примечания: я указываю вам на событие After Effects здесь, хотя оно ориентировано на композицию. Adobe Premier (или другой нелинейный редактор) был бы более естественным выбором для простых наложений изображений и текста, но он не имеет интерфейс сценариев (насколько мне известно, на сайте Adobe для этого нет ресурсов). Тем не менее, с помощью AE также можно создавать длинные последовательности, и вы можете делать больше с элементами, которые вы добавляете в сцену.)

Если вы уже знакомы с JavaScript, то это (очевидно) просто вопрос чтения документации API для его объектов, методов и свойств и т. д. (я добавил ссылку на документацию ниже).

У Adobe также есть собственный редактор JavaScript (но он не обязателен), который можно найти по следующим адресам:

Mac OS X:

/Applications/Utilities/Adobe Utilities CS6/ExtendScript Toolkit CS6/

Окна:

C:\Program Files\Adobe\Adobe Utilities - CS6\ExtendScript Toolkit CS6

В следующем примере, взятом с этого сайта, создается comp, а затем добавляет к нему текстовый слой (перейдите на сайт для полного скрипта):

// create project if necessary

var proj = app.project;
if(!proj) proj = app.newProject();

// create new comp named 'my text comp'

var compW = 160; // comp width
var compH = 120; // comp height
var compL = 15;  // comp length (seconds)
var compRate = 24; // comp frame rate
var compBG = [48/255,63/255,84/255] // comp background color

var myItemCollection = app.project.items;
var myComp = myItemCollection.addComp('my text',compW,compH,1,compL,compRate);

myComp.bgColor = compBG;

а затем добавьте текстовый слой:

var text;
while (!myFile.eof){
    text = myFile.readln();
    if (text == "") text = "\r" ;
    myComp.layers.addText(text);
}

Вы также можете управлять Photoshop/Illustrator с помощью файлов JavaScript/jsx, поэтому здесь вы можете создавать мощные комбинации/эффекты и т. д. (что напоминает мне старый добрый AREXX :-)).

Существуют аналогичные API для таких решений, как Flame (и Combustion, который больше не доступен после того, как Auto-desk приобрел его), которые используют Python, но диапазон цен здесь относительно высок.

Если коммерческие варианты не подходят, вы можете изучить Blender, который также предоставляет API для Python.

Но обратите внимание, что Blender в первую очередь ориентирован на 3D, но также может использоваться для композитинга видео.

Пример, взятый с этой страницы, выведет текст на экран:

def write():
    """write on screen"""
    width = render.getWindowWidth()
    height = render.getWindowHeight()

    # OpenGL setup
    bgl.glMatrixMode(bgl.GL_PROJECTION)
    bgl.glLoadIdentity()
    bgl.gluOrtho2D(0, width, 0, height)
    bgl.glMatrixMode(bgl.GL_MODELVIEW)
    bgl.glLoadIdentity()

    # BLF drawing routine
    font_id = logic.font_id
    blf.position(font_id, (width * 0.2), (height * 0.3), 0)
    blf.size(font_id, 50, 72)
    blf.draw(font_id, "Hello World")

И, конечно же, вы всегда можете создавать сценарии для таких программ, как FFmpeg, который сам по себе достаточно мощный и гибкий.

Вы можете создать сценарий, добавив к нему аргументы в командной строке, например (взято отсюда):

Покажите текстовую строку, скользящую справа налево в последней строке видеокадра. Предполагается, что файл «LONG_LINE» содержит одну строку без символов новой строки.

drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"

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

Я никогда не пробовал сотни слоев и сомневаюсь, что у него есть встроенный буфер/кеширование для обработки большого количества слоев, но попробовать стоит, так как в остальном он бесплатный и мощный.

Ресурсы:

person Community    schedule 19.09.2013
comment
Я искал API для Adobe Premier и не подумал об Adobe After Effects :) Я знаком с JavaScript, поэтому считаю, что After Effects идеально подойдет. Спасибо. - person svenkapudija; 19.09.2013