首页 > 解决方案 > 如何在 Exoplayer 中编写重复模式?

问题描述

我正在尝试播放 m3u8 格式的电视广播,但在某些 m3u 列表中,他们的视频时间有限,即每 50 秒暂停一次,我手动按播放以保持播放,有什么办法可以播放自动地?

我正在使用 Exoplayer 2.7.3

.xml

    app:controller_layout_id="@layout/custom_controller"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:resize_mode="fill"
    app:hide_on_touch="true"
    >
    <ProgressBar
        android:id="@+id/progress"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_marginEnd="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginBottom="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</com.google.android.exoplayer2.ui.SimpleExoPlayerView>

爪哇

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    Handler mainHandler = new Handler();
    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

    LoadControl loadControl = new DefaultLoadControl();

    player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);

    simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
    progressBar = (ProgressBar) findViewById(R.id.progress);

    simpleExoPlayerView.setPlayer(player);
    DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "ejemplom3u8"), defaultBandwidthMeter);
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

    HlsMediaSource hlsMediaSource = new HlsMediaSource(Uri.parse(hlsVideoUri), dataSourceFactory, mainHandler, new AdaptiveMediaSourceEventListener() {
        @Override
        public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {

        }

        @Override
        public void onLoadCompleted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {

        }

        @Override
        public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {

        }

        @Override
        public void onLoadError(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled) {

        }

        @Override
        public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {

        }

        @Override
        public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {

        }
    });

    simpleExoPlayerView.requestFocus();
    player.addListener(this);
    player.prepare(hlsMediaSource);

    player.setPlayWhenReady(true);
}

@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

}

@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_BUFFERING){
        progressBar.setVisibility(View.VISIBLE);
    }

    else {
        progressBar.setVisibility(View.INVISIBLE);
    }
}

@Override
public void onRepeatModeChanged(int repeatMode) {

}

@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

}

@Override
public void onPlayerError(ExoPlaybackException e) {

}

@Override
public void onPositionDiscontinuity(int reason) {

}

@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

}

@Override
public void onSeekProcessed() {

}

@Override
protected void onPause() {
    super.onPause();
    if (player != null) {
        player.setPlayWhenReady(false); //to pause a video because now our video player is not in focus
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    player.release();
}}

标签: javaandroidkotlin

解决方案


修改 onPlayerStateChanged 如下:

            if (playbackState == ExoPlayer.STATE_BUFFERING){
                progressBar.setVisibility(View.VISIBLE);
            }else if (playbackState == ExoPlayer.STATE_ENDED) {
                player.prepare(hlsMediaSource);
            }else {
                progressBar.setVisibility(View.INVISIBLE);
            }

推荐阅读