#android #queue #audiotrack #audiorecord
Вопрос:
когда я использовал подобную логику short[] -> ShortBuffer -> Queue
, это не имело значения и действовало точно
но тогда я изменяю структуру кода вот short[] -> Queue
так, иначе я использую верхнюю часть, аудиотрек создает шум.
я не знаю почему, и я думаю, что шум-это первые данные short[]
, которые поступают и повторяются.
вот мои некоторые коды. Я хочу услышать ваши советы 🙂
Класс аудиокорд
public void init(int sampleRate, int bufferSize) {
audioData = null;
shortBuffer = null;
record_bufferSize = bufferSize;
audioData = new short[record_bufferSize];
}
public void start(int source, int channel, int sampleRate, Queue queue) {
if(audioRecord == null) {
audioRecord = new android.media.AudioRecord(
source,
sampleRate,
channel,
AudioFormat.ENCODING_PCM_16BIT,
audioData.length
);
}
audioRecord.startRecording();
recordThread = new Thread(new Runnable() {
@Override
public void run() {
len_audioData = 0;
while(MainActivity.isRecording) {
len_audioData = audioRecord.read(audioData, 0, record_bufferSize);
queue.enqueue(audioData);
dataMax = 0;
for (int i = 0; i < audioData.length; i ) {
if(Math.abs(audioData[i]) >= dataMax) {
dataMax = Math.abs(audioData[i]);
}
}
}
}
});
recordThread.start();
}
public void stop() {
if (audioRecord != null) {
if (audioRecord.getState() != android.media.AudioRecord.RECORDSTATE_STOPPED) {
try {
audioRecord.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
}
audioRecord.release();
audioRecord = null;
recordThread = null;
}
}
}
Класс аудиотрека
public void init(int sampleRate, int bufferSize) {
audioData = new short[bufferSize];
len_audioData = bufferSize;
}
public void play(int type, int channel, int sampleRate, Queue queue) {
if (audioTrack == null) {
audioTrack = new android.media.AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(type)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(sampleRate)
.setChannelMask(channel)
.build())
.setBufferSizeInBytes(len_audioData)
.build();
}
playThread = new Thread(new Runnable() {
@Override
public void run() {
audioTrack.play();
while (!queue.isEmpty()) {
audioData = queue.dequeue();
audioTrack.write(audioData, 0, len_audioData);
dataMax = 0;
for (int i = 0; i < audioData.length; i ) {
if (Math.abs(audioData[i]) >= dataMax) {
dataMax = Math.abs(audioData[i]);
}
}
}
MainActivity.autoStop = true;
}
});
public void stop() {
if (audioTrack != null amp;amp; audioTrack.getState() != android.media.AudioTrack.STATE_UNINITIALIZED) {
if (audioTrack.getPlayState() != android.media.AudioTrack.PLAYSTATE_STOPPED) {
try {
audioTrack.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
}
audioTrack.release();
audioTrack = null;
playThread = null;
}
}
}
Queue class
public class Queue {
java.util.Queue<short[]> queue;
public Queue() {
queue = null;
queue = new LinkedList<short[]>();
}
public boolean enqueue(short[] data) {
return queue.add(data);
}
public short[] dequeue() {
return queue.poll();
}
public boolean isEmpty() {
return queue.isEmpty();
}
}