Question

J'ai actuellement un programme Back Back pour tester l'audio sur les appareils Android.

Il utilise AudioCord et AudioTrack pour enregistrer l'audio PCM à partir du micro et lire audio PCM de l'oreillette.

Voici le code:

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

Ainsi, comme vous pouvez le voir dans la création de l'audiotrack et de l'audiocord, le codage est fourni via l'AudioOFORMAT, mais cela ne permet que un PCM 16 bits ou 8 bits.

J'ai ma propre implémentation du codec G711 maintenant et je veux pouvoir coder l'audio à partir du micro et le décoder en entrant dans l'oreillette, donc j'ai Encoder (Short Lin [], int offset, octet enc [], intrames int) et Decode (octet enc [], Short Lin [], Int Frames) Méthodes mais je ne suis pas sûr de les utiliser pour encoder et décoder l'audio de l'AudioreCord et AudioRack.

Quelqu'un peut-il m'aider ou me diriger dans la bonne direction?

Était-ce utile?

La solution

Change ton arec.read(buffer, 0, buffersize) appel pour utiliser le Bytebuffer read() méthode de AudioRecord.

Une fois que vous avez vos octets dans le ByteBuffer objet, alors vous pouvez simplement insérer votre appel d'implémentation G711 de l'encoder et utiliser le ByteBuffer.asShortBuffer() Méthode pour intégrer vos données PCM capturées dans le codeur.

Cela résoudrait votre question initiale sans avoir à introduire une bibliothèque tierce pour faire ce travail pour vous. (Cette réponse concerne les futures personnes qui répondent à la question).

Ma question est pourquoi?

Dans votre code ci-dessus, vous capturez les données PCM du microphone et écrivez-la directement dans le tampon pour la lecture.

Il n'a aucun sens dans votre implémentation de suivre le chemin de la voie de PCM -> G711 (Encode) -> G711 (Decode) -> PCM. Tout ce que vous faites est d'introduire un traitement et une latence inutiles. Maintenant, si vous deviez écrire des données encodées dans un fichier au lieu d'essayer de la lire via l'oreille, ce serait une autre histoire, mais votre code actuel ne semble pas vraiment utile pour coder les données PCM.

L'introduction de votre propre codec ici n'aurait du sens que dans le contexte de l'écriture des données vocales compressées dans un fichier (enregistrer les données d'appel par exemple de manière compressée) ou de les envoyer sur le réseau ou quelque chose.

Autres conseils

Je me rends compte que c'est un très vieux post. Avez-vous pu faire fonctionner votre propre G711? Ma propre pensée initiale serait d'utiliser une lib compilée pour le noyau et d'utiliser JNI pour l'appeler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top