1

我有以下命令行,可以为我提供视频文件的持续时间:

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

当我运行它时,我成功地取回了视频的持续时间,从命令提示符运行它。现在,我是 C++ 的初学者,所以我不确定如何将持续时间放入程序中的浮点数中。我在网上浏览了很多文章和问答论坛,并找到了可能的答案...使用标准输出/标准输入来获取信息...?我不确定。

我现在的策略是使用 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

所以我最后使用了jiggunjer的生成批处理文件的建议。我正在编程的软件旨在通过加载 vlc 电影播放器​​的外部实例(或可以使用任何其他电影播放器​​)以编程方式播放电影。

此代码位于 PlayMovie(char* MovieFileName) 函数中。

这将使用一行代码创建批处理文件,然后执行批处理文件,然后从 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 回答