42 votes

Android: besoin d'enregistrer l'entrée micro

Est-il un moyen d'enregistrer l'entrée micro sur android alors qu'il est en cours de processus de lecture/d'aperçu en temps réel? J'ai essayé d'utiliser AudioRecord et AudioTrack pour ce faire, mais le problème est que mon appareil ne peut pas lire le fichier audio enregistré. En fait, tout android application de lecteur ne peut pas lire le fichier audio enregistré.

D'autre part, à l'Aide des Médias.Enregistreur pour enregistrer génère un bon fichier audio qui peuvent être lus par n'importe quel joueur de l'application. Mais le truc, c'est que je ne peux pas faire une preview/palyback lors de l'enregistrement de l'entrée mic en temps réel.

Tout commentaire est très apprécié! Merci à l'avance!

65voto

theisenp Points 4190

D'enregistrer et de lire des fichiers audio dans (presque) en temps réel, vous pouvez démarrer un thread séparé et d'utiliser un AudioRecord et AudioTrack.

Juste être prudent avec les commentaires. Si les haut-parleurs sont mis en place assez fort sur votre appareil, la rétroaction peut être assez méchant assez rapide.

/*
 * Thread to manage live recording/playback of voice input from the device's microphone.
 */
private class Audio extends Thread
{ 
    private boolean stopped = false;

    /**
     * Give the thread high priority so that it's not canceled unexpectedly, and start it
     */
    private Audio()
    { 
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        start();
    }

    @Override
    public void run()
    { 
        Log.i("Audio", "Running Audio Thread");
        AudioRecord recorder = null;
        AudioTrack track = null;
        short[][]   buffers  = new short[256][160];
        int ix = 0;

        /*
         * Initialize buffer to hold continuously recorded audio data, start recording, and start
         * playback.
         */
        try
        {
            int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
            recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
            track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
                    AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
            recorder.startRecording();
            track.play();
            /*
             * Loops until something outside of this thread stops it.
             * Reads the data from the recorder and writes it to the audio track for playback.
             */
            while(!stopped)
            { 
                Log.i("Map", "Writing new data to buffer");
                short[] buffer = buffers[ix++ % buffers.length];
                N = recorder.read(buffer,0,buffer.length);
                track.write(buffer, 0, buffer.length);
            }
        }
        catch(Throwable x)
        { 
            Log.w("Audio", "Error reading voice audio", x);
        }
        /*
         * Frees the thread's resources after the loop completes so that it can be run again
         */
        finally
        { 
            recorder.stop();
            recorder.release();
            track.stop();
            track.release();
        }
    }

    /**
     * Called from outside of the thread in order to stop the recording/playback loop
     */
    private void close()
    { 
         stopped = true;
    }

}

MODIFIER

L'audio n'est pas vraiment de l'enregistrement sur un fichier. L' AudioRecord objet code de l'audio en PCM 16 bits de données et les place dans un tampon. Puis l' AudioTrack objet lit les données de la mémoire tampon et le lit à travers les haut-parleurs. Il n'existe pas de fichier sur la carte SD que vous serez en mesure d'accéder à plus tard.

Vous ne pouvez pas lire et écrire un fichier de la carte SD en même temps pour obtenir de lecture/d'aperçu en temps réel, de sorte que vous avez à utiliser des tampons.

13voto

KitKat Points 311

L'autorisation suivante dans le manifeste est requise pour fonctionner correctement:

 <uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>
 

De plus, un tableau de tampons 2D n'est pas nécessaire. La logique du code est valide même avec un seul tampon, comme ceci:

 short[] buffer = new short[160];
while (!stopped) {
    //Log.i("Map", "Writing new data to buffer");
    int n = recorder.read(buffer, 0, buffer.length);
    track.write(buffer, 0, n);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X