wikimedia/getid3

PHP 脚本,可从流行的多媒体文件格式中提取有用信息

v2.0.0-beta5 2022-10-28 11:52 UTC

README

可在 http://getid3.sourceforge.nethttps://www.getid3.org 获取

getID3() 采用多个许可证发布。您可以从以下许可证中选择,并根据最适合您项目的许可证条款使用 getID3。

GNU GPL

GNU LGPL

Mozilla MPL

getID3 商业许可证

  • gCL (不再提供,现有许可证仍然有效)

上述每个许可证的副本都包含在 getID3 分发的 licenses/ 目录中。

如果您想捐赠,可以在 https://www.getid3.org 上找到 PayPal 捐赠链接。

快速入门

问题:我如何检查 getID3() 是否在我的服务器/文件上工作?

答案:将 getID3() 解压到目录中,然后访问 /demos/demo.browse.php

支持

问题:我有一个问题,或者我发现了错误。我该怎么做?

答案:支持请求和/或错误报告的首选方法是访问 http://support.getid3.org/ 的论坛

Sourceforge 通知

强烈建议您注册 Sourceforge 的新版本发布通知。请访问: http://sourceforge.net/project/showfiles.php?group_id=55859 并点击小 "监视包" 图标/链接。如果您之前注册了邮件列表,请注意它已被取消,现在只使用自动化的 Sourceforge 通知。

getID3() 做什么?

读取并解析(程度不同)

  • 标签

    • APE (v1 和 v2)
    • ID3v1 (& ID3v1.1)
    • ID3v2 (v2.4, v2.3, v2.2)
    • Lyrics3 (v1 & v2)
  • 有损音频

    • MP3/MP2/MP1
    • MPC / Musepack
    • Ogg (Vorbis, OggFLAC, Speex, Opus)
    • AAC / MP4
    • AC3
    • DTS
    • RealAudio
    • Speex
    • DSS
    • VQF
  • 无损音频

    • AIFF
    • AU
    • Bonk
    • CD-audio (*.cda)
    • FLAC
    • LA (Lossless Audio)
    • LiteWave
    • LPAC
    • MIDI
    • Monkey's Audio
    • OptimFROG
    • RKAU
    • Shorten
    • Tom's lossless Audio Kompressor (TAK)
    • TTA
    • VOC
    • WAV (RIFF)
    • WavPack
  • 音频-视频

    • ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV)
    • AVI (RIFF)
    • Flash
    • Matroska (MKV)
    • MPEG-1 / MPEG-2
    • NSV (Nullsoft Streaming Video)
    • Quicktime (包括 MP4)
    • RealVideo
  • 静态图像

    • BMP
    • GIF
    • JPEG
    • PNG
    • TIFF
    • SWF (Flash)
    • PhotoCD
  • 数据

    • ISO-9660 CD-ROM 图像(目录结构)
    • SZIP(有限支持)
    • ZIP(目录结构)
    • TAR
    • CUE
  • 写入

    • ID3v1 (& ID3v1.1)
    • ID3v2 (v2.3 & v2.4)
    • OggVorbis 上的 VorbisComment
    • FLAC 上的 VorbisComment(非 OggFLAC)
    • APE v2
    • Lyrics3(仅删除)

要求

  • PHP 4.2.0 至 5.2.x(用于 getID3() 1.7.x 及更早版本)
  • PHP 5.0.5(或更高版本)用于 getID3() 1.8.x 及更高版本
  • PHP 5.0.5(或更高版本)用于 getID3() 2.0.x 及更高版本
  • PHP至少需要4MB内存。强烈建议8MB或更多。加载所有模块时需要12MB。

安装

首选方法是通过composer进行。如果您尚未安装composer,请遵循安装说明

安装composer后,在项目根目录下执行以下命令来安装此库

composer require james-heinrich/getid3

用法

请查看/demos/demo.basic.php,了解使用getID3()的非常基本的用法,没有花哨的输出,仅扫描一个文件。

请查看structure.txt以了解返回的数据结构。

请运行/demos/demo.browse.php来查看getID3()的完整目录浏览、文件扫描实现的示例。

请查看/demos/demo.mysql.php,了解一个示例递归扫描代码,该代码扫描给定目录中的每个文件及其所有子目录,并将结果存储在数据库中,允许进行各种分析/维护操作。

要分析通过HTTP或FTP的远程文件,您需要在运行getID3()之前首先将文件复制到本地。您的代码可能如下所示

<?php

// Copy remote file locally to scan with getID3()
$remotefilename = 'http://www.example.com/filename.mp3';
if ($fp_remote = fopen($remotefilename, 'rb')) {
    $localtempfilename = tempnam('/tmp', 'getID3');
    if ($fp_local = fopen($localtempfilename, 'wb')) {
        while ($buffer = fread($fp_remote, 8192)) {
            fwrite($fp_local, $buffer);
        }
        fclose($fp_local);
        // Initialize getID3 engine
        $getID3 = new getID3;
        $ThisFileInfo = $getID3->analyze($localtempfilename);
        // Delete temporary file
        unlink($localtempfilename);
    }
    fclose($fp_remote);
}

