Android - Как добавить свой собственный аудиокодек в AudioreCord?

StackOverflow https://stackoverflow.com/questions/2416365

Вопрос

В настоящее время у меня есть программа обратного плана для тестирования звука на устройствах Android.

Он использует AudioRecord и AudiotRack для записи аудио PCM с микрофона и воспроизводить Audio PCM из наушника.

Вот код:

public class Record extends Thread
  {

          static final int bufferSize = 200000;
          final short[] buffer = new short[bufferSize];
          short[] readBuffer = new short[bufferSize];

          public void run() {  
            isRecording = true;
            android.os.Process.setThreadPriority
            (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

            int buffersize = AudioRecord.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

                           arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize);

                           atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize,
                                           AudioTrack.MODE_STREAM);


                           atrack.setPlaybackRate(11025);

                           byte[] buffer = new byte[buffersize];
                           arec.startRecording();
                           atrack.play();

                           while(isRecording) {

                                   arec.read(buffer, 0, buffersize);
                                   atrack.write(buffer, 0, buffer.length);
                           }  
          }
  }

Таким образом, как вы можете видеть при создании Audiotrack и Audiorecord, кодирование поставляется через AudioFormat, но это позволяет только 16 -битный или 8 -битный PCM.

Сейчас у меня есть собственная реализация кодека G711, и я хочу иметь возможность кодировать звук из микрофона и декодировать его в наушник, поэтому у меня есть Encode (Short Lin [], int смещение, Byte enc [], int рамы) а также Декодировать (Byte enc [], короткая линя [], int рамы) Методы, но я не уверен, как использовать их для кодирования и декодирования звука из AudioRecord и AudiotRack.

Кто -нибудь может помочь мне или указать мне в правильном направлении?

Это было полезно?

Решение

Изменить свой arec.read(buffer, 0, buffersize) Призовите, чтобы использовать Bytebuffer read() Метод от AudioRecord.

Как только у вас есть байты в ByteBuffer объект, тогда вы можете просто вставить свой вызов реализации G711 и использовать ByteBuffer.asShortBuffer() Метод для получения полученных данных PCM в кодировщик.

Это решило бы ваш первоначальный вопрос без необходимости ввести стороннюю библиотеку, чтобы выполнить эту работу за вас. (Этот ответ для будущих людей, которые сталкиваются с вопросом).

Мой вопрос в том, почему?

В вашем коде выше вы собираете данные PCM из микрофона и напишите их непосредственно в буфер для воспроизведения.

В вашей реализации не имеет никакого смысла следовать по пути PCM -> G711 (Encode) -> G711 (декод) -> PCM. Все, что вы делаете, - это вводить ненужную обработку и задержку. Теперь, если вы собирались написать кодированные данные в файл вместо того, чтобы пытаться воспроизводить их через ушную часть, которая была бы другой историей, но ваш текущий код не кажется полезным для кодирования данных PCM.

Представляем свой собственный кодек здесь будет иметь смысл только в контексте написания сжатых голосовых данных в файл (например, данные вызовов, например, сжатым образом) или отправка их по сети или что -то в этом роде.

Другие советы

Я понимаю, что это довольно старый пост. Вы смогли заставить свой собственный G711? Моей собственной первоначальной мыслью было бы использовать LIB, скомпилированную для ядра и использовать JNI, чтобы назвать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top