Pliki MP3 mogą zawierać znaczniki ID3, które są sekcjami na początku lub końcu pliku i zawierają metadane identyfikujące nagranie. Format znacznika ID3 ma różne wersje. Niniejszy przykład prezentuje sposób zapisu i odczytu z pliku MP3, który zawiera najprostszy format ID3 (wersja ID3 1.0) korzystający z „losowego dostępu do danych pliku”, co oznacza, że zapis i odczyt odbywa się z/do dowolnych miejsc w pliku.
Plik MP3, który zawiera znacznik ID3 w wersji 1, zawiera dane ID3 na końcu, w ostatnich 128 bajtach.
W przypadku uzyskiwania dostępu do pliku dla losowego odczytu/zapisu należy określić
FileMode.UPDATE
jako parametr
fileMode
metody
open()
lub
openAsync()
:
var file:File = File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3");
var fileStr:FileStream = new FileStream();
fileStr.open(file, FileMode.UPDATE);
Dzięki temu możliwe będzie odczytywanie i zapisywanie w pliku.
Po otwarciu pliku można ustawić wskaźnik
position
na pozycję przesuniętą o 128 bajtów przed końcem pliku:
fileStr.position = file.size - 128;
Poniższy kod ustawia właściwość
position
na tę pozycję w pliku, ponieważ format ID3 v1.0 określa, że dane znacznika ID3 są zapisane w ostatnich 128 bajtach pliku. Specyfikacja określa również następujące zależności:
-
Pierwsze 3 bajty znacznika zawierają ciąg znaków
"TAG"
.
-
Następne 30 znaków zawiera tytuł ścieżki MP3 w postaci ciągu znaków.
-
Następnie 30 znaków zawiera nazwę wykonawcy w postaci ciągu znaków.
-
Następnie 30 znaków zawiera nazwę albumu w postaci ciągu znaków.
-
Następnie 4 znaki zawierają rok w postaci ciągu znaków.
-
Następnie 30 znaków zawiera komentarz w postaci ciągu znaków.
-
Następny bajt zawiera kod wskazujący gatunek ścieżki.
-
Wszystkie dane tekstowe są w formacie ISO 8859-1.
Metoda
id3TagRead()
sprawdza dane po jej wczytaniu (po wywołaniu zdarzenia
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);
}
}
Możliwy jest również zapis do pliku z dostępem losowym. Na przykład: możliwe jest przeanalizowanie zmiennej
id3Title
w celu zapewnienia, że jej znaki są poprawnej wielkości (za pomocą metod klasy String), a następnie zapisanie zmodyfikowanego ciągu znaków (o nazwie
newTitle
) do nowego pliku, jak poniżej:
fileStr.position = file.length - 125; // 128 - 3
fileStr.writeMultiByte(newTitle, "iso-8859-1");
W celu zapewnienia zgodności ze standardem ID3 w wersji 1 długość ciągu znaków
newTitle
powinna wynosić 30 znaków, a koniec ciągu należy uzupełnić znakiem o kodzie 0 (
String.fromCharCode(0)
).