【问题标题】:PHP finfo detecting m4a audio as videoPHP finfo 将 m4a 音频检测为视频
【发布时间】:2012-08-29 14:55:08
【问题描述】:

在 2 台不同的 AMP 服务器(一台 Linux,一台 Windows)上,PHP 的 finfo 函数为 m4a 音频文件返回 mime 类型的“video/mp4”。

$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。

【问题讨论】:

    标签: php


    【解决方案1】:

    使用的“魔法”文件与 Apache 无关。它被用作table of file signatures,根据您的系统,它可以是随 PHP 分发的“魔法”文件(大部分时间在 PHP 目录中的magicmagic.mime),或者是系统的“魔法”文件( Unix 上的file command 使用)。

    您也可以要求使用特定的“魔法”文件,如下所示:

    <?php 
      $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic.mgc");
    ?>
    

    您可以更改系统的“魔法”文件,也可以制作自定义文件。

    MPEG-4 音频和视频的standard file signatures 是:

    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 签名(由于编码器错误),因此您不能总是使用“魔术”文件来区分两者。然后,您可以根据文件扩展名(就像 Windows 一样)放置一些 PHP 代码来确定它是视频还是音频 mp4。

    【讨论】:

    • 谢谢。那么在这种情况下,你会建议我编辑现有的魔法文件,还是使用其他方法?
    • @BigMoMo 我会复制一份并使用我上面添加的说明进行检查。
    【解决方案2】:

    这与 Apache 无关。

    文件是本地的。 finfo 将返回它将返回的内容。如果您认为您需要特定类型的文件扩展名,只需返回它即可。

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 2017-05-11
      • 2012-01-16
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多