请查看/demos/demo.write.php了解如何写入标签。

返回的数据结构是什么样子?

请查看structure.txt

建议您查看/demos/demo.browse.php的输出,扫描您感兴趣的文件,以确认在一般情况下以及您的特定文件中,任何特定文件类型实际返回的数据是什么,因为实际返回的数据可能因文件中可用的信息而有所不同。

注意

getID3() 1.x

如果格式解析器遇到严重问题,它将在$fileinfo['error']中返回一些内容,描述遇到的问题。如果生成较不严重的问题或通知,它将出现在$fileinfo['warning']中。这两个键可能包含多个警告或错误。如果['error']中返回了内容,则文件未正确解析,返回的数据可能正确或不完整。如果['warning']中返回了内容(但不是['error']),则返回的数据是正常的——通常getID3()正在报告由于其他程序中已知错误而解决的文件错误。一些警告可能表明返回的数据是正常的,但由于文件中的错误而无法提取某些数据。

getID3() 2.x

请参阅上文,但错误被抛出(因此您只会得到一个错误)。

免责声明

getID3()已在许多系统、许多类型的文件以及许多操作系统下进行了测试,一般认为它是稳定和安全的。话虽如此,仍有可能存在未发现和/或未修复的bug,可能会损坏您的文件,尤其是在写入函数中。通过使用getID3(),您同意如果您的任何文件被损坏,这不是我的责任。实际上,我对任何事情都不承担责任:)

许可

GNU通用公共许可证 - 请参阅license.txt

本程序是自由软件;您可以在自由软件基金会发布的GNU通用公共许可证的条款下重新分发和/或修改它;许可证的第2版,或者(根据您的选择)任何较新版本。

本程序是根据希望它有用的目的进行分发的,但没有任何保证;甚至没有对适销性或适用于特定目的的暗示保证。有关详细信息,请参阅GNU通用公共许可证。

您应该已收到GNU通用公共许可证副本;如果没有,请写信给:自由软件基金会,Inc. 59 Temple Place - Suite 330 波士顿,MA 02111-1307,美国。

常见问题解答(FAQ)

问:我可以在我的程序中使用getID3()吗?我需要商业许可证吗?

A: 您通常可以随意使用 getID3。唯一需要商业许可证的情况是,如果您正在销售集成了 getID3 的闭源程序。如果您销售包含 getID3 复制品的程序,只要您在销售时包含源代码副本即可。或者,您可以在不包含 getID3 的情况下分发您的代码,并说明“从 getid3.sourceforge.net 下载”。

为什么它被称为 "getID3()",尽管它做了这么多不仅仅是这一点的事情?

v0.1 确实只做了那一点。我不再有那份旧代码的副本,但今天我可以用一行函数来写它。

function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); }

未来计划

https://www.getid3.org/phpBB3/viewforum.php?f=7

getID3()中已知的错误/问题,可能最终会修复

https://www.getid3.org/phpBB3/viewtopic.php?t=25

  • 无法确定具有VBR视频数据的MPEG视频的比特率(需要文档)
  • 无法确定MPEG视频的交错/逐行扫描(需要文档)
  • MIDI播放时间有时不准确
  • AAC-RAW模式文件无法识别
  • WavPack-RAW模式文件无法识别
  • mp4文件报告大量“未知QuickTime原子类型”(需要文档)
  • 加密的ASF/WMA/WMV文件警告“未处理的GUID ASF_Content_Encryption_Object”
  • NSV中音频和视频之间的比特率无法计算,只能计算总比特率。(需要文档)
  • 所有Ogg格式(Vorbis、OggFLAC、Speex)都受到大型VorbisComments跨越多个Ogg页面的问题的困扰,但只有OggVorbis文件可以用vorbiscomment处理。
  • Mac OS 10.2.8(可能还有其他版本)提供的“head”版本仅理解单个选项(-n),因此失败。getID3忽略它并返回错误的md5_data。

getID3()中已知的错误/问题,无法修复

https://www.getid3.org/phpBB3/viewtopic.php?t=25

  • 仅限32位PHP安装:由于32位PHP文件系统函数的限制,getID3()无法始终完全解析大于2GB的文件。注意:从v1.7.8b3开始,对大于2GB的文件提供部分支持,大多数文件都将解析正常,只要没有关键数据位于2GB偏移量之外。已知将工作
    • 64位PHP上的所有文件格式
    • ZIP(格式不支持大于2GB的文件)
    • FLAC(当前编码器不支持大于2GB的文件)已知无法工作
    • ID3v1标签(始终位于文件末尾)
    • Lyrics3标签(始终位于文件末尾)
    • APE标签(始终位于文件末尾)可能工作
    • Quicktime(如果需要,则元数据在2GB偏移量之前,即文件已被提示/优化以进行流式传输,则可以工作)
    • RIFF.WAV(应该工作良好,但会警告无法解析所有数据块)
    • RIFF.AVI(播放时间可能不正确,仅基于适合第一个2GB的"movi"数据块,应发出错误以显示播放时间不正确。其他数据应大致正确,假设数据在文件中保持不变)

