2016-02-20 2 views
1

Сбор всей длительности звука стал для меня проблемой. Я создаю действие, которое воспроизводит аудио в Интернете, я использую медиаплеер android. Теперь звук может воспроизводиться правильно, но проблема, с которой я сталкиваюсь, позволяет делать seek bar соответственно звуку. Строка поиска установлена ​​правильно, но я видел, что getDuration возвращает значение 0. Ниже приведено то, что я сделал.Как получить длительность потоковой передачи аудио с серверов онлайн

public class AudioDetails extends AppCompatActivity 
    implements MediaPlayer.OnCompletionListener, SeekBar.OnSeekBarChangeListener { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.audios_details_activity); 


    // Mediaplayer 
    mp = new MediaPlayer(); 
    utils = new AudioUtilities(); 

    // Listeners 
    songProgressBar.setOnSeekBarChangeListener(this); // Important 
    mp.setOnCompletionListener(this); // Important 



    // By default play first song 
    playSong(0); 

    /** 
    * Play button click event 
    * plays a song and changes button to pause image 
    * pauses a song and changes button to play image 
    * */ 
    btnPlay.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // check for already playing 
      if(mp.isPlaying()){ 
       if(mp!=null){ 

        mp.pause(); 
        // Changing button image to play button 
        btnPlay.setImageResource(R.drawable.btn_play); 
       } 
      }else{ 
       // Resume song 
       if(mp!=null){ 
        mp.start(); 
        // Changing button image to pause button 
        btnPlay.setImageResource(R.drawable.btn_pause); 
       } 
      } 

     } 
    }); 



} 



/** 
* Function to play a song 
* @param songIndex - index of song 
* */ 
public void playSong(int songIndex){ 
    // Play song 
    try { 
     mp.reset(); 
     setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     try { 

      mp.setDataSource("http://test.com/test/upload/Twale_FLO.mp3"); 
      mp.prepareAsync(); 
      mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) {       
        mp.start(); 
        totalDuration =mp.getDuration(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 




     // set Progress bar values 
     songProgressBar.setProgress(0); 
     songProgressBar.setMax(99); 

     // Updating progress bar 
     updateProgressBar(); 


    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Update timer on seekbar 
* */ 
public void updateProgressBar() { 
    mHandler.postDelayed(mUpdateTimeTask, 100); 
} 

/** 
* Background Runnable thread 
* */ 
private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
     long currentDuration = mp.getCurrentPosition(); 
     long totalDuration = mp.getDuration(); 

     // Displaying Total Duration time 
     songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration)); 

     // Displaying time completed playing 
     songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration)); 

     // Updating progress bar 
     int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration)); 
     Log.d("Progress", "" + progress); 
     songProgressBar.setProgress(progress); 

     // Running this thread after 100 milliseconds 
     mHandler.postDelayed(this, 100); 
    } 
}; 

/** 
* 
* */ 
@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 

} 

/** 
* When user starts moving the progress handler 
* */ 
@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
    // remove message Handler from updating progress bar 
    mHandler.removeCallbacks(mUpdateTimeTask); 
} 

/** 
* When user stops moving the progress hanlder 
* */ 
@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    mHandler.removeCallbacks(mUpdateTimeTask); 
    int totalDuration = mp.getDuration(); 
    int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration); 

    // forward or backward to certain seconds 
    mp.seekTo(currentPosition); 

    // update timer progress again 
    updateProgressBar(); 
} 

/** 
* On Song Playing completed 
* if repeat is ON play same song again 
* if shuffle is ON play random song 
* */ 
@Override 
public void onCompletion(MediaPlayer arg0) { 

    // check for repeat is ON or OFF 
    if(isRepeat){ 
     // repeat is on play same song again 
     playSong(currentSongIndex); 
    } else{ 
      // play first song 
      playSong(0); 
      currentSongIndex = 0; 
    } 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    mp.release(); 
}} 

Как я могу получить общую продолжительность потокового аудиофайла через Интернет через Android? Заранее спасибо.

+0

Ваша общая продолжительность примерно 544: 34: 43 ?? часы: мин. сек. Это результат, который вы хотите? потому что это то, что возвращает ваша ссылка. если это результат, тогда я отправлю свой ответ. иначе вы мне скажете, если какой-либо другой результат вы требуете. –

+0

Я не получаю такой результат, я получаю '00: 00'. Но я ожидаю полную продолжительность песни. Forinstance 05:34 @ZahanSafallwa – George

+0

Какова продолжительность вашего потока ??? Я попробовал свой код. он вернулся 544 часа 34 минуты 43 секунды для вашей ссылки –

ответ

5

Есть некоторые проблемы с этой темой.

  1. getDuration() не работает во всех версиях API. Таким образом, он не уверен, когда он будет работать, а когда нет.
  2. Другой способ - извлечь метаданные. К сожалению, андроид MediaMetadataRetriever не работает с онлайн-источником. Он работает только с файлами sd-карт.

К счастью есть доступная библиотека, которая может нам помочь. И я получил продолжительность с этой библиотекой. Итак, это шаги.

  1. добавить compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.3' к вашему gradle.build в зависимости

Тогда вы можете получить по длительности ниже кода

FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); 
      mmr.setDataSource("http://owatechinnovations.com/test/upload/Twale_FLO.mp3"); 
      mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM); 
      mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST); 
      long duration =Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)); 
      duration=duration/1000; 
      long minute=duration/(60); 
      long second=duration-(minute*60); 
      mmr.release(); 
      your_text_view.setText(minute+":"+second); 

Я получаю результат "4:18" 4 мин 18 сек. надеюсь, это вам поможет

+0

это сработало для вас? @George –

+0

Стрелка поиска не работает, хотя продолжительность установлена ​​правильно – George

+0

Пожалуйста, проверьте эту сторону 'public void onStopTrackingTouch (SeekBar seekBar) { mHandler.removeCallbacks (mUpdateTimeTask); int totalDuration = mp.getDuration(); int currentPosition = utils.progressToTimer (seekBar.getProgress(), totalDuration); // вперед или назад до определенных секунд mp.seekTo (currentPosition); // обновление таймера снова updateProgressBar(); } ' – George

Смежные вопросы