0

我在 Visual C++ 中工作,通常我在 .NET 上进行,因为我需要一种仅在这种语言上可用的方法。我想要做的是获取视频文件的每秒帧数。我能做的最好的事情是使用这个 main() 方法创建一个项目,其中(在 Debug 之后)我可以看到结果很好地保存在 res 变量中。

void main() 
{
    // initialize the COM library
    CoInitialize(NULL);

    // get a property store for the video file
    IPropertyStore* store = NULL;
    SHGetPropertyStoreFromParsingName(L"C:\\Users\\Public\\Videos\\Sample Videos\\Wildlife.wmv", 
        NULL, GPS_READWRITE, __uuidof(IPropertyStore), (void**)&store);

    // get the frame rate 
    PROPVARIANT variant;
    store->GetValue(PKEY_Video_FrameRate, &variant);
    int res = variant.intVal;
    store->Release();
}

现在,我想创建这个通用方法,以获得任何视频的帧率。例如,如果方法的名称是 frameRate:

 char* path = "C:\\Users\\Public\\Videos\\Sample Videos\\Wildlife.wmv";
 int fps = frameRate(path);

谢谢

4

2 回答 2

0

这不起作用吗?

int getFrameRate(std::wstring path)
{
    // initialize the COM library
    CoInitialize(NULL);

    // get a property store for the video file
    IPropertyStore* store = NULL;
    SHGetPropertyStoreFromParsingName(path.c_str(), 
        NULL, GPS_READWRITE, __uuidof(IPropertyStore), (void**)&store);

    // get the frame rate 
    PROPVARIANT variant;
    store->GetValue(PKEY_Video_FrameRate, &variant);
    int res = variant.intVal;
    store->Release();

    return res;
}

这里的假设是 SHGetPropertyStoreFromParsingName 将字符串作为其第一个参数。在 C++ 中,我建议远离 char*,std::string 在几乎所有情况下都是可取的。我看到的唯一困难是确保path类型正确。

于 2013-07-23T19:18:26.437 回答
0

如果您不想为每个视频路径重新编译代码,那么您可以从程序参数中读取路径。为此,请main()按如下方式修改您:

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        std::cout << "You have to specify the video path!" << std::endl;
        return 1;
    }

    const char* path = arg[1];

    // Rest of the program logic

    return 0;
}

如果需要,您可以传递多个参数。请注意,始终至少有 1 个参数(arg[0]是程序名称)。有关该主题的进一步阅读,请转到此处

于 2013-07-23T19:09:51.520 回答