9

我有 10 个视频需要播放,一个完成后,下一个开始播放。

我使用的是Google 的 ExoPlayer,我使用的是DEMO @ GitHub中的示例。我可以播放 1 个视频,但如果我尝试播放下一个视频,它将无法开始。

如果我尝试重新启动播放器,然后重新开始播放,它会崩溃。

private void loadvideo() {
    Uri uri = Uri.parse(VIDEO_LIBRARY_URL + currentVideo + ".mp4");
    sampleSource = new FrameworkSampleSource(this, uri, null, 2);

    // 1. Instantiate the player.
    // 2. Construct renderers.
    videoRenderer = new MediaCodecVideoTrackRenderer(sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
    audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
    // 3. Inject the renderers through prepare.
    player.prepare(videoRenderer, audioRenderer);
    // 4. Pass the surface to the video renderer.
    surface = surfaceView.getHolder().getSurface();

    player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface);
    // 5. Start playback.
    player.setPlayWhenReady(true);
    player.addListener(new ExoPlayer.Listener() {
        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            Log.d(TAG, "onPlayerStateChanged + " + playbackState);
            if (playbackState == ExoPlayer.STATE_ENDED) {
                currentVideo++;
                loadNextVideo();
            }
        }

        @Override
        public void onPlayWhenReadyCommitted() {

        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {

        }
    });

}

我究竟做错了什么?如何播放视频连续性?

谢谢。

4

5 回答 5

16

您可以重复使用 ExoPlayer,直到您调用 release(),然后不再使用它。

要更改它当前正在播放的媒体,您基本上需要执行以下步骤:

// ...enable autoplay...
player.stop();
player.seekTo(0L);
player.prepare(renderers);

创建渲染器有点复杂,但这是您应该遵循的流程,播放器应该能够回放视频。

于 2015-02-05T20:12:02.770 回答
4

我正在使用 Exoplayer 更改 mp4 视频成功。我使用 DEMO 中的示例。1.DemoPlayer.java中的DEMO项目:

 private final RendererBuilder rendererBuilder;
 //remove final,then modify that:

 private RendererBuilder rendererBuilder;

 //and add the set method:
 public void setRendererBuilder(RendererBuilder rendererBuilder){
      this.rendererBuilder = rendererBuilder;
  }

 //finally,add stop method
 public void stop(){
      player.stop();
  }

2.PlayerActivity.java中的DEMO项目:添加方法:

private void changeVideo(){
        player.stop();
        player.seekTo(0L);
        //you must change your contentUri before invoke getRendererBuilder();
        player.setRendererBuilder(getRendererBuilder());
        player.prepare();
        playerNeedsPrepare = false;
    }

记住在调用 changeVideo 方法之前更改参数 contentUri。

于 2015-08-13T03:31:16.720 回答
3

用于ConcatenatingMediaSource按顺序播放文件。例如,要播放 2 个媒体 Uris (firstVideoUrisecondVideoUri),请使用以下代码:

MediaSource firstSource =
    new ExtractorMediaSource.Factory(...).createMediaSource(firstVideoUri);
MediaSource secondSource =
    new ExtractorMediaSource.Factory(...).createMediaSource(secondVideoUri);

ConcatenatingMediaSource concatenatedSource =
    new ConcatenatingMediaSource(firstSourceTwice, secondSource);

然后用于concatenatedSource顺序播放媒体文件。

于 2019-04-30T06:30:15.767 回答
2

好的,回答我自己的问题。在示例中,谷歌在 OnResume() 处初始化 ExoPlayer。我不得不为每个这样的视频重新初始化:

player = ExoPlayer.Factory.newInstance(2, 1000, 5000);

如果有人有更好的主意,请告诉我。

于 2015-02-02T14:15:00.760 回答
0

还有一种解决方案,可以参考 ConcatenatingMediaSource 实现自动播放下一个媒体。

在 Demo App 示例中: 1. 启动 ExoPlayer 2. 选择播放列表 3. 选择 Cats->Dogs

于 2017-03-13T09:59:53.567 回答