2012-07-28 144 views
-1

我使用以下系統命令調用ffmpeg的即時通訊我的C程序:使用系統命令

system("ffmpeg -t 10 -f video4linux2 -s 640x480 -r 30 -i /dev/video0 -f mp4 /home/somepath/webcam.mp4"); 
system("ffmpeg -i /home/somepath/webcam.mp4 -r 1 -s 640x480 -f image2 foo-%03d.jpeg"); 

的問題是我需要調用的第一個10秒後只完成後的第二個系統。我能想到的唯一方法是使用thread.sleep()然後調用它。有沒有其他更優雅的方法來實現這一點?

+1

不是系統()阻塞函數調用嗎?在我看來,你有一個非常好的解決方案。到目前爲止的另一個想法 - 使用bat文件意味着另一種可能需要調試的代碼。 – chronodekar 2012-07-28 07:10:44

+1

系統是一個阻塞呼叫,因此您所做的這兩個呼叫都很好。但是如果你實際上需要兩次調用之間的間隔爲'10'秒,那麼'睡眠'將是最簡單的。 – 2012-07-28 07:13:27

+0

'系統'不是一個命令(像'ls'或'sh'),而是一個建立在系統調用之上的函數,請參閱我的答案。像你一樣在'system'中使用'%d'是錯誤的。 – 2012-07-28 07:28:56

回答

0

http://www.cplusplus.com/reference/clibrary/cstdlib/system/

INT系統(常量字符*命令)引用;

執行系統命令

調用命令處理器執行命令。一旦命令執行終止,處理器將控制權返回給程序,返回一個int值,其解釋是依賴於系統的。

我認爲system被封鎖。所以你不需要sleep

0

您可以將所有命令寫入bat文件或shell腳本中,然後調用bat文件或shell腳本。

4

閱讀一本好書,如advanced linux programmingadvanced unix programming

您將瞭解到基本過程創建和程序執行與fork(2),execve(2),waitpid(2)和相關syscalls有關。

實際上,system(3)fork然後/bin/shexecve-c實現,那麼一個或waitpidwait

你一定可以自己做forkexecve。您可能還想要處理SIGCHLD信號。你不需要任何線程相關的調用。您可以通過pipe(2)dup2(2)poll(2)sigaction(2)pause(2)nanosleep(2)系統調用等

我不明白你想要什麼你的第一個ffmpeg過程中做,如果它超過十隻秒感興趣。你想kill(2)嗎? (然後先用SIGTERM,然後用SIGQUIT,最後用SIGKILL殺死)。

如果您正在編寫圖形程序,大多數工具包都提供了進程處理函數(因爲它與事件循環混合在一起)。使用GTK考慮使用g_child_watch_addg_spawn_async。 Qt有一個QProcess類。

+0

好書。將下載並閱讀! – user1179510 2012-07-28 09:51:09

0

我認爲睡眠是一個很好的方法,不需要其他解決方案。