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

How to check whether a given file is a valid video file in C++?

本文关键字:文件 C++ 是否是 有效 视频 何检查 检查      更新时间:2023-10-16

我尝试使用OpenCV来做到这一点:

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

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

if(cap.get(cv::CV_CAP_PROP_FRAME_COUNT) == 0) printf("Invalid videon");

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

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

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

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

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

请注意,我希望cv::VideoCaptureisOpened()说文件是否存在,因此对于文本文件或PDF,它将很乐意接受它作为"打开"。您必须实际尝试读取文件以判断它是否是视频文件。但是,::get::read的文档在"错误输入时会发生什么"方面都毫无用处,几乎看起来这些函数旨在仅适用于有效输入。

您可以使用方法VideoCapture::read(),如果出现以下情况,它将返回 false:

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

例:

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

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

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

bool hasEnding (std::string const &fullString, std::string const &ending) 
{
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}

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