我必须设计一个检测 mp4 文件的模块。如果将任何随机文件作为输入,它必须告诉它是否是一个mp4文件。在哪里可以找到mp4文件的标题规范?尝试谷歌搜索除了签名之外找不到任何东西。关于模块的C编程的其他任何提示?
答案 0 :(得分:5)
您可以查看扩展程序或文件签名(幻数)
http://www.garykessler.net/library/file_sigs.html
http://en.wikipedia.org/wiki/List_of_file_signatures
<00> 00 00 00 18 66 74 79 70 33 67 70 35 .... ftyp 3gp5 MPEG-4视频文件
或者,如果您使用的是Unix / Linux,则可以从程序中解析file(1)的输出。
修改强>
您不需要扫描整个文件来识别它,签名就可以了,但是,如果必须,请注意MP4是其他格式的容器,这意味着你将可能需要了解它包含的MP4和其他格式,这里有一些信息: http://en.wikipedia.org/wiki/MPEG-4_Part_14
我会使用类似libffmpeg之类的东西来代替。
答案 1 :(得分:4)
将文件读取为byte [],然后解析mime。
byte[] header = new byte[20];
System.arraycopy(fileBytes, 0, header, 0, Math.min(fileBytes.length, header.length));
int c1 = header[0] & 0xff;
int c2 = header[1] & 0xff;
int c3 = header[2] & 0xff;
int c4 = header[3] & 0xff;
int c5 = header[4] & 0xff;
int c6 = header[5] & 0xff;
int c7 = header[6] & 0xff;
int c8 = header[7] & 0xff;
int c9 = header[8] & 0xff;
int c10 = header[9] & 0xff;
int c11 = header[10] & 0xff;
int c12 = header[11] & 0xff;
int c13 = header[12] & 0xff;
int c14 = header[13] & 0xff;
int c15 = header[14] & 0xff;
int c16 = header[15] & 0xff;
int c17 = header[16] & 0xff;
int c18 = header[17] & 0xff;
int c19 = header[18] & 0xff;
int c20 = header[19] & 0xff;
if(c1 == 0x00 && c2 == 0x00 && c3 == 0x00)//c4 == 0x20 0x18 0x14
{
if(c5 == 0x66 && c6 == 0x74 && c7 == 0x79 && c8 == 0x70)//ftyp
{
if(c9 == 0x69 && c10 == 0x73 && c11 == 0x6F && c12 == 0x6D)//isom
return "video/mp4";
if(c9 == 0x4D && c10 == 0x53 && c11 == 0x4E && c12 == 0x56)//MSNV
return "video/mp4";
if(c9 == 0x6D && c10 == 0x70 && c11 == 0x34 && c12 == 0x32)//mp42
return "video/m4v";
if(c9 == 0x4D && c10 == 0x34 && c11 == 0x56 && c12 == 0x20)//M4V
return "video/m4v"; //flv-m4v
if(c9 == 0x71 && c10 == 0x74 && c11 == 0x20 && c12 == 0x20)//qt
return "video/mov";
if(c9 == 0x33 && c10 == 0x67 && c11 == 0x70 && c17 != 0x69 && c18 != 0x73)
return "video/3gp";//3GG, 3GP, 3G2
}
if(c5 == 0x6D && c6 == 0x6F && c7 == 0x6F && c8 == 0x76)//MOOV
{
return "video/mov";
}
}
答案 2 :(得分:1)
ISO基础媒体文件格式是免费提供的,MP4文件格式是“基本媒体格式”的扩展,对于大多数情况,它足以理解“基本媒体格式”。尝试谷歌将返回一个标准。
要检测文件是否为MP4,您需要读取前8个字节,其中包含(前4个字节大小的ATOM和接下来的4个字节“FTYP”)。 之后它包含了主要品牌和兼容品 - 如果它们中的任何一个是ISOM,它绝对是一个MP4文件。所以你只需要解析最初的几个字节来配置MP4文件。
您还可以查看“mp4v2-1.9.1”代码以了解MP4格式。
答案 3 :(得分:0)
这是一种容器格式。 The specification is here
即使掌握了规范,您仍需要做很多工作来支持 代表程序中的所有容器;设定现实要求。