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 dansif {}
et, partant, sa portée est limitée à celle de {} seulement. et aussi je ne suis pas en mesure de voirm_Recorder.startRecording();
est situé dans le bloc. Une chose est s'il vous Plaît poster plein de trace de pile, c'est à cause deAudioRecord
pas initialisé ouIllegalStateException
?
Vous devez vous connecter pour publier un commentaire.
Bien, j'ai résolu le problème, ou au moins d'une partie, à l'origine pour fonctionner maintenant.
Le truc, c'est que j'ai essayé de lire des octets de plus que la taille de mon avant-tampon alloué, à l'appel de la méthode read() de la AudioRecord classe.
Même si elle ne résout pas le problème principal de ce post, qui est le message d'erreur étrange et de l'exception non interceptée, il fait le AudioRecord fonctionne parfaitement, donc, pour moi, ce fil peut être vu comme réponse et fermé!
Code complet
et ajouter la permission