After Effects:如何启动外部进程并将其分离

After Effects: How to launch an external process and detach it

我有一个 After Effects Scripting 问题,但我不确定它是否会通过 AE 知识得到解决,也许更多的是通过独立开发。

我想从 After Effects 启动一个外部进程,实际上我想使用 After Effects 提供的 aerender.exe 启动打开的 AEP 文件的渲染,同时保持它可用。

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 启动它,但我遇到了同样的问题, 我试图通过一个 .exe 文件(使用 pyInstaller 从一个简单的 python 编译而来),同样的问题:

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 在该过程完成后继续冻结。

有没有办法让 AE 相信该过程已完成,而实际上并未完成?

非常感谢任何帮助!

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 兼容,为其添加更多功能等,但这是主要思想。

这是一个包含所有 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 及更高版本。