我正在使用以下系统命令在我的 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 秒后完成后才调用第二个系统。我能想到的唯一方法是使用 thread.sleep() 然后调用它。还有其他更优雅的方法可以实现相同的效果吗?
最佳答案
读一本好书,比如advanced linux programming或advanced unix programming .
您将了解到基本的流程创建和程序执行与 fork(2) 相关。 , execve(2) , waitpid(2)及相关syscalls .
实际上,system(3)
是通过/bin/sh
的fork
然后execve
和-c
然后是 waitpid
或 wait
。
您绝对可以自己执行fork
和execve
。您可能还想处理 SIGCHLD信号。您不需要任何与线程相关的调用。您可能对pipe(2)感兴趣, dup2(2) , poll(2) , sigaction(2) , pause(2) , nanosleep(2)系统调用等
我不明白如果第一个 ffmpeg
进程超过十秒,您想对它做什么。你想要kill(2)它 ? (然后首先使用 SIGTERM
终止,然后使用 SIGQUIT
,最后使用 SIGKILL
)。
如果您正在编写图形程序,大多数工具包都提供流程处理功能(因为它与事件循环混合)。对于 GTK,请考虑使用 g_child_watch_add和 g_spawn_async 。 Qt 有一个 QProcess
类。
关于c - 使用系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699042/