аудиотрек издает шум после записи с помощью аудиокорда

#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();
   }
}