我有一个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代码,它可以正确地渲染场景渲染队列。但是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相信这个过程已经完成了,而实际上它还没有完成?
任何帮助都是非常感谢的!
发布于 2020-01-27 01:19:06
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兼容,向其.etc添加更多功能,但这是主要的想法。
下面是一个列表,其中包含了所有的生成器选项(如果您还不知道它们的话):https://helpx.adobe.com/after-effects/using/automated-rendering-network-rendering.html
顺便说一句,$._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()会给你"AfterFX.exe“文件路径,这样你就可以更容易地得到"aerender.exe”路径。
编辑: CC2019中删除了$._ADBE_LIBS_CORE,因此您可以在CC 2019及更高版本中直接使用BridgeTalk。
https://stackoverflow.com/questions/59919529
复制相似问题