私はオーディオをGSM
bytearrayでサーバーソケットから取得しています。 GSMデコーダを使用してPCM
にデコードして再生しています。デコーダは、gsmデータを長さが33
のバイト配列で受け取り、長さが160
のint配列を返します。AudioTrackでPCMを再生すると、少し騒々しいです
まず、forループの中で私はGSMのbytearrayを33に切り詰めて、それをデコーダに渡しました。
int x = 33;
//p is the GSM bytearray
int len = p.length;
byte[] gsmChunk;
int[] pcmChunk;
for (int i = 0; i < len - x + 1; i += x) {
gsmChunk= Arrays.copyOfRange(p, i, i + x);
pcmChunk= gsmDecoder.decode(gsmChunk);
audioStream.addData(pcmChunk);
}
if (len % x != 0) {//end of array
gsmChunk= Arrays.copyOfRange(p, len - len % x, len);
pcmChunk= gsmDecoder.decode(gsmChunk);
audioStream.addData(pcmChunk);
}
writeToAudioTrack(audioStream);
そしてメソッドwriteToAudioTrackに渡されるPCMデータを含むaudioStream()へ:デコーダから返された値がPCMのint配列である、私は、カスタム入力ストリーム命名AudioStreamに各デコードチャンク(pcmChunk)を追加しました遊びます。
private void writeToAudioTrack(InputStream is) throws IOException {
int i;
byte[] s = new byte[BUFFER_SIZE]; //BUFFER_SIZE = 64
while ((i = is.read(s, 0, BUFFER_SIZE)) > -1) {
audioTrack.write(s, 0, i);
}
}
AudioTrackがすでに設定されている:
int sampleRate = 4200;
int minBufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
AudioStream.java:AudioStreamのリードで
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
public class AudioStream extends InputStream {
private ArrayList<Integer> pcm;
public AudioStream() {
pcm = new ArrayList<>();
}
public void addData(int data[]){
for(int i=0 ; i<data.length ; i++){
pcm.add(data[i]);
}
}
@Override
public int read() throws IOException {
if(pcm.size()>0) {
int r= pcm.remove(0);
return (r>>4) & 0xFF;
}
return -1;
}
}
戻り値()メソッド:
12-17 18:59:20.788 : 247
12-17 18:59:20.788 : 249
12-17 18:59:20.788 : 252
12-17 18:59:20.788 : 0
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 247
12-17 18:59:20.788 : 241
12-17 18:59:20.788 : 249
12-17 18:59:20.788 : 6
12-17 18:59:20.788 : 11
12-17 18:59:20.788 : 5
12-17 18:59:20.788 : 249
12-17 18:59:20.788 : 242
12-17 18:59:20.788 : 249
12-17 18:59:20.788 : 5
12-17 18:59:20.788 : 9
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 247
12-17 18:59:20.788 : 244
12-17 18:59:20.788 : 252
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 6
12-17 18:59:20.788 : 0
12-17 18:59:20.788 : 252
12-17 18:59:20.788 : 252
12-17 18:59:20.788 : 0
12-17 18:59:20.788 : 1
12-17 18:59:20.788 : 255
12-17 18:59:20.788 : 253
12-17 18:59:20.788 : 252
12-17 18:59:20.788 : 254
12-17 18:59:20.788 : 1
12-17 18:59:20.788 : 5
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 254
12-17 18:59:20.788 : 0
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 2
12-17 18:59:20.788 : 4
12-17 18:59:20.788 : 2
12-17 18:59:20.788 : 253
12-17 18:59:20.788 : 253
12-17 18:59:20.788 : 0
12-17 18:59:20.788 : 3
12-17 18:59:20.788 : 10
12-17 18:59:20.788 : 5
12-17 18:59:20.788 : 250
12-17 18:59:20.793 : 250
12-17 18:59:20.793 : 253
12-17 18:59:20.793 : 2
12-17 18:59:20.793 : 12
12-17 18:59:20.793 : 6
12-17 18:59:20.793 : 248
12-17 18:59:20.793 : 248
12-17 18:59:20.793 : 2
12-17 18:59:20.793 : 9
12-17 18:59:20.793 : 19
12-17 18:59:20.793 : 13
12-17 18:59:20.793 : 249
12-17 18:59:20.793 : 244
12-17 18:59:20.793 : 254
12-17 18:59:20.793 : 8
12-17 18:59:20.793 : 15
12-17 18:59:20.793 : 9
12-17 18:59:20.793 : 249
12-17 18:59:20.793 : 245
12-17 18:59:20.793 : 252
12-17 18:59:20.793 : 7
12-17 18:59:20.793 : 14
12-17 18:59:20.793 : 11
12-17 18:59:20.793 : 253
そしてr >> 4からr >> 8に変更すると結果はより騒々しいです:
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 252
12-17 19:21:36.043 : 255
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 0
12-17 19:21:36.043 : 253
12-17 19:21:36.043 : 251
12-17 19:21:36.043 : 255
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 2
12-17 19:21:36.043 : 2
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 253
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 0
12-17 19:21:36.043 : 2
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 255
12-17 19:21:36.043 : 253
12-17 19:21:36.043 : 251
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 2
12-17 19:21:36.043 : 4
12-17 19:21:36.043 : 1
12-17 19:21:36.043 : 254
12-17 19:21:36.043 : 250
12-17 19:21:36.043 : 251
12-17 19:21:36.043 : 0
12-17 19:21:36.043 : 4
12-17 19:21:36.043 : 4
12-17 19:21:36.043 : 0
12-17 19:21:36.043 : 252
12-17 19:21:36.043 : 251
12-17 19:21:36.043 : 255
12-17 19:21:36.043 : 4
12-17 19:21:36.043 : 4
12-17 19:21:36.043 : 0
12-17 19:21:36.048 : 251
12-17 19:21:36.048 : 250
12-17 19:21:36.048 : 255
12-17 19:21:36.048 : 4
12-17 19:21:36.048 : 5
12-17 19:21:36.048 : 1
12-17 19:21:36.048 : 251
12-17 19:21:36.048 : 249
12-17 19:21:36.048 : 253
12-17 19:21:36.048 : 3
12-17 19:21:36.048 : 5
12-17 19:21:36.048 : 2
12-17 19:21:36.048 : 253
12-17 19:21:36.048 : 251
12-17 19:21:36.048 : 253
12-17 19:21:36.048 : 2
12-17 19:21:36.048 : 3
12-17 19:21:36.048 : 1
12-17 19:21:36.048 : 253
12-17 19:21:36.048 : 251
12-17 19:21:36.048 : 254
12-17 19:21:36.048 : 2
12-17 19:21:36.048 : 3
12-17 19:21:36.048 : 1
12-17 19:21:36.048 : 1
12-17 19:21:36.048 : 0
12-17 19:21:36.048 : 254
12-17 19:21:36.048 : 254
12-17 19:21:36.048 : 255
12-17 19:21:36.048 : 255
私はそれがエンディアンの問題だと思います。