2012-01-23 8 views
9

Descripción:Como llegar duración de la corriente de audio y continuar la transmisión de audio desde cualquier punto

He siguiente código para un reproductor de audio. Puedo continuar la reproducción de audio de cualquier duración haciendo clic en la barra de progreso (entre 0-a-mediaplayer.getDuration()). Está funcionando perfectamente para la reproducción de audio.

Problema de Audio Streaming:

  • Cuando reproduzco un archivo de audio de un servidor de Internet (por ejemplo s3-cubo) comienza a transmisión correctamente.
  • Pero mediaPlayer.getDuration() y mediaPlayer.getCurrentPosition() devuelven valores erróneos. Al comienzo de la transmisión mediaPlayer.getCurrentPosition() devuelve 5 horas.
  • Debido a esto, no puedo continuar con la transmisión de audio de duración especificada de Stream (duración de 0 a transmisión).

Preguntas:

  1. ¿Cómo puedo obtener la duración de un flujo de audio
  2. ¿Cómo puedo continuar streaming de audio de una duración especificada. Para el ejemplo para un archivo de 10 minutos de duración, deseo comenzar a transmitir desde el 6º minuto.

Código:

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

hora se muestra por encima de la barra de progreso.

Tiempo: 'Actual duración'/'Duración total'

enter image description here

+0

@Arif: estoy trabajando en la creación de un reproductor multimedia y si resuelve el problema, ¿me enviará el código por correo electrónico? abuhamzah09 en gmail punto com –

+0

¿qué control tiene el 'LTDAudioPlayer'? –

+0

@AbuHamzah era MyAudioPlayer en lugar de LTDAudioPlayer –

Respuesta

3

primer gran problema es el orden de inicialización: se llama getDuration antes de que realmente llama setDataSource en resetAndStartPlayer. ¿Cómo se supone que MediaPlayer conoce la duración sin fuente de datos?

Aquí es cómo hacerlo correctamente:

  1. MediaPlayer.setDataSource llamada() en Activity.onCreate

  2. ejecutar AsyncTask, en su doInBackground llamar MediaPlayer.prepare(), esto tomará una mientras que si está transmitiendo desde http, pero después de que termine, el jugador debe saber la longitud de los medios

  3. en la llamada AsyncTask.onPostExecute MediaPlayer.getDuration(), que debería tener éxito si la transmisión se abrió correctamente; luego puede llamar a MediaPlayer.start()

cosas importantes:

  • getDuration funciona después prepárese fue llamado
  • preparación puede tardar más tiempo, y deberían ser llamados en otro hilo
  • puede también utilizar prepareAsync y evitar AsyncTask, entonces usaría la devolución de llamada setOnPreparedListener para llamar a getDuration
+1

Agradezco su interés en resolver el problema. He modificado el código para getDuration después de que se preparó mediaPlayer en mediaPlayer.onPrepared() ... Como mencioné que el problema estaba en la transmisión de audio, todavía está allí. Cuando transmito el audio aún más pequeño. GetDuration me devuelve 6 horas y algo. Pero cuando reproduzco audio desde una tarjeta SD, el mismo código devuelve la duración correcta. –

+0

Publicar URL de ejemplo de su transmisión remota. –

13

Espero que pueda resolver su problema.

1) Duración y el Progreso de la corriente de audio

He mirado en su código, que tienen un gran error en el código para calcular el tiempo. Usted crea una nueva Fecha (durationInMillis). La fecha agrega tu ubicación, es decir GMT + XX horas, es por eso que tienes 5 horas en el inicio de la transmisión. Debe usar el siguiente método para calcular el progreso/duración actual.

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 for Stream.

MediaPlayer permite restregar la transmisión de audio. Lo he implementado en uno de mis proyectos, pero lleva algo de tiempo. Lleva tiempo reanudar la transmisión de audio desde otra ubicación.

+1

Gracias talha. No noté este pequeño punto. – Arslan

Cuestiones relacionadas