我需要播放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) {
}
});
}
我做错了什么? 我怎样才能播放视频的连续性?
感谢。
答案 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
顺序播放媒体文件。