J'ai eu un problème de lecture d'un fichier mp3 stockés dans une ressource brute: lorsque le fichier de la première commence à jouer, il génère peut-être un quart de seconde de son, puis redémarre. (Je sais que c'est fondamentalement un double du problème décrit ici, mais la solution proposée n'a pas fonctionné pour moi.) J'ai essayé plusieurs choses et ont fait des progrès sur le problème, mais il n'est pas totalement fixe.
Voici comment je me suis mise à lire un fichier:
mPlayer.reset();
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(mAudioId);
if (afd == null) {
Toast.makeText(mOwner, "Could not load sound.",
Toast.LENGTH_LONG).show();
return;
}
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
afd.close();
mPlayer.prepare();
} catch (Exception e) {
Log.d(LOG_TAG, "Could not load sound.", e);
Toast.makeText(mOwner, "Could not load sound.", Toast.LENGTH_LONG)
.show();
}
Si je quitte l'activité (qui appelle mPlayer.release()
) et de revenir à elle (la création d'un nouveau lecteur multimédia), le bégaiement est généralement (mais pas toujours), les partis—à condition que je charge le même fichier audio. J'ai essayé un couple de choses que ne fait pas de différence:
- Charger le fichier audio comme un atout plutôt que comme une ressource.
- Créer le lecteur multimédia à l'aide de
MediaPlayer.create(getContext(), mAudioId)
et ignorer les appels à l'setDataSource(...)
etprepare()
.
Ensuite, j'ai remarqué que LogCat montre toujours cette ligne à environ le temps que la lecture commence:
DEBUG/AudioSink(37): bufferCount (4) is too small and increased to 12
Il m'a demande si le bégaiement est en raison de l'apparente rebuffering. Cela m'a conduit à essayer quelque chose d'autre:
- Après l'appel de
prepare()
, appelez -mPlayer.start()
et appeler immédiatementmPlayer.pause()
.
À mon agréable surprise, ça a eu un grand effet. Une grande partie de la bégaiement est parti, plus aucun son (que je peux entendre) est effectivement joué à ce point dans le processus.
Cependant, il bégaie toujours de temps en temps quand je l'appelle mPlayer.start()
pour de vrai. De Plus, cela semble être un énorme bidouille. Est-il possible de tuer ce problème complètement et proprement?
MODIFIER Plus d'infos; vous ne savez pas si liés. Si je l'appelle, pause()
au cours de la lecture, demander à une position antérieure, et appelez - start()
de nouveau, j'entends un peu court (~1/4 s) de sons supplémentaires, d'où il a été interrompu avant qu'il ne commence à jouer à la nouvelle position. Cela semble plus de mise en mémoire tampon des problèmes.
Aussi, le bégaiement (en pause et en mémoire tampon) les problèmes apparaissent sur les émulateurs de 1,6 à 3.0.