2015-06-02 2 views
0

Я пишу приложение для Android, которое отправляет записанный звук на сервер, и мне нужно адаптировать его формат к требуемому. Мне сказали, что аудиоформат сервера задается конструктором класса javax.sound.sampled.AudioFormat со следующими параметрами: AudioFormat (44100, 8, 1, true, true), что означает, что требуемый звук должен иметь частоту дискретизации 44100, 8-разрядный размер выборки, моно-канал, подписать и закодировать с помощью байта большого байта. Мой вопрос: как я могу преобразовать записанный звук в тот, который мне нужен? Я думаю, что самая большая проблема может быть ограничение 16b Android, насколько маленький размер выборки обеспокоенСовместимость Android AudioRecord с Java SE AudioFormat

ответ

0

Вы можете записывать 44100 8bit непосредственно AudioRecord, указав формат в конструкторе

int bufferSize = Math.max(
    AudioRecord.getMinBufferSize(44100, 
     AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT), 
    ENOUGH_SIZE_FOR_BUFFER); 
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
    44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize); 

затем извлекать данные из audioRecord, используя read(byte[], int, int) метод:

byte[] myBuf = new byte[bufferSize]; 
audioRecord.startRecording(); 
while (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { 
    int l = audioRecord.read(myBuf, 0, myBuf.length); 
    if (l > 0) { 
     // process data 
    } 
} 

в этом случае данные в буфере будет, как вы хотите: 8 бит, моно, 44100.
Но некоторые деви ces не поддерживает 8-битную запись. В этом случае вы можете записать данные в 16-битном формате и получить его с помощью метода read(short[], int, int). В этом случае вам необходимо ресэмплировать данные по своему усмотрению:

short[] recordBuf = new short[bufferSize]; 
byte[] myBuf = new byte[bufferSize]; 

... 

    int l = audioRecord.read(recordBuf, 0, recordBuf.length); 
    if (l > 0) { 
     for (int i = 0; i < l; i++) { 
      myBuf[i] = (byte)(recordBuffer[I] >> 8); 
     } 
     // process data 
    } 

Используя тот же подход, вы можете ресэмплировать любой формат PCM в любой другой формат;

Смежные вопросы