1

ビデオ ファイルの長さを示す次のコマンド ラインがあります。

ffprobe.exe -i Video.mp4 show_entries format=duration -v quiet -of csv="p=0"

これを実行すると、ビデオの長さが正常に返され、コマンド プロンプトから実行されます。今、私はC++の初心者なので、その期間をプログラム内のフロートに入れる方法がわかりません。オンラインで多くの記事や質疑応答フォーラムを調べたところ、可能な回答が見つかりました... stdout/stdin を使用して情報を取得します...? わからない。

私の現在の戦略は、CreateProcess() を使用してプロセスを実行し、次に WaitForSingleObject() を使用してから、なんらかのコマンドを使用して ffprobe プロセスから出力データを取得することです。おそらく、私が探しているデータは CreateProcess() 関数を介して取得できますか? 私はとても近くにいるように感じますが、これについて真剣に助けが必要です...

ちなみに、私は Visual C++ Express 2010 を使用しているため、MFC にアクセスできません。

誰かが私をこの情報に正しい方向に導くことができれば、それは大歓迎です.

4

2 に答える 2

0

私自身はffmpegを使用していませんが、プログラムでlibavcodec/ffmpegライブラリを使用して、プログラムで期間を取得できます。

詳細については、こちらを参照してください: libavcodec/ffmpeg を使用してビデオ ファイルの長さを確認する方法

于 2015-07-07T08:35:34.690 に答える
0

そこで、バッチファイルを生成するというジグガンジャーの提案を最後に使用しました。私がプログラミングしているソフトウェアは、vlc ムービー プレーヤー (または他のムービー プレーヤーを使用できます) の外部インスタンスをロードすることにより、プログラムでムービーを再生することを目的としています。

このコードは PlayMovie(char* MovieFileName) 関数内にあります。

これにより、1 行のコードでバッチ ファイルが作成され、バッチ ファイルが実行され、Movies// フォルダー内で生成された ini ファイルから投稿されたデータが取得されます。

        //Create batch file
    FILE * pFile;
    //char* movieinfowritebuffer = "ffprobe -v quiet -print_format ini -show_format -show_streams Movies/Kai.mp4 > Movies/Kai.mp4.ini";
    //Minf_wrBuffer = Minf_finalpath
    char* Minf_wrBuffer = &Minf_finalpath[0u];

    pFile = fopen ("MPlayer_MovieInfo.bat", "wb+");
    fwrite (Minf_wrBuffer,strlen(Minf_wrBuffer),1, pFile);
    fclose (pFile);

    Sleep(250);

    //MessageBox(NULL,"Next, we use ShellExecuteA to launch the .bat file.","LAUNCHER",NULL);
    //Run batch file to create mp4 info ini
    ShellExecuteA(NULL,"open","MPlayer_MovieInfo.bat",NULL,NULL,SW_HIDE);

    Sleep(250);

    //MessageBox(NULL,"Now, we grab the duration of the movie file from the ini file using GetPrivateProfileString.","LAUNCHER",NULL);
    //Get duration from ini file

    //Get the filename to create...
    std::string iniFileToCreate = "Movies\\" + Minf_MovieName + ".ini";

    char MovieDurationBuffer[256];
    GetPrivateProfileString("streams.stream.1", 
        "duration", 
        "Default", 
        MovieDurationBuffer, 
        256, 
        iniFileToCreate.c_str());

    float MovieDuration = atof(MovieDurationBuffer);
   //Now play with MovieDuration
    float MovieDurationTruncated = MovieDuration;
    int tmp = MovieDurationTruncated * 100000; // 44.8 truncated to 44
    MovieDurationTruncated = tmp / 100.0; // 4.4

        char MovieDurationChar[20]; sprintf(MovieDurationChar, "%1.0f", MovieDurationTruncated-3);

        int MovieDurationInt;
        sscanf(MovieDurationChar, "%d", &MovieDurationInt);
于 2015-07-11T21:37:27.543 に答える