MP3 文件可以包括 ID3 标签,这种标签是位于文件开头或结尾、包含用于标识录制情况的元数据的部分。ID3 标签格式本身具有不同的修订版本。此例描述如何使用“随机访问文件数据”从包含最简单的 ID3 格式(ID3 1.0 版)的 MP3 文件读取和写入,“随机访问文件数据”表示它在文件中任意位置进行读取和写入。
包含 ID3 第 1 版标签的 MP3 文件在文件结尾最后 128 个字节中包括 ID3 数据。
当访问文件以进行随机读取/写入访问时,将
FileMode.UPDATE
指定为
open()
或
openAsync()
方法的
fileMode
参数很重要。
var file = air.File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3");
var fileStr = new air.FileStream();
fileStr.open(file, air.FileMode.UPDATE);
这样可以读取和写入文件。
打开文件时,您可以设置
position
指针以指向文件结尾向前 128 个字节的位置:
fileStr.position = file.size - 128;
此代码将
position
属性设置为指向文件中的此位置,这是因为 ID3 1.0 版格式指定 ID3 标签数据存储在文件的最后 128 个字节中。该规范还包含以下内容:
当读取数据后(在调度
complete
事件时),
id3TagRead()
方法将检查数据:
function id3TagRead()
{
if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i))
{
var id3Title = fileStr.readMultiByte(30, "iso-8859-1");
var id3Artist = fileStr.readMultiByte(30, "iso-8859-1");
var id3Album = fileStr.readMultiByte(30, "iso-8859-1");
var id3Year = fileStr.readMultiByte(4, "iso-8859-1");
var id3Comment = fileStr.readMultiByte(30, "iso-8859-1");
var id3GenreCode = 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)
) 填充。