After Effects: как запустить внешний процесс и отсоединить его - PullRequest
0 голосов
/ 26 января 2020

У меня есть вопрос о сценариях After Effects, но я не уверен, что он будет решен с помощью знаний AE, возможно, больше с помощью автономной разработки.

Я хочу запустить внешний процесс из After Effects, на самом деле я хочу запустить рендер открытого AEP-файла с помощью aerender.exe, поставляемого с After Effects, и сохранить его в рабочем состоянии.

var projectFile = app.project.file;
var aeRender = "C:\\Program Files\\Adobe\\Adobe After Effects CC 2018\\Support Files\\aerender.exe";
var myCommand = "-project" + " " + projectFile.fsName;
system.callSystem("cmd /c \""+aeRender+"\"" + " " + myCommand);

Итак, я написал этот простой код JSX, и он работает, он отображает сцену правильно вынести очередь Но After Effects зависает, он ждет окончания процесса. Я хочу, чтобы он оставался пригодным для использования.

Поэтому я попытался написать файл .cmd и запустить его с помощью AE system.callSystem, и у меня возникла та же проблема, я попытался go через файл .exe (скомпилированный из простого python с pyInstaller), та же проблема:

import sys
import subprocess

arg = sys.argv
pythonadress = arg[0]
aeRender = arg[1]
projectFileFSname = arg[2]

myCommand = "-project" + " " +projectFileFSname
callSystem = "cmd /c \""+aeRender +"\"" + " " + myCommand
subprocess.run(callSystem)

Я даже пытался с "cmd / c start", и это кажется хуже, поскольку After Effects продолжают зависать после завершения процесса завершено.

Есть ли способ заставить АЕ поверить, что процесс завершен, хотя на самом деле это не так?

Любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 26 января 2020

system.callSystem() остановит выполнение скрипта, поэтому вместо этого вы можете динамически создать файл .bat и запустить его с .execute().

Вот пример. js:

var path = {
  "join": function ()
  {
    if (arguments.length === 0) return null;

    var args = [];

    for (var i = 0, iLen = arguments.length; i < iLen; i++)
    {
      args.push(arguments[i]);
    }

    return args.join(String($.os.toLowerCase().indexOf('win') > -1 ? '\\' : '/'));
  }
};

if (app.project.file !== null && app.project.renderQueue.numItems > 0)
{
  var
  // aeRenderPath = path.join(new File($._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()).parent.fsName, 'aerender.exe'), // works only in CC 2018 and earlier
  aeRenderPath = path.join(new File(BridgeTalk.getAppPath(BridgeTalk.appName)).parent.fsName, 'aerender.exe'),
  batFile = new File(path.join(new File($.fileName).parent.fsName, 'render.bat')),
  batFileContent = [
    '"' + aeRenderPath + '"',
    "-project",
    '"' + app.project.file.fsName + '"'
  ];

  batFile.open('w', undefined, undefined);
  batFile.encoding = 'UTF-8';
  batFile.lineFeed = 'Unix';
  batFile.write(batFileContent.join(' '));
  batFile.close();

  // system.callSystem('explorer ' + batFile.fsName);
  batFile.execute();

  $.sleep(1000); // Delay the script so that the .bat file can be executed before it's being deleted
  batFile.remove();
}

Вы можете, конечно, развивать его дальше и делать его совместимым с OSX, добавлять к нему больше возможностей .et c, но это основная идея.

Вот список со всеми параметрами aerender (если вы их еще не знаете): https://helpx.adobe.com/after-effects/using/automated-rendering-network-rendering.html

Кстати, $._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk() даст вам путь к файлу "AfterFX.exe", чтобы вы могли получить "aerender. exe "путь проще таким образом.

РЕДАКТИРОВАТЬ: $._ADBE_LIBS_CORE был удален в CC2019, так что вы можете использовать BridgeTalk напрямую вместо CC 2019 и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...