61 votes

Exemple d'enregistrement audio Android

Je conçois une application Android et j'ai besoin d'implémenter une classe AudioRecord pour enregistrer le son de l'utilisateur. Après quelques recherches (qui n'ont pas fourni suffisamment d'informations) et quelques essais infructueux, je me demandais si quelqu'un pouvait m'aider en publiant un exemple (code) sur la façon de capturer un son de haute qualité en utilisant AudioRecord. Je vous en serais très reconnaissant. Je vous remercie

100voto

TechEnd Points 3846

Je vous présente ici un exemple de code qui permet d'enregistrer un son de bonne qualité à l'aide de l'application API AudioRecord .

Note : Si vous utilisez l'émulateur, la qualité du son ne sera pas très bonne car nous utilisons un taux d'échantillonnage de 8k qui n'est supporté que par l'émulateur. Dans l'appareil, utilisez un taux d'échantillonnage de 44.1k pour une meilleure qualité.

public class Audio_Record extends Activity {
    private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    private AudioRecord recorder = null;
    private Thread recordingThread = null;
    private boolean isRecording = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        setButtonHandlers();
        enableButtons(false);

        int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); 
    }

    private void setButtonHandlers() {
        ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
        ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
    }

    private void enableButton(int id, boolean isEnable) {
        ((Button) findViewById(id)).setEnabled(isEnable);
    }

    private void enableButtons(boolean isRecording) {
        enableButton(R.id.btnStart, !isRecording);
        enableButton(R.id.btnStop, isRecording);
    }

    int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
    int BytesPerElement = 2; // 2 bytes in 16bit format

    private void startRecording() {

        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);

        recorder.startRecording();
        isRecording = true;
        recordingThread = new Thread(new Runnable() {
            public void run() {
                writeAudioDataToFile();
            }
        }, "AudioRecorder Thread");
        recordingThread.start();
    }

        //convert short to byte
    private byte[] short2byte(short[] sData) {
        int shortArrsize = sData.length;
        byte[] bytes = new byte[shortArrsize * 2];
        for (int i = 0; i < shortArrsize; i++) {
            bytes[i * 2] = (byte) (sData[i] & 0x00FF);
            bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
            sData[i] = 0;
        }
        return bytes;

    }

    private void writeAudioDataToFile() {
        // Write the output audio in byte

        String filePath = "/sdcard/voice8K16bitmono.pcm";
        short sData[] = new short[BufferElements2Rec];

        FileOutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        while (isRecording) {
            // gets the voice output from microphone to byte format

            recorder.read(sData, 0, BufferElements2Rec);
            System.out.println("Short writing to file" + sData.toString());
            try {
                // // writes the data to file from buffer
                // // stores the voice buffer
                byte bData[] = short2byte(sData);
                os.write(bData, 0, BufferElements2Rec * BytesPerElement);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void stopRecording() {
        // stops the recording activity
        if (null != recorder) {
            isRecording = false;
            recorder.stop();
            recorder.release();
            recorder = null;
            recordingThread = null;
        }
    }

    private View.OnClickListener btnClick = new View.OnClickListener() {
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.btnStart: {
                enableButtons(true);
                startRecording();
                break;
            }
            case R.id.btnStop: {
                enableButtons(false);
                stopRecording();
                break;
            }
            }
        }
    };

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }
}

Pour plus de détails, essayez ceci BLOG SUR L'AUDIO-ENREGISTREMENT .

Happy Coding ! !

2 votes

Puis-je demander à quelle fréquence les données sont écrites dans le flux de sortie ? Et aussi pourquoi vous lisez en short, l'api ne propose pas de lire en bytes ?

1 votes

@JamesClark dépend de la taille que vous envoyez au serveur. Si vous envoyez des données audio de 1024 shorts, c'est-à-dire 2048 octets, vous devez les envoyer au serveur dans les 40 ms. Vous pouvez aussi lire en octets, cela ne fait pas de différence.

5 votes

Ajouté à cela : 44100 est le seul taux d'échantillonnage dont le support est garanti sur tous les appareils. developer.Android.com/reference/Android/media/AudioRecord.html

7voto

Joshua Witter Points 95

Voici une solution de bout en bout que j'ai mise en œuvre pour le streaming de l'audio du microphone Android vers un serveur pour la lecture : Problèmes de lecture d'un enregistrement audio Android vers un serveur via UDP

0 votes

Joli code ! Il a résolu mon prochain problème. +1

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