如何检查给定文件是否是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 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::VideoCapture
isOpened()
说文件是否存在,因此对于文本文件或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等的每个字符串。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到