-1

次のシステム コマンドを使用して、自分の C プログラムで ffmpeg を呼び出しています。

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 秒後に完了した後にのみ、2 番目のシステムを呼び出す必要があることです。これを行う唯一の方法は、thread.sleep() を使用してから呼び出すことです。同じことを達成するための他のよりエレガントな方法はありますか?

4

4 に答える 4

4

高度な Linux プログラミング高度な UNIX プログラミングなどの優れた本を読んでください。

基本的なプロセスの作成とプログラムの実行がfork(2)execve(2)waitpid(2)および関連するsyscallに関連していることを学習します。

実際には、またはを使用してのまでにsystem(3)実装されます。forkexecve/bin/sh-cwaitpidwait

あなたは間違いなく自分forkで行うことができexecveます。SIGCHLDシグナルを処理することもできます。スレッド関連の呼び出しは必要ありません。pipe(2)dup2(2)poll(2)sigaction(2)pause(2)nanosleep(2) syscalls などに興味があるかもしれません。

ffmpeg最初のプロセスが 10 秒を超える場合、何をしたいのかわかりません。kill(2)しますか? SIGTERM(次に、最初に で、次に で、SIGQUIT最後に でkillしますSIGKILL)。

グラフィカル プログラムをコーディングしている場合、ほとんどのツールキットはプロセス処理関数を提供します (イベント ループと混合されるため)。GTK ではg_child_watch_addg_spawn_asyncの使用を検討してください。QtにはQProcessクラスがあります。

于 2012-07-28T07:11:12.733 に答える
0

http://www.cplusplus.com/reference/clibrary/cstdlib/system/から引用

intシステム(const char *コマンド);

システムコマンドを実行する

コマンドプロセッサを呼び出してコマンドを実行します。コマンドの実行が終了すると、プロセッサは制御をプログラムに戻し、解釈がシステムに依存するint値を返します。

systemブロックされていると思います。したがって、は必要ありませんsleep

于 2012-07-28T07:11:45.127 に答える
0

私は睡眠がこれのための良い方法だと思います、他の解決策は必要ありません。

于 2012-07-28T07:14:54.697 に答える
0

おそらく、すべてのコマンドをバット ファイルまたはシェル スクリプトに記述し、そのバット ファイルまたはシェル スクリプトを呼び出すことができます。

于 2012-07-28T07:07:09.097 に答える