如何在后台运行xcode中的系统命令

时间:2013-02-27 17:02:24

标签: xcode macos shell ffmpeg system

我需要使用此参数运行ffmpeg命令:-i'url_of_input_here'。所以使用带有参数数组的NSTask不起作用:

NSString * ffm_address = [NSString stringWithFormat:@"'udp://%d.%d.%d.%d:%d?fifo_size=1000000000&overrun_nonfatal=1'",addr_1,addr_2,addr_3,addr_4,portFFM];
[task setArguments:
[NSArray arrayWithObjects:@"-f", @"mpegts", @"-i", ffm_address, @"-re",@"-y",@"-strict",@"experimental",@"-vcodec", @"copy", @"-f", @"mp4", @"video.mp4", nil]];

因为引号的处理方式是ffmpeg认为udp:// ....地址是一个文件

XCode有system()函数可以让我执行系统命令,但是当我运行ffmpeg命令时它会停止进程(因为ffmpeg正在处理一个流):

char ffm_cmd[512];
sprintf(ffm_cmd,"ffmpeg -f mpegts -i 'udp://%d.%d.%d.%d:%d?fifo_size=1000000&overrun_nonfatal=1' -re -y -strict experimental -vcodec copy -f mp4 video.mp4",addr_1,addr_2,addr_3,addr_4,portFFM);
    system(ffm_cmd);

如何在后台运行system()命令,以便它不会停止应用程序的其余部分?我宁愿不使用单独的线程,但是启动ffmpeg并继续进行该过程。

1 个答案:

答案 0 :(得分:0)

找到了办法!只需添加&在命令的最后:

   char ffm_cmd[512];
    sprintf(ffm_cmd,"ffmpeg -f mpegts -i 'udp://%d.%d.%d.%d:%d?fifo_size=1000000&overrun_nonfatal=1' -re -y -strict experimental -vcodec copy -f mp4 video.mp4 &",addr_1,addr_2,addr_3,addr_4,portFFM);
    system(ffm_cmd);