0

我正在使用 qt 为 c++ 代码开发接口,所以我想知道如何检查用户从打开的文件中打开它的文件类型,因为程序只接受视频文件。如果文件不是视频文件,我想出现错误消息。

提前致谢 :)

4

3 回答 3

2

文件“类型”只是一个简化。在现代操作系统上,从操作系统的角度来看,所有磁盘文件都是平等的(它们只是字节序列),文件的“类型”仅取决于读取/写入这些文件的程序。过去,许多操作系统用于区分二进制文件和文本文件,但那些时代几乎已经一去不复返了。

使文件类型“明显”的一种常用方法是使用命名约定......即,名称以“.mpg”结尾的文件可能是使用 MPEG 标准编码的视频文件,或“.txt”文件可能包含人类可读的文本。

因此,您有两个选择……或者您只是根据文件名过滤文件列表(例如,您只接受以“.mp4”、“.mpg”、“.mpeg”、“.avi”、“. wmv", ".webm", ".ogg" ... - 仅举几个常见的视频文件扩展名)或者您只是尝试将任何文件传递给程序,程序将决定它是否可以播放。如果程序是一个好的程序,如果它不能理解特定的文件格式而不是崩溃,它将优雅地失败。

请注意,即使您使用的是 Qt(便携式库),如果接受的视频文件编码取决于操作系统,甚至取决于单个安装,我也不会感到惊讶(因为视频/编解码器编解码器通常是“插件”可能已安装或未安装在系统上)。

如果您真的想限制文件名,请记住添加一种方法来选择扩展名不在您列表中的文件。每次你在你的程序中列举事物时,你首先是有点自大(一个列表意味着你知道所有可能的情况,你认为你真的知道吗?)并且你正在为未来的兼容性设置障碍(例如下一个版本的播放器程序也将处理 .wzz 视频文件,但您的程序将无法播放它们,因为允许的扩展名列表中有一个愚蠢的限制)。

于 2011-05-22T10:32:33.860 回答
1

您确实意识到您已经可以使用 QFileDialog 之类的东西过滤文件类型,对吧?只需查看文档,尤其是过滤器。有几个例子。

否则只需检查文件扩展名。

于 2011-05-22T10:34:30.200 回答
0

比文件扩展名更可靠的东西是检查文件头。您需要读取文件的第一个字节(标题)并查看它们是否与您的程序支持的视频容器格式之一匹配。

例如,Windows AVI 文件以十六进制字节开头:52 49 46 46(“RIFF”),而 MKV 文件以 1A 45 DF A3 开头(如果我没记错的话)。

这当然不能保证您的系统实际上可以播放此类文件(这取决于您是否拥有正确的编解码器/过滤器以及您的文件是否未损坏),但它比检查扩展名更可靠,这只是一个任意的名称并不能真正告诉您文件中的实际内容。

于 2011-05-22T10:50:10.690 回答