2012-01-23 5 views
9

Descrizione:Come ottenere la durata del flusso audio e continuare lo streaming audio da qualsiasi punto

Ho seguente codice per un lettore audio. Posso continuare la riproduzione audio da qualsiasi durata facendo clic su Progress Bar (tra 0-to-mediaplayer.getDuration()). Funziona perfettamente per la riproduzione audio.

problema in Audio Streaming:

  • Quando la riproduzione in streaming di un file audio da un server internet (ad esempio s3-benna) si inizia lo streaming in modo corretto.
  • Ma mediaPlayer.getDuration() e mediaPlayer.getCurrentPosition() restituiscono valori errati. All'inizio dello streaming mediaPlayer.getCurrentPosition() restituisce 5 ore.
  • A causa di ciò, non è possibile continuare lo streaming audio da una durata specificata di Stream (durata da 0 a stream).

Domande:

  1. Come posso ottenere la durata di un flusso audio
  2. Come posso continuare a streaming audio da una durata specificata. Per l'esempio per un file della durata di 10 minuti, voglio iniziare lo streaming dal 6 ° minuto.

Codice:

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); 
      } 
     } 
    }; 
} 

tempo viene visualizzato sopra la barra di avanzamento.

Tempo: 'Durata attuale'/'Durata totale'

enter image description here

+0

@Arif: sto lavorando alla creazione di un mediaplayer e se hai risolto il problema mi invierai il codice via email? abuhamzah09 a gmail dot com –

+0

quale controllo è il 'LTDAudioPlayer'? –

+0

@AbuHamzah era MyAudioPlayer invece di LTDAudioPlayer –

risposta

3

primo grande problema è il vostro ordine di inizializzazione: si chiama getDuration prima che realmente chiamare setDataSource in resetAndStartPlayer. In che modo MediaPlayer dovrebbe conoscere la durata senza origine dati?

Ecco come fare correttamente:

  1. chiamata MediaPlayer.setDataSource() in Activity.onCreate

  2. eseguire AsyncTask, nella sua doInBackground chiamare MediaPlayer.prepare(), questo richiederà un mentre se lo streaming è in streaming da http, ma al termine, il lettore deve conoscere la lunghezza del supporto

  3. nella chiamata AsyncTask.onPostExecute MediaPlayer.getDuration(), che dovrebbe riuscire se lo stream è stato aperto correttamente; in seguito è possibile chiamare MediaPlayer.start()

cose importanti:

  • getDuration opere dopo preparisi stato chiamato
  • preparare può richiedere più tempo, e dovrebbe essere chiamato in altro thread
  • si può anche utilizzare prepareAsync ed evitare AsyncTask, quindi useresti callback setOnPreparedListener per chiamare getDuration
+1

Apprezzo il tuo interesse nel risolvere il problema. Ho modificato il codice per getDuration dopo che mediaPlayer è stato preparato in mediaPlayer.onPrepared() ... Come ho già detto che il problema era nello streaming audio, è ancora lì. Quando trasmetto l'audio ancora più piccolo. GetDuration mi restituisce 6 ore e qualcosa. Ma quando suono l'audio dalla sdcard lo stesso codice restituisce la durata corretta. –

+0

Pubblica l'url del tuo stream remoto. –

13

Spero che possa risolvere il tuo problema.

1) Durata e progresso di Audio Stream

ho guardato nel codice, si dispone di un grave errore nel codice per calcolare il tempo. Si crea una nuova data (durationInMillis). La data aggiunge la tua posizione alle GMT + XX ore, è per questo che stai ricevendo 5 ore all'inizio dello streaming. È necessario utilizzare il seguente metodo per calcolare il valore corrente/durata.

protected void setProgressText() { 

    final int HOUR = 60*60*1000; 
    final int MINUTE = 60*1000; 
    final int SECOND = 1000; 

    int durationInMillis = mediaPlayer.getDuration(); 
    int curVolume = mediaPlayer.getCurrentPosition(); 

    int durationHour = durationInMillis/HOUR; 
    int durationMint = (durationInMillis%HOUR)/MINUTE; 
    int durationSec = (durationInMillis%MINUTE)/SECOND; 

    int currentHour = curVolume/HOUR; 
    int currentMint = (curVolume%HOUR)/MINUTE; 
    int currentSec = (curVolume%MINUTE)/SECOND; 

    if(durationHour>0){ 
     System.out.println(" 1 = "+String.format("%02d:%02d:%02d/%02d:%02d:%02d", 
       currentHour,currentMint,currentSec, durationHour,durationMint,durationSec));    
    }else{ 
     System.out.println(" 1 = "+String.format("%02d:%02d/%02d:%02d", 
       currentMint,currentSec, durationMint,durationSec)); 
    } 
} 

2) Scrubbing per Stream.

MediaPlayer consente lo scrubbing del flusso audio. L'ho implementato in uno dei miei progetti, ma ci vuole del tempo. Ci vuole del tempo per riprendere lo streaming audio da un'altra posizione.

+1

Grazie Talha. Non ho notato questo piccolo punto. – Arslan