我在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);
由于
答案 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
是正确的类型。