【问题标题】:Exo Player event listner callbackExoplayer 事件监听回调
【发布时间】:2018-01-04 09:34:14
【问题描述】:

在活动的 onPause() 中,我将 false 传递给 player.setPlayerWhenReady(),我按下手机的主页按钮,因此活动的 onPause() 被调用,但我将应用程序保持在后台,我没有从堆栈中移除,之后20 分钟后我重新打开应用程序,因此调用了活动的 onStart(),再次初始化 exoplayer 并传递有效的视频 url,然后我传递 player.setPlayerWhenReady(true),但 exo 播放器直接在其回调中调用 onPlayerError().. 但是当我从堆栈中关闭应用程序并再次打开应用程序时 exo 播放器工作正常...请帮助解决此问题。

代码是这样的..

            simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
            simpleExoPlayerView.requestFocus();

            TrackSelection.Factory videoTrackSelectionFactory =
                    new AdaptiveTrackSelection.Factory(bandwidthMeter);

            trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

            player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
            Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: player instance in initializePlayer is ="+player);
            simpleExoPlayerView.setPlayer(player);
            Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: shouldAutoPlay is ="+shouldAutoPlay);
            player.setPlayWhenReady(true);


            DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(url), mediaDataSourceFactory,
                    extractorsFactory, null, null);

            durationSet = false;
            player.prepare(mediaSource);
            seekToValue = scSchedule.getSeekPosition();
            if (seekToValue != null) {
                player.seekTo(seekToValue);
            } else {
                player.seekTo(0);
                seekToValue = 0L;
            }
            player.addListener(new Player.EventListener() {
                @Override
                public void onTimelineChanged(Timeline timeline, Object manifest) {

                }

                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                }

                @Override
                public void onLoadingChanged(boolean isLoading) {

                }

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    if (playbackState == ExoPlayer.STATE_ENDED) {
                        Log.d(AppConstants.LOG_TAG_LOG,
                                "In FullScreenVideoActivity::onPlayerStateChanged() ");
                        // increment videoViewCount in Analytics table
                        AppUtils.getInstance().updateAnalytics(false,
                                -1, true);
                        // update video watched duration in Analytics table
                        int videoViewDuration = 0;
                        if (seekToValue != null) {
                            if (filmDuration > seekToValue) {
                                videoViewDuration = (int) (filmDuration - seekToValue);
                                AppUtils.getInstance().updateAnalytics(false,
                                        videoViewDuration / 1000,
                                        false);
                            }
                        }
                        isVideoEnded = true;
                        videoEnded();
                        finish();
                    } else if (playbackState == ExoPlayer.STATE_READY && !durationSet) {
                        filmDuration = (int) player.getDuration();
                        Log.d(AppConstants.LOG_TAG_LOG,
                                "In FullScreenVideoActivity::onPlayerStateChanged(), " +
                                        "filmDuration = " + filmDuration);
                        durationSet = true;
                    }
                }

                @Override
                public void onRepeatModeChanged(int repeatMode) {

                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    Log.d(AppConstants.LOG_TAG_LOG,"onPlayerError() called");
                }

                @Override
                public void onPositionDiscontinuity() {

                }

                @Override
                public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

                }
            });

   private void releasePlayer() {
        if (player != null) {
            shouldAutoPlay = player.getPlayWhenReady();
            player.release();
            player = null;
            trackSelector = null;
        }
    }

我在activity的onDestroy()中调用了这个释放方法。

【问题讨论】:

    标签: android android-activity video-streaming exoplayer exoplayer2.x


    【解决方案1】:

    问题可能是因为您在没有先释放 Exoplayer 的情况下再次初始化它。 在 onPause 中释放播放器通常是一个好习惯:

    private void releasePlayer() {
            if (player != null) {
                playbackPosition = player.getCurrentPosition();
                currentWindow = player.getCurrentWindowIndex();
                playWhenReady = player.getPlayWhenReady();
                player.release();
                player = null;
            }
        }
    

    然后在onStart中,可以用用户离开的参数初始化播放器。

    private void initializePlayer() {
            if (player == null) {
                player = ExoPlayerFactory.newSimpleInstance(
                        new DefaultRenderersFactory(this),
                        new DefaultTrackSelector(), new DefaultLoadControl());
    
                playerView.setPlayer(player);
                player.setPlayWhenReady(playWhenReady);
                player.seekTo(currentWindow, playbackPosition);
                Uri uri = Uri.parse(getString(R.string.media_url_mp3));
                MediaSource mediaSource = buildMediaSource(uri);
                player.prepare(mediaSource, true, false);
            }
    

    P.S:代码与您的无关。这只是一个例子。

    【讨论】:

    • 我正在按照 Exo 播放器指南发布播放器,它已成功发布播放器,但问题不同,当我重新打开应用程序时,即使在初始化播放器并提供工作视频 url 后,我也会初始化播放器, player抛出错误,直接调用onPlayerError()。
    • 既然你提到你在onDestroy中调用了release方法,我建议你尝试在onPause中调用releasePlayer if Util.SDK_INT <= 23 .. or in onStop if Util.SDK_INT>23
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多