2015-10-03 60 views
25

Tôi cố gắng để sử dụng ExoPlayer trái ngược với MediaPlayer và tôi dường như không thể hình dung nó ra ...ExoPlayer và bắt đầu/tạm dừng/lệnh seekTo

MediaPlayer.start()/.pause() lệnh ... và tôi có thể chỉ seekTo(1287) và nó sẽ tự động bắt đầu phát ...

Làm cách nào để làm điều này với ExoPlayer? Tôi đã cố gắng để làm seekTo(1287) nhưng nó không bắt đầu chơi sau ... Tôi cũng đã thêm .setPlayWhenReady(true) sau đó, và vẫn không có may mắn ...

Tôi có thể .stop() ... nhưng tôi không thể nhận được nó bắt đầu chơi một lần nữa sau đó trừ khi tôi .prepare() một lần nữa ... nhưng tôi không nghĩ rằng tôi cần phải làm điều đó giữa mỗi tạm dừng và chơi.

Tôi đang sử dụng điều khiển của riêng tôi và phương pháp trái ngược với MediaController như trong ExoPlayer Demo ... Tôi có thể không hoàn toàn xem như thế nào điều khiển được thực hiện ...

Bất kỳ lời đề nghị bất cứ ai?

Edit:

OK, tôi đã tìm ra tạm dừng và bắt đầu ...

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

Nhưng tôi vẫn đang gặp vấn đề với việc theo dõi ... .seekTo công trình không liên tục ... thỉnh thoảng nó hoạt động ... nhưng lần khác tôi nhận được lỗi này:

E/AudioTrack: AudioTrack::set : Exit 

(và nó chỉ đến trạng thái đệm ... không hoàn toàn nhận được để "sẵn sàng" ...

Trả lời

38

Các official example of the PlayerControl trong mã nguồn ExoPlayer thực hiện chính xác những gì bạn hỏi:

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

} 

Nếu bạn đang gặp phải tình huống kỳ lạ trong hoạt động tìm kiếm, nó có thể là do bạn loại tệp/luồng cụ thể. Tôi có thể đề nghị bạn hãy xem của ExoPlayer và, cuối cùng, báo cáo bất kỳ issue trên Github.

+1

liên kết github đã chết – IHeartAndroid

+0

ExoPlayer đã thay đổi rất nhiều trong phiên bản 2. Không thể tìm thấy liên kết GH được cập nhật cho PlayerControl.java, nhưng đây là liên kết để triển khai cơ sở: 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

Các vấn đề liên quan