【发布时间】:2018-12-29 00:53:32
【问题描述】:
我需要检查哪些视频可以分析,哪些不能给出视频中的总帧数和视频的 fps。我创建了一个 c++ 程序来进行检查。分析每个视频不是一种选择,因为分析非常耗时。
我使用 OpenCV 库作为初学者:
cv::VideoCapture vid_to_analyze;
vid_to_analyze.open( me_vid.vid_path.string() );
me_vid.total_frames= static_cast<int>(vid_to_analyze.get(CV_CAP_PROP_FRAME_COUNT));
me_vid.fps=vid_to_analyze.get(CV_CAP_PROP_FPS);
if (!vid_to_analyze.isOpened())
{
std::cout << "Skipping vid: "<< me_vid.vid_path.string()<<", couldn't open it" << std::endl;
}
if (me_vid.fps != me_vid.fps || me_vid.fps <= 0)
{
std::cout << "For video " << me_vid.vid_path.string() << std::endl;
std::cout << "FPS of the video file cannot be determined, assuming 30"<< std::endl;
me_vid.fps = 30;
}
vid_to_analyze.release();
但是在调试时它变得非常缓慢(程序在没有附加调试器的情况下运行得更快,但考虑到它需要覆盖的视频数量仍然非常慢)。我认为这与每次打开(发布)视频时创建和删除 4 个线程有关。
如何以更快的方式获得总帧数和 fps(实际上不创建 4 个线程!!)如果我对实际从视频中抓取帧不感兴趣,只是帧数和帧数。
有没有办法从 c++ 使用 ffmpeg 库,那会更快吗?从哪里开始?
编辑:Valgrind 似乎同意,因为 (Ir=)91.66% 的时间花费在 vid_to_analyze.open 阶段
【问题讨论】:
-
您寻找的数据以某种形式存在于视频文件中。我不明白如何在不打开文件的情况下获取视频的属性。 (除非有关联的属性文件。)
-
你说得对,我把标题改好了。优先级不是不打开文件(读取)而是有效地做到这一点。必须以某种方式打开文件,以便读取参数。谢谢你纠正我
-
哪些文件格式?
-
.avi , .webm 但我不知道哪些编解码器(我认为是多个)但我可以检查。但最重要的是 .avi