首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 讀寫音訊檔案元資料(支援 MP3 ID3v1/v2 與 WMA)

     編輯:PHP 綜合知識

功能特性

  • 支援格式:MP3(ID3v1、ID3v2)、WMA(ASF 標頭)。
  • 可讀/寫欄位:Title、Artist、Copyright、Description、Year、Genre、AlbumTitle;MP3 額外支援 Track。
  • 編碼處理:WMA 使用 Unicode (UCS-2LE),內部自動轉換為 ANSI (GBK) 供介面使用。
  • 依賴:需啟用 mbstring 擴充套件。

類別架構

AudioExif (門面)
 ├─ _AudioExif (基底:檔案開關、緩衝讀寫)
 ├─ _Mp3Exif (MP3 具體實作)
 └─ _WmaExif (WMA 具體實作)

使用範例

require 'AudioExif.class.php';
$ae = new AudioExif();
$file = '/path/to/song.mp3';

// 1. 檢查檔案完整性(僅 WMA 有效,MP3 恆回傳 true)
$ae->CheckSize($file);

// 2. 讀取標籤
$info = $ae->GetInfo($file);
print_r($info);
/*
Array
(
    [Title] => 夜曲
    [Artist] => 周傑倫
    [AlbumTitle] => 十一月的蕭邦
    [Year] => 2005
    [Genre] => Pop
    [Track] => 3
    [ID3v1] => yes/no
    [meta] => Array(...) // MP3 幀資訊:比特率、採樣率、聲道等
)
*/

// 3. 寫入標籤
$tags = [
    'Title' => '新標題',
    'AlbumTitle' => '新專輯名',
    'Artist' => '新歌手',
    'Year' => '2024',
    'Genre' => 'Rock',
    'Track' => 5, // 僅 MP3
];
$ae->SetInfo($file, $tags); // 回傳 true/false

核心實作細節

MP3 (_Mp3Exif)

  • 優先讀取 ID3v2(檔頭),無則回退 ID3v1(檔尾 128 bytes)。
  • 寫入時總是更新 ID3v1,必要時同步更新 ID3v2(在原標頭空間內重寫,不改變檔案大小)。
  • 支援解析 MP3 幀頭取得 bitrate、samrate、mode、layer 等技術參數。

WMA (_WmaExif)

  • 解析 ASF 物件結構:標準資訊物件 (GUID: 3326B275...)、擴充資訊物件 (GUID: 40A4D0D2...)。
  • 字串採用 UCS-2LE,透過 mb_convert_encoding 雙向轉換 GBK。
  • 寫入時重建整個 Header 區塊,保持檔案大小不變(不足補空白,超出則向後移動資料區)。

輔助函數

// UCS-2LE (去除結尾雙位元組) → GBK
function dbcs_gbk($str) {
    $str = substr($str, 0, -2);
    return mb_convert_encoding($str, 'GBK', 'UCS-2LE');
}

// GBK → UCS-2LE (補雙位元組結尾)
function gbk_dbcs($str) {
    $str = mb_convert_encoding($str, 'UCS-2LE', 'GBK');
    $str .= "\0\0";
    return $str;
}

注意事項

  1. 寫入需檔案可寫(is_writable($file))。
  2. MP3 無 ID3v2 時不會自動建立,僅更新/建立 ID3v1。
  3. WMA 檢查完整性(CheckSize)依賴檔案長度與 Header 聲明長度一致。
  4. 編碼轉換假設輸入/輸出為 GBK (ANSI),UTF-8 專案需自行轉碼。

總結

此類別提供零依賴(除 mbstring)、跨平台的音訊標籤讀寫能力,適合 CMS、音樂播放器、批次整理工具等場景。原始碼開放,可依需求擴充更多欄位(如 Composer、Lyrics、Cover Art)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved