Android AudioRecord défaut lors de l'appel de la startRecording() la méthode

Je suis en train d'enregistrer de l'audio dans android et de le stocker dans un tableau d'octets, et pour que j'utilise Android AudioRecord intégré dans la classe.

J'ai déjà utilisé cette classe avant, et tout était bon, mais pour une raison quelconque, il semble que le AudioRecord ne fonctionne plus.

Le problème est que le AudioRecord est initialisé et n'indique aucune erreur, mais quand il est temps d'enregistrer quelque chose, en appelant son " startRecording() la méthode, quelque chose ne marche pas et je n'ai même pas une bonne raison.

C'est TOUS la sortie de Logcat après l'appel de cette méthode:

01-18 18:54:49.545  11303-11338/com.mypackage E/android.media.AudioRecord MediaRecorder prepare   CallingPid =  11303  Callinguid=  10128

01-18 18:54:49.545  11303-11338/com.mypackage E/android.media.AudioRecord java.lang.Throwable
        at android.media.AudioRecord.startRecording(AudioRecord.java:631)
        at mypackage.AudioRecorder.record(AudioRecorder.java:179)

Bien sûr, aucun son n'est enregistré après que, pour ceux qui se demandent si c'est juste une erreur interne du message.

C'est le code pour initialiser la AudioRecord classe:

int bufferSize = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE, RECORDER_CHANNEL, RECORDER_AUDIO_ENCODING);

        if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize > 0)
        {
            //check if we can instantiate and have a success
            AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, AUDIO_SAMPLE_RATE, RECORDER_CHANNEL,
                    RECORDER_AUDIO_ENCODING, bufferSize);

            if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
            {
                m_Recorder = recorder;
                m_RecordingThread = Executors.newSingleThreadExecutor();
                m_IsInitialized = true;
                return;
            }
        }

Lorsque les constantes utilisées sont:

/**
 * Recorded audio's sample rate.
 */
private static final int AUDIO_SAMPLE_RATE = 44100;

/**
 * Recorded audio's channel.
 */
private static final int RECORDER_CHANNEL = AudioFormat.CHANNEL_IN_MONO;

/**
 * Recorded audio's encoding.
 */
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

L'erreur se passe ici:

if (m_Recorder != null)
            m_Recorder.startRecording();

Alors, après avoir vu cela se produire une couple de fois, j'ai décidé d'aller plus loin et d'essayer de déboguer, va aussi profond que je peux, à la source de l'erreur dans le AudioRecord classe elle-même, à l'aide de Jetbrain de decompiler.

Pour quelque étrange raison, dès que l'application sur le point d'arrêt situé à la source de l'erreur, la prochaine étape-la plus ne pouvait pas être terminé, comme le AudioRecord est tombé en panne encore une fois, avec le même message d'erreur.

La prochaine étape pour moi a été la création d'un exemple de projet juste pour tester AudioRecord de la fonctionnalité, mais cette fois, j'ai ajouté un AudioTrack ainsi, qui sortira tous mes enregistrements instantanément (une sorte de bouclage), dans le cas où le AudioRecord classe parvient à enregistrer quelque chose, avec ou sans l'erreur.

Et la magie s'est passé - L'application fonctionne, AudioRecord est en cours d'enregistrement, et AudioTrack est en cours de lecture.

Il semblait vraiment étrange que la classe AudioTrack soudain résolu tous mes problèmes, donc je l'ai enlevé de mon code et essayé de lancer l'application une fois encore.

Cette fois, le AudioRecord travaillé sans tous les problèmes, et même si je ne pouvais pas entendre sa sortie, je peux vous assurer qu'il a été l'enregistrement.

Avec un peu de soulagement, j'ai pensé à mon moi-même que j'ai enfin surmonté ce problème, et je suis prêt à aller de l'avant, j'ai donc ajouté un peu plus de code pour coder et décoder les données audio enregistrées.

Pour entendre une sortie, j'ai rentré le code à l'aide de la classe AudioTrack, et a couru de l'application.

Vous voulez entendre un drôle de chose? L'application s'est écrasé avec la même erreur, NOUVEAU.

Maintenant, théoriquement, le problème pourrait être de ne pas relâcher la AudioRecord exemple lorsque le fait de l'utiliser, mais j'ai couvert que trop depuis le début.

J'ai essayé de chercher un peu partout sur internet pour trouver une solution, mais il semble comme si personne n'a encore rencontré un problème de ce genre auparavant.

Aussi, je tiens à souligner que j'ai essayé de réinitialiser mon appareil, la BAD plugin, et la reconstruction de tous les projets.

Je suis à l'aide d'un Meizu MX5 téléphone, avec Android Lollipop(API 21).

  • Nous montrer un peu de code...
  • Merci de noter que j'ai ajouté les parties pertinentes du code maintenant.
  • Veuillez ajouter un peu plus de code. Je pense que vous devez déclarer et définir AudioRecord objet dans if {} et, partant, sa portée est limitée à celle de {} seulement. et aussi je ne suis pas en mesure de voir m_Recorder.startRecording(); est situé dans le bloc. Une chose est s'il vous Plaît poster plein de trace de pile, c'est à cause de AudioRecord pas initialisé ou IllegalStateException ?
InformationsquelleAutor Timor Gruber | 2016-01-18