Android MediaPlayer по URL

213
06 декабря 2018, 18:30

На сервере лежат довольно большие файлы в формате mp3, есть необходимость прослушать их не с начала, а с определенного места. При вызове seekTo() позиция меняется, но в буффер продолжает вбиваться весь файл с самого начала. Как сделать так, чтобы в буффер шёл только кусок после выставленной позиции?

Код функции:

public void playMusic(String url){
    destroyMusic();
    AudioManager am=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
    am.requestAudioFocus(null,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
    mp=new MediaPlayer();
    mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener(){
            public void onSeekComplete(MediaPlayer mp){
                mp.setVolume(0,0);
                mp.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener(){
                        public void onBufferingUpdate(MediaPlayer mp, int pc){
                            float duration=mp.getDuration()/1000;
                            float buffer=duration/100*pc;
                            float current=mp.getCurrentPosition()/1000;
                            float loadTo=current+30;
                            float l=buffer/loadTo*100;
                            if(loading!=null) loading.setText("Буфферизация аудио... "+(int)l+"%");
                            if(buffer-current>=30){
                                mp.setOnBufferingUpdateListener(null);
                                spawnAnswer();
                                startTimer(0);
                                int realW=getSizes()[0];
                                anim=ValueAnimator.ofInt(0, realW/50);
                                anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                                        @Override
                                        public void onAnimationUpdate(ValueAnimator valueAnimator) {
                                            int val = (Integer) valueAnimator.getAnimatedValue();
                                            if(timeBut==null) return;
                                            ViewGroup.LayoutParams layoutParams=timeBut.getLayoutParams();
                                            layoutParams.height=val;
                                            timeBut.setLayoutParams(layoutParams);
                                        }
                                    });
                                anim.setDuration(500);
                                anim.start();
                                mp.start();
                                fadeInAudio();
                            }
                        }});
            }});
    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
            public void onPrepared(MediaPlayer mp){
                int d=mp.getDuration();
                int r=60000;
                if((r+30000)>d){
                    r=d-30000;
                }
                mp.seekTo(new Random().nextInt(r));
            }});
    try{
        mp.setDataSource(url);
        mp.prepareAsync();
    }
    catch (IllegalStateException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }
}
READ ALSO
Создание конструктора

Создание конструктора

В домашнем задании нужно создать новый конструкторВ проекте уже существует один, который генерирует кошек

213
Отключение разделителя в SplitPane (JavaFX)

Отключение разделителя в SplitPane (JavaFX)

По ходу создания программы в JavaFX для красоты решил запретить изменять расположение разделителя (Divider)Вот моя попытка:

169
Как распарсить этот ответ сервера?

Как распарсить этот ответ сервера?

Пишу программу на JavaИспользую API сервиса и библиотеку Retrofit2 для отправки запросов на сервер и получения ответа, а также библиотеку Gson

227