示例:使用随机访问读取和写入数据

Adobe AIR 1.0 和更高版本

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 个字节中。该规范还包含以下内容:

  • 标签的前 3 个字节包含字符串 "TAG"

  • 接下来的 30 个字符包含 MP3 曲目的标题,为字符串。

  • 接下来的 30 个字符包含艺术家的姓名,为字符串。

  • 接下来的 30 个字符包含唱片的名称,为字符串。

  • 接下来的 4 个字符包含年份,为字符串。

  • 接下来的 30 个字符包含注释,为字符串。

  • 接下来的 1 个字节包含代码,指示曲目的流派。

  • 所有文本数据都采用 ISO 8859-1 格式。

当读取数据后(在调度 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) ) 填充。