作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 2 个不同的 AMP 服务器(一个 Linux,一个 Windows)上,PHP 的 finfo 函数为 m4a 音频文件返回“video/mp4”的 mime 类型。
$path = '/path/to/some/audio.m4a';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $path);
print $mime; // video/mp4
我相信这可以通过 Apache 的 mime.types 文件来控制,但是在找到“audio/mp4”行并添加 m4a 扩展名之后:
audio/mp4 mp4a m4a
重启Apache,还是报video/mp4。
如何让 finfo 检测 .m4a 音频文件的正确(音频)mime 类型?
TYIA。
最佳答案
使用的“魔术”文件与 Apache 无关。它用作 table of file signatures根据您的系统,它可能是一个随 PHP 分发的“魔法”文件(magic
或 magic.mime
,大多数情况下在 PHP 的目录中),或者是系统的“魔术”文件(由 file
command 在 Unix 上使用)。
你也可以像这样要求使用特定的“魔法”文件:
<?php
$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
?>
您可以更改系统的“魔法”文件或制作您的自定义文件。
standard file signatures用于 MPEG-4 音频和视频的是:
00 00 00 18 66 74 79 70
33 67 70 35 ....ftyp
3gp5
MP4 MPEG-4 video files
00 00 00 18 66 74 79 70
6D 70 34 32 ... ftyp
mp42
M4V MPEG-4 video/QuickTime file
00 00 00 20 66 74 79 70
4D 34 41 20 ... ftyp
M4A
M4A Apple Lossless Audio Codec file
您可能需要先检查这些是否在您的“魔法”文件中。
据我所知,m4a(音频)和 m4v(视频)可能具有相同的 mp4 签名(由于编码器不好),因此您不能总是使用“魔术”文件来区分一个与另一个。然后,您可以放置一些 PHP 代码来根据文件扩展名(就像 Windows 所做的那样)确定它是视频还是音频 mp4。
关于PHP finfo 将 m4a 音频检测为视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272098/
我是一名优秀的程序员,十分优秀!