Bonjour,
Je souhaite faire du traitement de signal temps réel sur un fichier mp3.
J'avais commencé en décodant complêtement le MP3, puis en appliquant le traitement sur un stream audio envoyé à un objet AudioTrack.
Je me suis heurté à la difficulté des fichiers de trop grosse taille assez vite, et la mémoire disponible dans une application android étant assez petite, j'ai changé de stratégie. J'utilise maintenant un genre de ring-buffer. Sur un buffer, j'ai un certain nombre de portions (4 par exemple) d'une certaine taille (8192 octets par exemple).
Quand je souhaite lire une musique, je lance deux threads.
Le premier consiste à décoder ma musique, elle remplis toute les portions du buffer et se met en attente si la portion qu'il souhaite remplir est en train d'être lue par le second thread.
Le second thread attends qu'une première portion soit écrite pour commencer la lecture, il y a donc un décalage entre les deux threads. J'utilise libmpg123 porté sous android, le décodage mp3 est très efficace (un certain nombre de fois plus rapide qu'une lecture temps réel du fichier mp3), ainsi il n'y a jamais de temps mort.
Ma question concerne le buffer. Plus haut j'ai donné un exemple (4 portions de 8192 octets), cependant je l'ai choisi assez arbitrairement. Je souhaitais au moins 3 portions car avec deux portions le thread de décodage ne peut pas prendre "d'avance". Pour la taille d'une portion, c'est pareil, c'est assez arbitraire.
Est ce que quelqu'un pourrait m'indiquer (une bonne pratique) comment choisir cette taille de buffer (pour ne pas en donner "trop" ce qui serait inutile, et pour ne pas la sous-évaluer non plus) ?
Merci d'avance,
Al_th
Partager