2014-07-10 76 views
0

我使用Android Audio Record類錄製音頻。錄音是PCM 16bit所以(我聽說)最好讓音頻錄製將數據寫入短陣列。然而,對於我想要做的事情,我需要將Short數組轉換爲一個字節數組。我嘗試了一些方法,但是它們都以不同的方式降低了音頻的質量。將短陣列從音頻記錄轉換爲字節數組而不降低音頻質量?

我弗里斯特嘗試:

byte[] bytes2 = new byte[shortsA.length * 2]; 
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortsA); 

但結果是非常安靜,不連貫的音頻。

我嘗試第二種方法是:

byte[] MyShortToByte(short[] buffer) { 
int N = buffer.length; 
float f[] = new float[N]; 
float min = 0.0f; 
float max = 0.0f; 
for (int i=0; i<N; i++) { 
    f[i] = (float)(buffer[i]); 
    if (f[i] > max) max = f[i]; 
    if (f[i] < min) min = f[i]; 
    } 
float scaling = 1.0f+(max-min)/256.0f; // +1 ensures we stay within range and guarantee no divide by zero if sequence is pure silence ... 

ByteBuffer byteBuf = ByteBuffer.allocate(N); 
for (int i=0; i<N; i++) { 
    byte b = (byte)(f[i]/scaling); /*convert to byte. */ 
    byteBuf.put(b); 
} 
return byteBuf.array(); 
} 

https://stackoverflow.com/a/15188181/902631但結果被加速和高音調音頻,像原來的音頻是快進以2x速度。但是音量比第一個更高,而且不是波濤洶涌。

是否有我可以使用的任何外部庫或任何音頻專用轉換方法,不會降低音頻質量?

任何幫助,將不勝感激!

回答

0

首先,你不能在不降低質量的情況下改變音頻的位深度。我真的不確定你如何進行縮放。查看以下指示性代碼,以瞭解位縮減如何進行完成。

float byteNorm = Absolute(Byte.MaxValue); //255 
float shortNorm = Absolute(Short.MinValue); //32768 

for (int audioSample = 0; audioSample < numShorts; audioSample++) 
{ 
    myActualSample = (float)myShorts[audioSample]/shortNorm; 
    myBytes[audioSample] = (byte)(mySample * byteNorm); 
} 
1

你爲什麼不試試這個,雖然讀取AudioRecord對象數據讀入byte []數組,而不是短陣

audioRecord.startRecording(); 
byte[] buffer = new byte[_bufferSize]; //recorded data is stored in this byte array 
audioRecord.read(buffer, 0, _bufferSize);