android - mediasource - ExoPlayer: reproduce 10 archivos uno tras otro
hls mediasource exoplayer (4)
Estoy usando Exoplayer change mp4 video success. Utilizo el ejemplo en la DEMO. Proyecto 1.DEMO en DemoPlayer.java:
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();
}
Proyecto 2.DEMO en PlayerActivity.java: add method:
private void changeVideo(){
player.stop();
player.seekTo(0L);
//you must change your contentUri before invoke getRendererBuilder();
player.setRendererBuilder(getRendererBuilder());
player.prepare();
playerNeedsPrepare = false;
}
recuerda cambiar el contenido de paramUri antes de invocar el método changeVideo.
Tengo 10 videos que necesito jugar, una vez que uno termina, el siguiente comienza a jugar.
Estoy usando ExoPlayer de Google , uso el ejemplo en DEMO @ GitHub . Puedo reproducir 1 video, pero si intento jugar el siguiente, no comenzará.
Si trato de reiniciar el reproductor y empiezo a jugar de nuevo, se bloquea.
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) {
}
});
}
¿Qué estoy haciendo mal? ¿Cómo puedo reproducir la continuidad de los videos?
Gracias.
Existe otra solución, puede referirse a ConcatenatingMediaSource para lograr el siguiente medio de reproducción automática.
En el ejemplo de la aplicación de demostración: 1. Ejecute ExoPlayer 2. Seleccione Playlists 3. Elija Cats-> Dogs
OK, respondiendo mi propia pregunta. en el ejemplo, google init el ExoPlayer en OnResume (). tuve que reiniciar para cada video de esa manera:
player = ExoPlayer.Factory.newInstance(2, 1000, 5000);
si alguien tiene una idea mejor, házmelo saber.
Puede reutilizar ExoPlayer hasta el momento en que llame a release (), y luego ya no debería utilizarse.
Para cambiar el medio que está reproduciendo actualmente, básicamente debe realizar los siguientes pasos:
// ...enable autoplay...
player.stop();
player.seekTo(0L);
player.prepare(renderers);
Crear los renderizadores es un poco más complicado, pero ese es el flujo que debes seguir y el jugador debería poder reproducir videos de respaldo.