2015-10-03 4 views
25

Я пытаюсь использовать ExoPlayer против MediaPlayer, и я не могу понять это ...ExoPlayer и старт/пауза/seekTo команды

MediaPlayer имеет .start()/.pause() команды ... и я могу просто seekTo(1287) и автоматически начинает воспроизведение ...

Как мне это сделать с ExoPlayer? Я пытался сделать seekTo(1287) но не начинает играть после того, как ... Я также добавил .setPlayWhenReady(true) после этого, и до сих пор не повезло ...

Я могу .stop() ... но я не могу получить он снова начнет играть снова, если я еще не .prepare() ... но я не думаю, что мне нужно было делать это между каждой паузой и игрой.

Я использую свои собственные средства управления и методы противостоящие MediaController как в ExoPlayer демо ... Я не могу достаточно увидеть, как реализуются элементы управления ...

Любые предложения кто-нибудь?

Edit:

Хорошо, я понял паузу и начать ...

.setPlayWhenReady(true) // start 
.setPlayWhenReady(false) // pause 

Но я все еще возникают проблемы с отслеживанием ... .seekTo работает с перебоями ... иногда он работает ... но в других случаях я получаю эту ошибку:

E/AudioTrack: AudioTrack::set : Exit 

(и он попадает только в буферное состояние ... не совсем получается к «готов» ...

ответ

38

official example of the PlayerControl в ExoPlayer исходного кода делать то, что вы просили:

public class PlayerControl implements MediaPlayerControl { 

    private final ExoPlayer exoPlayer; 

    public PlayerControl(ExoPlayer exoPlayer) { 
    this.exoPlayer = exoPlayer; 
    } 

    @Override 
    public boolean canPause() { 
    return true; 
    } 

    @Override 
    public boolean canSeekBackward() { 
    return true; 
    } 

    @Override 
    public boolean canSeekForward() { 
    return true; 
    } 

    @Override 
    public int getAudioSessionId() { 
    throw new UnsupportedOperationException(); 
    } 

    @Override 
    public int getBufferPercentage() { 
    return exoPlayer.getBufferedPercentage(); 
    } 

    @Override 
    public int getCurrentPosition() { 
    return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 
     : (int) exoPlayer.getCurrentPosition(); 
    } 

    @Override 
    public int getDuration() { 
    return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 
     : (int) exoPlayer.getDuration(); 
    } 

    @Override 
    public boolean isPlaying() { 
    return exoPlayer.getPlayWhenReady(); 
    } 

    @Override 
    public void start() { 
    exoPlayer.setPlayWhenReady(true); 
    } 

    @Override 
    public void pause() { 
    exoPlayer.setPlayWhenReady(false); 
    } 

    @Override 
    public void seekTo(int timeMillis) { 
    long seekPosition = exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 
     : Math.min(Math.max(0, timeMillis), getDuration()); 
    exoPlayer.seekTo(seekPosition); 
    } 

} 

Если вы испытываете странное поведение во время операции поиска, это может быть связано с вами конкретный тип потока/файла. Я могу предложить вам взглянуть на ExoPlayer и, в конце концов, сообщить о любых issue на Github.

+1

ссылки github мертвы – IHeartAndroid

+0

ExoPlayer сильно изменился в v2. Не удалось найти обновленную ссылку GH для PlayerControl.java, но вот ссылка для базовой реализации: https://github.com/google/ExoPlayer/blob/release-v2/library/src/main/java/com/ google/android/exoplayer2/ExoPlayerImplInternal.java –

+3

ExoPlayer.UNKNOWN_TIME -> com.google.android.exoplayer2.C.TIME_UNSET – shiami