Exoplayer不循环播放视频

时间:2017-05-27 12:50:09

标签: android exoplayer

我在我的Android应用程序中使用Exoplayer来播放视频和音频文件。根据{{​​3}}来循环播放视频/音频,这就是你必须要做的事情

MediaSource mediaSource = new ExtractorMediaSource(videoUri, ...);
// Loops the video indefinitely.
LoopingMediaSource loopingSource = new LoopingMediaSource(mediaSource);

所以我在我的Activity的onCreate方法

中实现了这个
    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector(factory);

    simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
    simpleExoPlayer.setPlayWhenReady(true);
    simpleExoPlayerView.setPlayer(simpleExoPlayer);

    // Measures bandwidth during playback. Can be null if not required.
    bandwidthMeter2 = new DefaultBandwidthMeter();

// Produces DataSource instances through which media data is loaded.
    dataSourceFactory = new DefaultDataSourceFactory(this,
      Util.getUserAgent(this, applicationName), bandwidthMeter2);

// Produces Extractor instances for parsing the media data.
    extractorsFactory = new DefaultExtractorsFactory();
    mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory, extractorsFactory, null, null);

    loopingSource = new LoopingMediaSource(mediaSource);
    simpleExoPlayer.prepare(mediaSource);

但我的视频文件的循环没有发生。它只播放一次。

5 个答案:

答案 0 :(得分:4)

我发现Exoplayer开发人员指南中遗漏了一些重要信息。创建LoopingMediaSource个实例后,不应拨打simpleExoPlayer.prepare(mediaSource);,而应拨打simpleExoPlayer.prepare(loopingSource);。下面是完整的代码

     BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector(factory);

    simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
    simpleExoPlayer.setPlayWhenReady(true);
    simpleExoPlayerView.setPlayer(simpleExoPlayer);

    // Measures bandwidth during playback. Can be null if not required.
    bandwidthMeter2 = new DefaultBandwidthMeter();

// Produces DataSource instances through which media data is loaded.
    dataSourceFactory = new DefaultDataSourceFactory(this,
      Util.getUserAgent(this, applicationName), bandwidthMeter2);

// Produces Extractor instances for parsing the media data.
    extractorsFactory = new DefaultExtractorsFactory();

        MediaSource mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory, extractorsFactory, null, null);
    // Loops the video indefinitely.
    LoopingMediaSource loopingSource = new LoopingMediaSource(mediaSource);

    simpleExoPlayer.prepare(loopingSource);

答案 1 :(得分:2)

只需使用player.setRepeatMode(player.REPEAT_MODE_ONE);

答案 2 :(得分:1)

player = ExoPlayerFactory.newSimpleInstance(this);

上面的代码行使用默认的音轨选择器实例化ExoPlayer。如果不自定义轨道选择器,我们可以避免创建带宽测量器,轨道选择器。

可以使用LoopingMediaSource实现循环。我们必须在LoopingMediaSouce构造函数中传递循环计数。如果要无限循环播放媒体,最好使用播放器的setRepeatMode()方法。

new LoopingMediaSource(mediaSource, 3)

附上样本以供参考。

<code>
    private MediaSource getLoopingMediaSource() {
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(ExoPlayerActivity.this, Util.getUserAgent(ExoPlayerActivity.this, "application-name"));
        MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Samples.MP4_URI);
        LoopingMediaSource loopingMediaSource = new LoopingMediaSource(mediaSource, 3);
        return  loopingMediaSource;
        }

    player = ExoPlayerFactory.newSimpleInstance(this);
    playerView.setPlayer(player);
    player.prepare(getLoopingMediaSource());
    player.setPlayWhenReady(true);
</code>

答案 3 :(得分:0)

唯一适用于我的解决方案是:

    simpleExoPlayer.prepare(mediaSource);
    simpleExoPlayer.setPlayWhenReady(true);
    simpleExoPlayer.seekTo(0);
    exoPlayer.requestFocus();
    simpleExoPlayer.addListener(new Player.EventListener() {
        @Override
        public void onLoadingChanged(boolean isLoading) {
        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            switch (playbackState) {
                case Player.STATE_READY:
                    prog.setVisibility(View.GONE);
                    simpleExoPlayer.setPlayWhenReady(true);
                    break;
                case Player.STATE_BUFFERING:
                    prog.setVisibility(View.VISIBLE);
                    simpleExoPlayer.seekTo(0);
                    break;
                case Player.STATE_IDLE:
                    simpleExoPlayer.retry();
                    break;
            }
        }
    });
}

答案 4 :(得分:0)

您可以简单地将重复模式设置为“ Repeat_MODE_ONE”。

例如:

  val player: SimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(
        context,
        DefaultRenderersFactory(context),
        DefaultTrackSelector(),
        DefaultLoadControl()
    ).apply {


       repeatMode = Player.REPEAT_MODE_ONE

    }

p.s。播放器来自com.google.android.exoplayer2