其他程序中的已知错误/问题

https://www.getid3.org/phpBB3/viewtopic.php?t=25

  • Windows Media Player(最高v11)和iTunes(最高v10+)不正确处理UTF-16BE+BOM编码的ID3v2.3标签(它们假设数据是UTF-16LE+BOM,要么崩溃(WMP),要么输出亚洲字符集(iTunes)
  • Winamp(至少v2.80)不支持ID3v2.4标签,只支持ID3v2.3,请参阅:http://forums.winamp.com/showthread.php?postid=387524
  • 某些版本的 Helium2(www.helium2.com)即使标签标记为 ID3v2.4,也不写入符合 ID3v2.4 规范的帧大小(由 getID3() 检测到)
  • MP3ext V3.3.17 在 ID3v2 标题的末尾放置了一个不符合规范的填充字符串。据说在 v3.4b21 中已修复,但前提是你必须手动添加注册表键。此修复尚未得到确认。(由 getID3() 检测到)
  • CDex v1.40(由 v1.50b7 修复)写入不符合规范的 Ogg 注释字符串,应采用 "NAME=value" 格式,但实际上只写入 "value"(由 getID3() 检测到)
  • Oggenc 0.9-rc3 将编码文件标记为 ABR,无论它是 ABR 还是 VBR。
  • iTunes(版本 "X v2.0.3","v3.0.1" 已被确认为有罪,可能其他版本也是如此)使用不适用于 ID3v2.3+ 的帧名 'COM ' 写入 ID3v2.3 注释标签(由 getID3() 检测到)
  • MP2enc 无法正确编码单声道 CBR MP2 文件(声音速度减半,播放时间加倍)
  • MP2enc 无法正确编码单声道 VBR MP2 文件(实际上编码为立体声)
  • tooLAME 无法正确编码单声道 VBR MP2 文件(实际上编码为立体声)
  • AACenc 以 VBR 模式编码文件(即使指定了 CBR)
  • AAC/ADIF - 对于 vbr 文件,bitrate_mode = cbr
  • LAME 3.90-3.92 在使用 DLL 编码 CBR 模式时,在编码前预置一个空数据帧(用于 LAME/VBR 标题的空间,但实际上从未写入)
  • Ahead Nero 使用 DSIZ 值(应表示字节数的文件大小)为 "0" 对 TwinVQF v1.0 进行编码,对 TwinVQF v2.0 进行编码时为 "1"(由 getID3() 检测到)
  • Ahead Nero 编码的 TwinVQF 文件比预期短 1 秒
  • AAC-ADTS 文件实际上总是以 VBR 模式编码,即使指定了 CBR 模式(编码器的 CBR 模式开关启用 ABR 模式,而不是 CBR,但无法区分此类 ABR 文件和真正的 VBR)
  • OggFLAC 中的 STREAMINFO.audio_signature 总是 null。原因是 libOggFLAC 尚不支持搜索,因此无法在编码后返回并写入计算出的总和。Ogg FLAC 中的搜索支持是下一个版本的首要任务。- Josh Coalson(FLAC 开发者)注意:getID3() 将使用类似于其他文件格式的方法计算 md5_data,但该值不能与 FLAC 文件格式中的 FLAC 数据的 md5_data 值进行比较。
  • FLAC v0.3.0 & v0.4.0 中的 STREAMINFO.audio_signature 未经计算 - getID3() 将使用类似于其他文件格式的方法计算 md5_data,但该值不能与 FLAC v0.5.0+ 中的 md5_data 值进行比较
  • RioPort(包括 2.0 和 3.11 等各种版本)使用没有数据部分的 WCOM 帧标记 ID3v2
  • Coolplayer 的早期版本会将非法 ID3 标签添加到 Ogg Vorbis 文件中,从而使它们损坏。
  • Meracl ID3 Tag Writer v1.3.4(及更早版本)在追加新的 ID3v1 标签时错误地截断了 MP3 文件数据的最后一个字节。(由 getID3() 检测到)
  • 使用或未使用 -noseek 开关编解码的 Lossless-Audio 文件在内部实际上确实不同,因此无法匹配 md5_data
  • iTunes 已知会在 ID3v2 标签也存在时在现有 ID3v1 标签的末尾追加一个新的 ID3v1 标签(由 getID3() 检测到)
  • MediaMonkey 可能会写入一个空白的 RGAD ID3v2 帧,但将实际的重放增益调整放在一系列用户定义的 TXXX 帧中(自 v1.9.2 以来由 getID3() 检测和处理)

参考材料

www.id3.org 现在镜像在 http://id3lib.sourceforge.net/id3/