MP3-файлы могут содержать теги ID3 — сегменты в начале или в конце файла, хранящие метаинформацию о записи. Существует несколько версий формата тегов ID3. В этом примере показано, как читать и записывать данные в MP3-файл с тегами ID3 самого простого формата (ID3 версии 1.0), используя функцию случайного доступа к данным файла. Это означает, что чтение и запись производятся в произвольные положения в файле.
В MP3-файле с тегами ID3 версии 1 данные ID3 содержатся в последних 128 байтах файла.
При случайном доступе к файлу для чтения и записи важно указать
FileMode.UPDATE
в качестве параметра
fileMode
метода
open()
или
openAsync()
:
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 версии 1.0 подразумевает, что теги ID3 хранятся в последних 128 байтах файла. Кроме того, в спецификации выдвигается еще ряд требований. Они приведены ниже:
-
Первые 3 байта тегов содержат строку
"TAG"
.
-
Следующие 30 символов содержат название MP3-дорожки в формате строки.
-
Следующие 30 символов содержат имя исполнителя в строковом формате.
-
Следующие 30 символов содержат название альбома в строковом формате.
-
Следующие 4 символа содержат год выпуска в строковом формате.
-
Следующие 30 символов содержат комментарии в строковом формате.
-
Следующий байт содержит код, определяющий жанр композиции.
-
Все текстовые данные кодируются в формат 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)
).