2013-05-17 103 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