如何解决如何解决在设备 Retation 上将 PlayerView 重新附加到 ExoPlayer 时的时间滞后问题
我正在尝试使用 MVVM 架构模式在我当前的项目中实现 ExoPlayer。完整的 ExoPlayer 设置是在扩展 AndroidViewModel 的 ViewModel 类中完成的。播放器已初始化并附加到我的 Activity 中的 PlayerView。一切正常,但在设备旋转时,系统会在播放器重新连接到 PlayerView 之前滞后几秒钟。在此时间延迟期间,正在播放的视频会在后台播放中听到。我试图解决问题,但我没有单独取得任何进展
有人可以帮助我吗?我需要知道为什么 PlayerView 在它在设备旋转时重新附加到播放器之前延迟了几秒钟,以便我可以防止它。
添加依赖
dependencies {
implementation 'com.google.android.exoplayer:exoplayer-core:2.12.0'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.12.0'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.12.0'
}
我的 ViewModel 类
public class PlayerViewModel extends AndroidViewModel {
private Application application;
private PlaybackStateListener stateListener;
private boolean playWhenReady = true;
public boolean mustRestore = false;
public boolean isMute = false;
public boolean isFullScreen = false;
public boolean isLandscape = false;
public SimpleExoPlayer player;
private int currentWindow = 0;
private long playbackPosition = 0;
public MutableLiveData<Integer>frameDisplayingLD;
private MutableLiveData<SimpleExoPlayer>playerLD;
private MutableLiveData<Integer> playerStateLD;
public PlayerViewModel(@NonNull Application application) {
super(application);
this.application = application;
stateListener = new PlaybackStateListener();
playerStateLD = new MutableLiveData<>();
frameDisplayingLD = new MutableLiveData<>();
playerLD = new MutableLiveData<>();
frameDisplayingLD.postValue(AppConstant.Constants.PLAYER_OPTION);
}
public void initializePlayer(CursorTopic cursorTopic){
if (player == null){
DefaultTrackSelector trackSelector = new DefaultTrackSelector(application);
trackSelector.setParameters(trackSelector.buildUponParameters().setMaxVideoSizeSd());
player = new SimpleExoPlayer.Builder(application)
.setTrackSelector(trackSelector)
.build();
}
MediaItem mediaItem = MediaItem.fromUri(cursorTopic.getUrlString());
player.setMediaItem(mediaItem);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow,cursorTopic.getPlayingPosition());
player.addListener(stateListener);
player.prepare();
playerLD.postValue(player);
}
public MutableLiveData<Integer> getPlayerStateLD() {
return playerStateLD;
}
public MutableLiveData<SimpleExoPlayer> getPlayerLD() {
return playerLD;
}
private class PlaybackStateListener implements Player.EventListener {
@Override
public void onPlaybackStateChanged(int state) {
respondToPlayerState(state);
}
@Override
public void onPlayerError(ExoPlaybackException error) {
frameDisplayingLD.postValue(AppConstant.Constants.ERROR_50);
}
}
}
最后我的活动
public class LectureRoomActivity extends AppCompatActivity implements View.OnClickListener{
private PlayerViewModel playerViewModel;
private PlayerView exoPlayerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lecture_room);
exoPlayerView = findViewById(R.id.playerView);
downloadVM = new ViewModelProvider(this).get(DownloadViewModel.class);
lectureRoomVM = new ViewModelProvider(this).get(LectureViewModel.class);
playerViewModel = new ViewModelProvider(this).get(PlayerViewModel.class);
preSetPlayerControls();
playerViewModel.getPlayerLD().observe(this,new Observer<SimpleExoPlayer>() {
@Override
public void onChanged(SimpleExoPlayer simpleExoPlayer) {
if (simpleExoPlayer != null){
if (!playerViewModel.mustRestore){
exoPlayerView.setPlayer(simpleExoPlayer);
}else {
exoPlayerView.setPlayer(playerViewModel.player);
}
}
}
});
lectureRoomVM.getRootTopicListLD(subject).observe(
this,new Observer<ArrayList<RootTopic>>() {
@Override
public void onChanged(ArrayList<RootTopic> rootTopics) {
if (rootTopics != null) {
Topic topic = rootTopics.get(0).getTopicGroup().get(0);
lectureRoomVM.setCursorTopic(subject,topic);
lectureRoomVM.setTopicGroupList(rootTopics);
}
}
});
lectureRoomVM.getCursorTopicLD().observe(
this,new Observer<CursorTopic>() {
@Override
public void onChanged(CursorTopic cursorTopic) {
playerViewModel.initializePlayer(cursorTopic)
}
}
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。