MP3 檔案可包含 ID3 標籤,而這些標籤位於檔案 (包含可識別歌曲的中繼資料) 開頭或結尾的區段。ID3 標籤格式本身具有不同的版本。在下列範例中,會說明如何使用「檔案資料的隨機存取權」(表示範例可以在檔案中的任意位置執行存取和寫入作業),對包含最簡單之 ID3 格式 (ID3 1.0 版) 的 MP3 檔案執行讀取和寫入作業。
包含 ID3 標籤第 1 版的 MP3 檔案在檔案結尾處 (最後的 128 位元組中) 包含 ID3 資料。
當存取檔案供隨機讀取/寫入存取時,請務必將
open()
或
openAsync()
方法的
fileMode
參數設定為
FileMode.UPDATE
:
var file:File = File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3");
var fileStr:FileStream = new FileStream();
fileStr.open(file, FileMode.UPDATE);
如此,您才可以對檔案執行讀取和寫入作業。
在開啟檔案時,您可以將
position
指標設定為檔案結尾之前 128 個位元組這個位置:
fileStr.position = file.size - 128;
上述程式碼會將
position
屬性設定為檔案中的這個位置,因為 ID3 v1.0 格式指定 ID3 標籤資料必須儲存在檔案的最後 128 個位元組中。該版本的規格也規定下列項目:
-
標籤的前 3 個位元組必須包含
"TAG"
字串。
-
之後的 30 個字元必須包含 MP3 歌曲的標題 (以字串表示)。
-
之後的 30 個字元必須包含藝人的姓名 (以字串表示)。
-
之後的 30 個字元必須包含專輯的名稱 (以字串表示)。
-
之後的 4 個字元必須包含年份 (以字串表示)。
-
之後的 30 個字元必須包含註解 (以字串表示)。
-
之後 1 個位元組必須包含表示歌曲類型的代碼。
-
所有文字資料的格式都必須是 ISO 8859-1。
id3TagRead()
方法會在資料已讀入之後 (
complete
事件發生時) 檢查資料:
function id3TagRead():void
{
if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i))
{
var id3Title:String = fileStr.readMultiByte(30, "iso-8859-1");
var id3Artist:String = fileStr.readMultiByte(30, "iso-8859-1");
var id3Album:String = fileStr.readMultiByte(30, "iso-8859-1");
var id3Year:String = fileStr.readMultiByte(4, "iso-8859-1");
var id3Comment:String = fileStr.readMultiByte(30, "iso-8859-1");
var id3GenreCode:String = fileStr.readByte().toString(10);
}
}
您也可以對檔案執行隨機存取寫入作業。例如,您可以剖析
id3Title
變數,確保它已經透過正確方式改為大寫 (使用 String 類別的方法),接著再將經過修改的字串 (名為
newTitle
) 寫入至檔案,如下所示:
fileStr.position = file.length - 125; // 128 - 3
fileStr.writeMultiByte(newTitle, "iso-8859-1");
為了符合 ID3 第 1 版的標準,
newTitle
字串的長度必須為 30 個字元,並且在結尾處以字元碼 0 來填補 (
String.fromCharCode(0)
)。