【问题标题】:How to check whether a given file is a valid video file in C++?如何检查给定文件是否是 C++ 中的有效视频文件?
【发布时间】:2017-12-07 11:34:02
【问题描述】:

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

【问题讨论】:

  • 为什么不能简单地检查扩展?
  • @ShawnMathew - 因为扩展会撒谎?它们只不过是一种快速找出文件处理程序应该查找哪些元数据的方法。尽管有错误的扩展名,一些玩家还是能弄清楚(他们只是抱怨)。
  • @ShawnMathew 如果找不到其他方法,我会这样做。只是想知道这是否可以使用 OpenCV 完成
  • 你可以使用FFMPEG tecmint.com/…

标签: c++ opencv video


【解决方案1】:

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

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

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

【讨论】:

  • 是的,cv::VideoCapture::read() 即使输入文件是 .txt 也会返回 true
【解决方案2】:

你可以使用VideoCapture::read()的方法,如果:

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

示例:

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

【讨论】:

  • 如问题中所述,我做到了。即使输入是 .txt 文件也不会返回 false
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 2014-08-09
    • 2017-08-17
    • 2010-10-27
    • 1970-01-01
    • 2012-04-26
    • 2013-12-07
    相关资源
    最近更新 更多