系统()调用使用不当?

时间:2013-05-27 21:33:01

标签: c++ visual-studio qt ffmpeg

我有一个粒子系统程序,可以在每次迭代中生成一个带有粒子坐标的.dat文件。最终目标是通过具有不同参数的脚本多次运行程序。因此,我试图以一种方式设置我的程序,对于每次运行,所有相关数据都将存储在一个文件夹中。

我所做的是使用PNGs.dat文件中生成Gnuplot,致电ffmpeg以从PNGs创建视频,使用{ {1}}压缩WinRAR文件,最后通过删除所有中间文件进行清理。当我在工作目录中这样做时,这是有效的。

现在我尝试创建一个新目录并在那里做同样的事情。我的代码:

.dat

对于这一部分,我知道会有反对意见。我已经广泛了解了SO,许多人赞成// Load the proper library to use chdir() function #ifdef _WIN32 #include <direct.h> #elif defined __linux__ || defined __APPLE__&&__MACH__ #include <unistd.h> #endif // Make output directory and change working directory to new directory ostringstream dirCommand; dirCommand << "mkdir " << folderName_str; system(dirCommand.str().c_str()); const char* test = folderName_str.c_str(); #ifdef _WIN32 if(_chdir(test)) { printf( "Unable to locate the directory: %s\n",test); return; } #elif defined __linux__ || defined __APPLE__&&__MACH__ if(chdir(test)) { printf( "Unable to locate the directory: %s\n",test); return; } #endif else printf("Created output directory...\n"); 用于Windows,或者他们对使用SetCurrentDirectory()持怀疑态度。在我的辩护中,我是一名新手程序员,而且我的知识非常有限......

现在,当我尝试使用system()创建视频,然后rar / tar我的文件时:

FFMpeg

我在Win / Linux中的行为非常不同。

Win 7 x64,Visual Studio 2010/12

在Windows中,创建文件夹。 // Make video std::cout << "Generating Video..." << endl; ostringstream command; command << "ffmpeg -f image2 -r 1/0.1 -i output_%01d.png -vcodec mpeg4 " << videoName_str << ".avi -loglevel quiet"; std::system(command.str().c_str()); // Clean Up! std::cout << "Cleaning up!" << endl; ostringstream command2; #ifdef _WIN32 command2 << "rar -inul a " << videoName_str << ".rar *.dat settings.gp loadfile.gp"; #elif defined __linux__ || defined __APPLE__&&__MACH__ command2 << "tar cf " << videoName_str << ".tar *.dat settings.gp loadfile.gp"; #endif std::system(command2.str().c_str()); 文件生成正确,.dat也会生成gnuplot。调用PNGs时,没有任何反应。来自ffmpeg或其他任何内容的错误消息。 FFMpeg也是如此。也许,最后,我可以使用免费的WinRAR命令行实用程序!

Linux Mint 14 x64,Qt 4.8.1

奇怪的是,这种行为与Windows的行为相反。一旦更改目录,就会生成第一个7z文件。就好像我为.dat生成的每个后续调用都没有用,或者在某个地方丢失了。 fprintf()Gnuplot以及ffmpeg !!

一样有效

我真的很困惑。任何帮助,都会非常感激。

1 个答案:

答案 0 :(得分:1)

可能有用的几点:

  1. 确保检查每个系统调用的结果,包括system()和fprintf()。

  2. 自从我上次接触Windows以来已经有一段时间了;我记得根据二进制文件的链接方式,它们不会总是打印到同一个控制台。所以ffmpeg / winrar可能会抛出错误信息,或者只是分配一个新的,短命的控制台进行打印。

  3. 我会使用mkdir / _mkdir而不是调用system()。

  4. 使用popen()/ _ popen(),您可以更好地控制错误输出。

  5. 考虑使用shell脚本或bat文件。