Comment obtenir la durée de Flux Audio et continuer de streaming audio à partir de n'importe quel point
Description:
J'ai code suivant pour un lecteur Audio. Je peux continuer la lecture Audio à partir de n'importe quelle durée, en cliquant sur la Barre de Progression(entre 0-mediaplayer.getDuration()). Il fonctionne parfaitement pour la lecture Audio.
Problème dans la diffusion Audio en continu:
- Quand j'ai écouter un fichier Audio à partir d'un serveur internet (disons s3-seau)
il commence la diffusion en continu correctement. - Mais mediaPlayer.getDuration() et mediaPlayer.getCurrentPosition()
retour des valeurs erronées. Au début de streaming
mediaPlayer.getCurrentPosition() renvoie 5 heures. - Pour cette raison, je ne suis pas en mesure de continuer le streaming Audio à partir d'un
durée déterminée de Flux (de 0 à-Stream Durée).
Questions:
- Comment puis-je obtenir la durée d'un flux Audio
- Comment puis-je continuer le Streaming Audio à partir d'une durée spécifiée. Pour
exemple pour un fichier de 10 minutes, je veux commencer en streaming à partir de 6
minutes.
Code:
public class MyAudioPlayer extends Activity
implements OnClickListener{
MediaPlayer mediaPlayer = null;
private boolean isPaused=false;
private boolean isStop = true;
String filePath = null;
String productName = null;
ImageButton btnPlay = null;
ImageButton btnPause = null;
ImageButton btnReset = null;
ImageButton btnStop = null;
AudioManager audioManager = null;
SeekBar volControl = null;
SeekBar progressControl = null;
TextView progressText = null;
long durationInMillis = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ltd_audio_player);
volControl = (SeekBar)findViewById(R.id.player_volume);
progressControl = (SeekBar)findViewById(R.id.player_seekbar);
progressText = (TextView) findViewById(R.id.player_progress_text);
btnPlay = (ImageButton) findViewById(R.id.ic_player_play);
btnPause = (ImageButton) findViewById(R.id.ic_player_pause);
btnReset = (ImageButton) findViewById(R.id.ic_player_reset);
btnStop = (ImageButton) findViewById(R.id.ic_player_stop);
btnPlay.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnReset.setOnClickListener(this);
btnStop.setOnClickListener(this);
filePath = getIntent().getExtras().getString("localPath");
this.setPlayer();
this.resetAndStartPlayer();
}
@Override
protected void onResume() {
super.onResume();
isPaused=false;
progressText.postDelayed(onEverySecond, 1000);
}
@Override
protected void onPause() {
super.onPause();
isPaused=true;
}
private void setProgressControl() {
int maxVolume = mediaPlayer.getDuration();
int curVolume = mediaPlayer.getCurrentPosition();
progressControl.setMax(maxVolume);
progressControl.setProgress(curVolume);
progressControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
mediaPlayer.seekTo(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//TODO Auto-generated method stub
}
});
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.ic_player_play:
if(isStop==true){
try {
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}else{
mediaPlayer.start();
isStop = true;
}
break;
case R.id.ic_player_pause:
mediaPlayer.pause();
break;
case R.id.ic_player_reset:
mediaPlayer.seekTo(0);
break;
case R.id.ic_player_stop:
isStop = true;
progressControl.setProgress(0);
mediaPlayer.stop();
break;
}
}
private void resetAndStartPlayer(){
try {
if(filePath!=null){
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepareAsync();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void setPlayer(){
getWindow().setFormat(PixelFormat.UNKNOWN);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
progressControl.setSecondaryProgress((progressControl.getMax()/100)*percent);
}
});
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
isStop=false;
durationInMillis = mediaPlayer.getDuration();
MyAudioPlayer.this.setProgressControl();
}
});
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
@Override
protected void onDestroy() {
//TODO Auto-generated method stub
mediaPlayer.release();
super.onDestroy();
}
protected void setProgressText() {
durationInMillis = mediaPlayer.getDuration();
int curVolume = mediaPlayer.getCurrentPosition();
long HOUR = 60*60*1000;
if(progressText!=null){
if(durationInMillis>HOUR){
progressText.setText(String.format("%1$tH:%1$tM:%1$tS", new Date(curVolume))
+" /"+String.format("%1$tH:%1$tM:%1$tS", new Date(durationInMillis)));
}else{
progressText.setText(String.format("%1$tM:%1$tS", new Date(curVolume))
+" /"+String.format("%1$tM:%1$tS", new Date(durationInMillis)));
}
}
}
private Runnable onEverySecond=new Runnable() {
public void run() {
if (mediaPlayer!=null) {
progressControl.setProgress(mediaPlayer.getCurrentPosition());
MyAudioPlayer.this.setProgressText();
}
if (!isPaused) {
progressText.postDelayed(onEverySecond, 1000);
}
}
};
}
Heure est affichée au-dessus de la barre de progression.
Temps: 'Durée'/'Durée Totale'
je suis en train de travailler sur la création d'un mediaplayer et si vous avez résolu le problème vous m'envoyer le code? abuhamzah09 at gmail dot com
ce contrôle est le
il a été MyAudioPlayer au lieu de LTDAudioPlayer
ce contrôle est le
LTDAudioPlayer
?il a été MyAudioPlayer au lieu de LTDAudioPlayer
OriginalL'auteur Muhammad Nabeel Arif | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
Espoir qu'elle pourrait résoudre votre problème.
1) la Durée et le Progrès de Flux Audio
J'ai regardé dans votre code, vous avez une grosse erreur dans votre code pour calculer le temps. Vous créez une nouvelle Date(durationInMillis). Date ajoute votre locallity je.e GMT+XX heures, c'est pourquoi vous obtenez 5 heures dans le beginnging de streaming. Vous devez utiliser la méthode suivante pour calculer currentProgress/durée.
2) Frotter pour un Stream.
Lecteur multimédia permet de scrubbing audio stream. J'ai mis en œuvre dans un de mes projets, mais ça prend du temps. Il faut un certain temps pour reprendre le streaming audio à partir d'un autre emplacement.
OriginalL'auteur Talha Hafeez
Premier gros problème est votre ordre de l'initialisation:
vous appelez getDuration avant de vous appeler setDataSource dans resetAndStartPlayer.
Comment est-MediaPlayer censé connaître la durée sans source de données?
Voici comment le faire correctement:
appel MediaPlayer.setDataSource() de l'Activité.onCreate
exécuter AsyncTask, dans son doInBackground appel MediaPlayer.prepare(), cela va prendre un certain temps si il est le streaming de http, mais après avoir fini, le joueur devrait savoir à longueur de médias
Choses importantes:
Post exemple d'url de votre flux à distance.
OriginalL'auteur Pointer Null