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

我有一个After Effects脚本问题,但我不确定是否可以通过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代码,它可以正常工作,可以正确地渲染场景渲染队列。 但是,在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相信该过程已经完成,而实际上却没有呢?

任何帮助都将非常宝贵!

zhengxyx 回答:After Effects:如何启动外部流程并将其分离

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,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及更高版本。

本文链接:https://www.f2er.com/2709936.html

大家都在问