0

.dat反復ごとに粒子座標を含むファイルを生成する粒子システム プログラムがあります。最終的な目標は、異なるパラメーターを持つスクリプトを介してプログラムを複数回実行することです。そのため、実行ごとに、関連するすべてのデータがフォルダーに保存されるようにプログラムをセットアップしようとしています。

私がやっていることは、 でファイルから生成PNGs.datGnuplotを呼び出しffmpegて からビデオを作成しPNGs、 を使用WinRARしてファイルを圧縮し.dat、最終的にすべての中間ファイルを削除してクリーンアップすることです。これは、作業ディレクトリで行うと機能します。

今、新しいディレクトリを作成して、そこで同じことをしようとしています。私のコード:

// 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");

この部分については、異論があることはわかっています。私は SO を広範囲に調べましたが、多くの人SetCurrentDirectory()が Windows を好むか、または .NET の使用に懐疑的system()です。私の弁護では、私は初心者のプログラマーであり、私の知識は本当に限られています...

FFMpegここで、ビデオを作成してからファイルを rar/tarしようとすると、次のようになります。

// 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());

Win/Linux では非常に異なる動作をします。

Win 7 x64、Visual Studio 2010/12

Windows では、フォルダーが作成されます。.datファイルは正しく生成され、同様にプロットgnuplotPNGsれます。がffmpeg呼び出されると、何も起こりません。からのエラーメッセージFFMpegも何もありません。についても同様ですWinRAR。最後に、7z無料のコマンド ライン ユーティリティを使用することもできます。

Linux ミント 14 x64、Qt 4.8.1

不思議なことに、Windows とは動作が逆になっています。ディレクトリが変更されるとすぐに、最初の.datファイルのみが生成されます。ファイル生成のために行う後続のすべての呼び出しfprintf()が機能しないか、どこかで失われたかのようです。とGnuplot同様に動作します!!ffmpegtar

私は本当に困惑しています。どんな助けでも、本当に感謝します。

4

1 に答える 1

1

役立つかもしれないいくつかのポイント:

  1. system() や fprintf() など、すべてのシステム コールの結果を必ず確認してください。

  2. 最後に Windows に触れてからしばらく経ちました。バイナリのリンク方法によっては、常に同じコンソールに出力されるとは限らなかったことを覚えています。そのため、ffmpeg/winrar はエラー メッセージを破棄するか、新しい短命のコンソールを印刷用に割り当てるだけである可能性があります。

  3. system() を呼び出す代わりに、mkdir/_mkdir を使用します。

  4. popen()/_popen() を使用すると、エラー出力をより細かく制御できます。

  5. シェル スクリプトまたはバット ファイルの使用を検討してください。

于 2013-05-27T23:39:08.210 に答える