Pergunta

Estou trabalhando em um aplicativo que processa dados de áudio. Estou usando Java (adicionei Mp3spi, Jlayer e Tritonus). Estou extraindo os dados de áudio de um arquivo .wav para uma matriz de bytes. As amostras de dados de áudio com as quais estou trabalhando são de 16 bits estéreo.

De acordo com o que li o formato para uma amostra é:

AABBCCDD

onde o AABB representa o canal esquerdo e o canal Rigth CCDD (2 bytes para cada canal). Eu precisaria converter esta amostra em um tipo de valor duplo. Estou lendo sobre o formato de dados. Java usa os arquivos .wav endian Big Endian usam Little Endian. Eu estou um pouco confuso. Você poderia me ajudar com o processo de conversão? Obrigado a todos

Foi útil?

Solução

AVISO: Inteiros e bytes são assinados. Talvez você precise mascarar os bytes baixos ao empacotá -los:

for (int i =0; i < length; i += 4) {
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));

    ... your code here ...

}

Outras dicas

Quando você usa o bytebuffer (java.nio.byteBuffer) você pode usar a ordem do método;

ordem

Public final ByteBuffer Order (Byteorder Bo)

Modifies this buffer's byte order.

Parameters:
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
    This buffer

Depois disso, você pode obter os valores mencionados acima;

getchar () getShort () getInt () getfloat () getDouble ()

Que ótima linguagem é Java ;-)

Little Endian significa que os dados estão no formulário BBAA e DDCC. Você apenas trocaria por aí.

Desde o início do quadro:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

onde eu é o seu índice da sua amostra.

Eu pessoalmente procuraria uma biblioteca que faça a troca Endian por você. Cada formato de arquivo de áudio tem suposições sobre a endianness para você e acertar isso é complicado para todas as profundidades/tipos de dados de bits Support:

  • 8bit - uint8
  • 16bit - Int16
  • 24bit - int32
  • 32bit - Int32 como flutuação
  • 32 bits - flutuação
  • 64bit - duplo

Se você deseja suportar os tipos mais comuns de arquivos de onda, precisará de conversões Endian para todos esses tipos de dados.

Eu olha para Byteswapper, que lhe dará bytes para a maioria dos tipos listados acima.

É uma pena que o Java não tenha um campo de Endianness em suas aulas de IO de arquivo. Ser capaz de simplesmente abrir um arquivo que edianness é grande ou pouco é uma solução muito mais fácil para esse problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top