ExoPlayer暂停/停止无法正常工作

11

我已经在其中一个Activity中添加了ExoPlayer以播放视频,它可以正常工作。但是当视频正在播放时,用户按下返回按钮,视频仍然会在后台继续播放。我想停止它。我尝试捕获返回按钮并尝试暂停视频,但它不起作用。除非你杀死该Activity,否则视频会一直播放直到结束。这是一个bug还是这个库的预期工作方式?

以下是ExoPlayer的工作代码:

    String url = getIntent().getStringExtra("videoURL");
    String title = getIntent().getStringExtra("title");
    exoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exo_player_id);

    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

    TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));

    exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector);

    DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(title);
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
    MediaSource m = new HlsMediaSource(Uri.parse(url), dataSourceFactory, null,null);

    exoPlayerView.setPlayer(exoPlayer);
    exoPlayer.prepare(m);
    exoPlayer.setPlayWhenReady(true);

以下是我试图使用来停止视频的代码。

@Override
    public void onBackPressed(){
        try{
            exoPlayer.stop();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

我在调试模式下检查了代码,执行了这个语句,但视频仍然没有停止。

8个回答

11

试一试这个...

if (exoPlayer != null) {
    exoPlayer.setPlayWhenReady(false);
    exoPlayer.stop();
    exoPlayer.seekTo(0);
}

7

在我的项目中,我也遇到了同样的问题。我的问题是:当屏幕加载时,Exoplayer被初始化两次,并且在我们根据SDK版本在onPause或onResume()中调用realeseExoplayer()释放一个实例后,其中一个实例会继续在后台播放,即使活动已经关闭。因此,请仔细检查Exoplayer是否被初始化两次。如果它被初始化多次,请进行必要的更改,只初始化一次。


1
非常感谢,这节省了我很多时间! - hetsgandhi

4

我的代码可以处理音频活动:

public void release() {

    if (exoPlayer != null) {
        exoPlayer.removeListener(eventListener);
        exoPlayer.release();
        exoPlayer = null;
        dataSpec =null;
        assetDataSource = null;
        factory = null;
        audioSource =null;
    }
}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    setPlayPause(false);
    release();

    finish();
}

2
我建议在Activity的生命周期方法中初始化和释放播放器。如果您正确地执行此操作,则不需要onBackPressed方法,因为您的代码在生命周期方法中执行。
ExoPlayer演示应用程序的PlayerActivity基本上具有这些生命周期方法:
@Override
public void onStart() {
  super.onStart();
  if (Util.SDK_INT > 23) {
    initializePlayer();
  }
}

@Override
public void onResume() {
  super.onResume();
  if (Util.SDK_INT <= 23 || player == null) {
    initializePlayer();
  }
}

@Override
public void onPause() {
  super.onPause();
  if (Util.SDK_INT <= 23) {
    releasePlayer();
  }
}

@Override
public void onStop() {
  super.onStop();
  if (Util.SDK_INT > 23) {
    releasePlayer();
  }
}

1
你可以使用ExoPlayer的示例,releasePlayer方法:
private void releasePlayer() {
        if (player != null) {
            updateResumePosition();
            player.removeListener(this);
            player.stop();
            player.release();
            player = null;
            trackSelector = null;
            trackSelectionHelper = null;
            eventLogger = null;
        }
    }

请查看 ExoPlayer 演示中的 PlayerActivity 类。

将源代码上传至Github以便全面理解,并在此基础上给它加一。 - DragonFire

1

这是一个示例,展示如何实现Naveen Dew所说的内容。

@Override
public void onDestroyView() {
    super.onDestroyView();
    if (exoPlayer != null) {
        exoPlayer.setPlayWhenReady(false);
        exoPlayer.stop();
        exoPlayer.seekTo(0);
    }
}

1
以下代码对我来说可以正常工作:

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

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

0

我刚遇到了这个问题,这里的解决方案都没有帮助到我。希望能帮到其他人。

那么,还有什么可能出错呢?在Player.STATE_READY中调用exoPlayer.play()是编程错误。从回调中删除exoPlayer.play()。如果你想在播放器准备好后立即播放视频文件,请在Player.STATE_READY创建一个标志,并使用处理程序检查它是否准备好,然后播放。希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接