Exemplo: Leitura e gravação de dados com acesso aleatório

Adobe AIR 1.0 e posterior

Arquivos MP3 podem incluir marcas ID3, que são seções no início ou no final do arquivo, contendo metadados que identificam a gravação. O próprio formato de marca ID3 tem revisões diferentes. Este exemplo descreve como fazer a leitura e a gravação de um arquivo MP3 que contém o formato ID3 mais simples (ID3 versão 1.0) usando o "acesso aleatório a dados do arquivo", o que significa que ele lê a partir de e grava em locais arbitrários no arquivo.

O arquivo MP3 que contém uma marca ID3 versão 1 inclui dados ID3 no final do arquivo, nos últimos 128 bytes.

Ao acessar um arquivo para acesso de leitura e gravação aleatório, é importante especificar FileMode.UPDATE como o parâmetro fileMode do método open() ou openAsync() :

var file:File = File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3"); 
var fileStr:FileStream = new FileStream(); 
fileStr.open(file, FileMode.UPDATE);  

Isso permite ler e gravar no arquivo.

Ao abrir o arquivo, você pode definir o ponteiro position para a posição de 128 bytes antes do final do arquivo:

fileStr.position = file.size - 128;

Esse código define a propriedade position para esse local no arquivo, porque o formato ID3 v1.0 especifica que os dados da marca ID3 são armazenados nos últimos 128 bytes do arquivo. A especificação também diz o seguinte:

  • Os primeiros 3 bytes da marca contêm a sequência "TAG" .

  • Os 30 caracteres seguintes contêm o título da trilha MP3, como uma sequência.

  • Os 30 caracteres seguintes contêm o nome do artista, como uma sequência.

  • Os 30 caracteres seguintes contêm o nome do álbum, como uma sequência.

  • Os 4 caracteres seguintes contêm o ano, como uma sequência.

  • Os 30 caracteres seguintes contêm o comentário, como uma sequência.

  • O byte seguinte contém um código indicando o gênero da trilha.

  • Todos os dados de texto estão no formato ISO 8859-1.

O método id3TagRead() verifica os dados após serem lidos (no evento 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); 
    } 
} 

Você também pode realizar uma gravação com acesso aleatório no arquivo. Por exemplo, você pode analisar a variável id3Title para assegurar que ela esteja com as maiúsculas e minúsculas corretas (usando métodos da classe String) e, em seguida, fazer a gravação de uma sequência modificada, chamada newTitle , no arquivo, como no seguinte:

fileStr.position = file.length - 125;    // 128 - 3 
fileStr.writeMultiByte(newTitle, "iso-8859-1");

Para corresponder à versão 1 padrão do ID3, o tamanho da sequência newTitle deve ter 30 caracteres, preenchidos no final com o caractere de código 0 ( String.fromCharCode(0) ).