2017-04-24 1 views
6

Je joue un fichier mp3 diffusé depuis le réseau dans mon application, certains fichiers mp3 ont un comportement étrange: mediaPlayer.getCurrentPosition() est plus grand que mediaPlayer.getDuration() à la fin , pendant environ 3 secondes.mediaPlayer.getCurrentPosition()> mediaPlayer.getDuration() à la fin de la lecture du fichier mp3

Les fichiers mp3 sont codés CBR.

Pour quelle raison?

+0

lorsque vous diffusez à partir du réseau, peut être -1, reportez-vous ce le getDuration() https://developer.android.com/reference/android/media/MediaPlayer.html#getDuration() –

+0

@ArunShankar le 'getDuration()' n'est pas «-1» dans mon cas, c'est la valeur correcte – wong2

+0

@ wong2: Postez votre code et l'URL de cette chanson –

Répondre

5

Enfin résolu le problème en convertissant les fichiers mp3, c'est la commande que je utilise:

lame --mp3input -t -m s -b 128 --cbr input.mp3 output.mp3

2

Il existe plusieurs raisons pour lesquelles vous pouvez obtenir ce comportement. Tout d'abord, il semble que les gens obtiennent de meilleurs résultats en utilisant des fichiers mp3 exactement à 44100Hz, car apparemment la classe MediaPlayer prend cette valeur et redimensionne le temps en conséquence, rendant des valeurs étranges pour les fichiers n'utilisant pas cet échantillonnage.

Vous devez également vérifier le mode de vos canaux, et essayez d'utiliser Joint Stereo ou L/R Stereo forcé. Joint doit être la valeur par défaut, mais il se peut que vos fichiers aient déjà été mal encodés, donc cela vaut la peine d'essayer. Il est intéressant de noter que Forced L/R Stereo peut perdre de la qualité pour le même débit que Joint.

Il serait également utile de vérifier la sortie de soxi qui fait partie du paquet sox (vous pouvez également le faire avec ffmpeg), qui vous donnera le nombre de canaux, la fréquence d'échantillonnage, débit binaire et le nombre de canaux .

Vous pouvez également vérifier le contenu brut du fichier mp3 si vous avez effectué un traitement sur eux en utilisant une application pour la présence de contenu garbage xml qui aurait pu être inséré lors de l'exportation.

Si vous avez la possibilité de modifier les fichiers mp3 que vous diffusez (ce qui ressemble à ce que vous faites depuis que vous pouvez dire le débit), c'est ce que j'essayerais en premier. Si cela ressemble plus à un téléchargement d'utilisateur, vous devriez peut-être jeter un oeil à une autre solution, comme ExoPlayer qui a quelques milliers d'étoiles et de développement actif. Il enveloppe encore l'API MediaPlayer, mais ça vaut le coup d'essayer. Vous devez également considérer que cela pourrait être un problème de threading, où le joueur arrêterait de jouer, mais la minuterie continuerait réellement, vous donnant ce résultat où il est supérieur à la durée réelle de la chanson. 3 secondes semble un peu trop pour l'expliquer par là, mais c'est juste une idée.

+0

merci pour votre réponse de toute façon – wong2

+0

En utilisant l'option '-b' de' lame' vous avez changé l'encodage des fichiers qui était apparemment faux et l'a fixé à un valide. Ma réponse couvrait cette partie même si elle ne fournissait pas la commande exacte à taper car le problème pouvait être beaucoup d'autres choses et était laissé pour que vous compreniez (il y a aussi des restrictions de système pour le soft que vous pourriez utiliser etc.) ."Anyway" n'est pas vraiment le bon mot ici. –

+0

ce qui a vraiment résolu mon problème est l'option '-m s'. – wong2