Как получить длительность потоковой передачи аудио с серверов в Интернете

Сбор всей продолжительности звука стал для меня проблемой. Я создаю действие, которое воспроизводит аудио в Интернете, я использую медиаплеер 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? Спасибо заранее.

Ответ 1

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

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

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

  • добавить 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 секунд. надеюсь, что это поможет вам