将操作转换为泛型方法

时间:2013-07-23 18:48:04

标签: visual-c++

我在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。例如,如果方法的名称是frameRate:

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

由于

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分: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是正确的类型。