如何检查给定文件是否是C ++中的有效视频文件?

时间:2017-07-04 06:29:36

标签: c++ opencv video

我尝试使用OpenCV:

std::string input_name = "<path to file>";
cv::VideoCapture cap(input_name);
if(!cap.isOpened()) printf("Invalid video\n");

但是,当我尝试传递.txt文件时,VideoCapture会因未知原因成功读取它。当我试图找到视频中的帧数时,

if(cap.get(cv::CV_CAP_PROP_FRAME_COUNT) == 0) printf("Invalid video\n");

每次执行时都会得到不同数量的帧。我也尝试在文件中找到一个框架的宽度和高度,

cv::Mat Frame;
if(!cap.read(Frame)) printf("Cannot read frame\n");
else
{
    printf("Frame width is %d\n", Frame.cols);
    printf("Frame height is %d\n", Frame.rows);
}

它们的值分别为640和400。为什么会这样?有没有办法检查给定文件是否是优选使用OpenCV的有效视频文件?

3 个答案:

答案 0 :(得分:2)

确定文件是否“有效”的唯一非常好的方法是使用适当的读取器功能读取其内容,该功能可以理解该格式。没有简单的通用标记可以说“这是一个真正的视频文件,并且不能成为别的东西” - 即使有,也有人可能故意或错误地将其放入文件中,使其看起来像“真实视频”,但不是在您阅读其余信息时。由于存在数十种不同的视频文件格式,因此很难做出比“尝试它,看看会发生什么”更为明智的事情。

如另一个答案中所讨论的,cv::VideoCapture::read()将读取文件并在文件无效时返回错误指示。如果你想区分“文件不存在”,你可以在尝试阅读它之前做一些检查,所以你可以说“文件不存在”,而不是“对不起,但看起来这不是一个有效的视频文件“ - 虽然后者确实适用于”也没有这样的文件“。

请注意,如果文件存在,我希望cv::VideoCaptureisOpened(),因此对于文本文件或PDF,它会很乐意接受“打开”。您必须实际尝试读取文件以判断它是否是视频文件。但是,::get::read的文档在“输入错误时会发生什么”方面毫无用处,似乎这些函数只能用于有效输入。

答案 1 :(得分:0)

我不熟悉openCV,但您可以随时检查文件扩展名。

kdt在这个问题上为此写了一个方法 https://stackoverflow.com/a/874160/4612406

type.value

只需传递您想要的文件名和文件扩展名&#34; .mp4&#34;。您可以更改此方法以获取结束字符串的向量,并检查向量中的每个字符串,您可以放置​​.mp4 .avi等。

答案 2 :(得分:0)

您可以使用方法VideoCapture::read(),如果符合以下情况,则会返回false:

  • 视频已损坏
  • 字符串路径指向无效文件

示例:

cv::VideoCapture cap(input_name);
auto x = cap.read(im);