ExoPlayer - 一个接一个地播放10个文件

时间:2015-02-02 11:47:47

标签: android video exoplayer

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

我使用Google's 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) {

        }
    });

}

我做错了什么? 我怎样才能播放视频的连续性?

感谢。

5 个答案:

答案 0 :(得分:12)

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

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

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

创建渲染器需要更多一些,但这是你应该遵循的流程,玩家应该能够回放视频。

答案 1 :(得分: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中的2.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方法之前更改param contentUri。

答案 2 :(得分:2)

好的,回答我自己的问题。 例如,google在OnResume()上初始化ExoPlayer。 我必须为每个视频重新初始化:

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

如果有人有更好的想法,请告诉我。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

使用ConcatenatingMediaSource顺序播放文件。

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

ConcatenatingMediaSource concatenatedSource =
    new ConcatenatingMediaSource(firstSourceTwice, secondSource);

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