繁体   English   中英

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

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

我尝试使用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?

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

如另一个答案中所述, cv::VideoCapture::read()将读取文件,并在文件无效时返回错误指示。 如果要区分“文件不存在”,则可以在尝试读取文件之前进行一些检查,因此可以说“文件不存在”,而不是“抱歉,但这似乎不是”有效视频文件”-尽管后者也适用于“也没有这样的文件”。

请注意,如果文件存在,我希望cv::VideoCapture会说isOpened() ,因此对于文本文件或PDF,它将很乐意接受为“打开”。 您实际上必须尝试读取该文件以判断它是否为视频文件。 但是,就“输入错误会发生什么”而言, ::get::read的文档都几乎没有用,似乎这些函数仅设计用于有效输入。

我不熟悉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等的每个字符串。

您可以使用VideoCapture::read() ,如果满足以下条件,则将返回false:

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

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM