Frage

Ich habe derzeit ein Schleifenbackprogramm zum Testen von Audio auf Android -Geräten.

Es verwendet AudioreCord und Audiotrack, um PCM -Audio aus dem Mikrofon aufzunehmen und PCM -Audio aus dem Ohrhörer abzuspielen.

Hier ist der 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);
                           }  
          }
  }

Wie Sie bei der Erstellung des Audiotracks und des AudioreCords sehen können, wird die Codierung über den AudioFormat geliefert, dies ermöglicht jedoch nur 16 Bit oder 8 -Bit -PCM.

Ich habe jetzt meine eigene G711 -CODEC Encode (Short Lin [], int offset, byte ENC [], int Frames) und decode (Byte ENC [], Short Lin [], int Frames) Methoden, aber ich bin mir nicht sicher, wie Sie das Audio von AudioreCord und Audiotrack verwenden können.

Kann mir jemand helfen oder mich in die richtige Richtung zeigen?

War es hilfreich?

Lösung

Ändere dein arec.read(buffer, 0, buffersize) Rufen Sie an, um die zu verwenden Bytebuffer read() Methode von AudioRecord.

Sobald Sie Ihre Bytes in die haben ByteBuffer Objekt, dann können Sie einfach Ihren G711 -Implementierungsaufruf von Encodes einfügen und die verwenden ByteBuffer.asShortBuffer() Methode, um Ihre erfassten PCM -Daten in den Encoder zu bringen.

Das würde Ihre erste Frage lösen, ohne eine Bibliothek Dritter vorstellen zu müssen, um diese Arbeit für Sie zu erledigen. (Diese Antwort gilt für zukünftige Menschen, die auf die Frage stoßen).

Meine Frage ist warum?

In Ihrem obigen Code erfassen Sie PCM -Daten aus dem Mikrofon und schreiben sie direkt in den Puffer, um die Wiedergabe zu erhalten.

Es macht in Ihrer Implementierung keinen Sinn, dem Pfad von PCM -> G711 (Encodes) -> G711 (Decode) -> PCM zu folgen. Alles, was Sie tun, ist die unnötige Verarbeitung und Latenz einzuführen. Wenn Sie nun codierte Daten in eine Datei schreiben würden, anstatt zu versuchen, sie über das Ohrstück zu spielen, wäre dies eine andere Geschichte, aber Ihr aktueller Code scheint nicht wirklich nützlich zu sein, um die PCM -Daten zu codieren.

Die Einführung Ihres eigenen Codec hier würde nur im Zusammenhang mit dem Schreiben der komprimierten Sprachdaten in eine Datei (z.

Andere Tipps

Mir ist klar, dass dies ein ziemlich alter Beitrag ist. Konnten Sie Ihren eigenen G711 zum Arbeiten bringen? Mein eigener erster Gedanke wäre, eine LIB zu verwenden, die für den Kernel zusammengestellt und JNI verwendet wird, um ihn zu nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top