2013-05-17 70 views
0

我正在使用nodejs。这个想法是使用exec启动一个bash脚本。我能行。 在我的bash脚本中,我正在使用mencoder进行视频转换。对于为例:node.js exec和bash脚本

mencoder Videoinput.ogv -o videouput.avi -oac lavc -ovc lavc -lavcopts vbitrate=3000 vcodec=mpeg4 

我的问题:如果我尝试转换一个巨大的视频转换是确定,直到特定的时间。在我的情况下1分47秒.....所以看起来节点有时间最大限度地使用exec执行bash脚本,然后将其切断。 我对不对?有谁知道如何给exec命令添加更多时间?如果这是可能的,我将能够完成视频转换...感谢您的答案。

+2

根据[精说明书(http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback),'timeout'为0 ,这意味着Node会随时为其提供所需的过程。但是,例如,如果脚本没有读取mencoder生成的输出,它可能会填充输出缓冲区,并且一旦缓冲区已满,Node就会终止进程(请参阅'maxBuffer')。请发布您如何从Node调用脚本。 – robertklep

回答

1

它是有道理的,js不允许子进程运行超过特定时间。否则,浏览器可能很容易变得无法响应。

我建议运行一个快速终止的命令,但已经在拆分式并行进程中启动了mencoder。将&附加到mencode命令可能足以将其置于后台。也许你想发送所有的输出在一个特定的文件(或至少到/dev/null完全压制它)。为此,请使用> outputfilename。也许重定向错误消息也是有意义的,所以也可以在重定向标准输出后使用2> errormessagesfilename或仅使用2>&1将两个流发送到同一个文件中。

也许你必须创建一个子shell才能让js相信子进程已经完成。这可以通过将命令放在括号中来完成((mencoder …))。

所以,你可能最终得到这样的某物:

(mencoder Videoinput.ogv \ 
    -o videouput.avi \ 
    -oac lavc \ 
    -ovc lavc \ 
    -lavcopts vbitrate=3000 vcodec=mpeg4 \ 
    >/tmp/mencoder.output 2>&1 &) > /dev/null 
+0

节点将异步运行外部程序,所以如果程序需要一些时间,它不会变得没有反应。 – robertklep

+0

感谢您的回答...我已经能够运行我的bash脚本,将最大缓冲区更改为{maxBuffer:500 * 1024} ...现在可以工作。这是内存问题... – anraT

+1

@anraT我认为这只会暂时解决你的问题,一旦mencoder产生的输出达到500K一天,问题就会再次出现。我认为最好的解决方案是只读取mencoder生成的输出(并且不要对它做任何事情)。或者使用'-really-quiet'命令行选项限制生成的输出。 – robertklep