Android - Как добавить свой аудио кодек в AudioRecord? - PullRequest
5 голосов
/ 10 марта 2010

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

Он использует AudioRecord и AudioTrack для записи звука PCM с микрофона и воспроизведения звука 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, и я хочу иметь возможность кодировать аудио с микрофона и декодировать его в EarPiece, поэтому у меня есть кодирование (short lin [], int offset, byte enc [], int frames) и decode (методы byte enc [], short lin [], int frames) , но я не уверен, как их использовать для кодирования и декодирования аудио из AudioRecord и AudioTrack.

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2013

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

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

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

У меня вопрос почему?

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

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

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

0 голосов
/ 18 сентября 2012

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

...