PHP 使用 AudioExif 类读写 WMA 和 MP3 音频文件元数据
在 Linux 或 Unix 环境下操作音频文件元数据往往不如 Windows 平台便捷。为了解决这一痛点,这里分享一段专为 PHP 设计的 AudioExif 核心代码。它允许你在不依赖第三方扩展的情况下,对本地存储的 .mp3 和 .wma 文件进行精准的头部信息读写。
环境与准备条件
由于 WMA 格式的文件内部采用 Unicode (UCS-2LE) 编码存取文本信息,因此在使用此模块前,你的 PHP 运行环境中必须加载并启用 mbstring 扩展。此外,本代码返回及写入的数据默认以 ANSI 编码(即 GBK / GB2312)处理,这非常适合中文环境下的显示需求。
支持的功能与限制
- 支持的格式:目前仅支持标准的
.WMA和.MP3格式。 - 读取能力:对于 MP3,优先尝试读取
ID3v2,若不存在则回退读取ID3v1;完整读取支持的几个头部信息字段。 - 写入能力:写入时始终会更新
ID3v1,必要时同步修改ID3v2。对于 WMA 文件,同样执行相应的头部结构覆盖。 - 支持的字段:
WMA: Title(名称), Artist(艺术家), Copyright(版权), Description(描述), Year(年代), Genre(流派), AlbumTitle(专辑标题)
MP3: 以上全部 + Track(曲目编号)
真实操作顺序与使用方法
在实际使用时,你可以直接将下面的 PHP 类定义作为一个独立的文件(例如 AudioExif.class.php)引入到你的业务代码中。以下是标准的使用流程:
第1步:实例化对象与确认文件路径
确保需要操作的音频文件位于服务器可访问的路径中,并正确引入了该类库。通过实例化来获取操作句柄。
require ('AudioExif.class.php');
$AE = new AudioExif;
$file = '/path/to/test.mp3'; // 替换为你的实际文件路径
第2步:检查文件结构的完整性
在进行任何读取或写入之前,建议先调用 CheckSize 方法。虽然 MP3 文件通常会直接返回 true,但针对 WMA 文件,它会检查文件头部的长度是否与声明的长度一致,从而判断是否为损坏或截断的无效文件。
$is_valid = $AE->CheckSize($file);
if (!$is_valid) {
trigger_error('该WMA文件可能已损坏', E_USER_WARNING);
}
第3步:读取当前文件的元数据
调用 GetInfo 方法,传入文件路径,它将返回一个包含各类信息的关联数组。你可以通过遍历该数组查看当前歌曲的名称、歌手等信息。
$info_array = $AE->GetInfo($file);
print_r($info_array); // 输出键名为 Title, Artist, AlbumTitle 等的数组
第4步:批量更新元数据信息
将需要修改的信息组装成哈希数组,并传入 SetInfo 函数。请注意,文件必须具备可写权限(即 php 进程有该目录的写权限),否则会触发警告。
// 设置要更新的字段
$new_pa = array(
'Title' => '新歌曲标题',
'AlbumTitle' => '最新专辑名称',
'Artist' => '未知歌手'
);
// 执行写入(仅 MP3 可额外指定 'Track' => 10)
$result = $AE->SetInfo($file, $new_pa);
if ($result) {
echo "元数据写入成功!";
}
底层原理与注意事项
AudioExif 的实现原理是深入分析二进制文件头结构。对于 MP3,它解析了经典的 TAG (ID3v1) 以及 ID3 (ID3v2) 帧结构;对于 WMA,它解析了特定的 GUID 标识以及 Standard Info 和 Extended Info 区块。当元数据长度发生变化导致新旧块大小不一致时,该类会在内存中对后续字节流进行重新拼接与截断(truncation),以保证文件头部结构的完整性。
以上就是用 PHP 读写音频文件信息(支持WMA和MP3)的详细内容,更多关于PHP操作多媒体文件或处理音频标签的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









