es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de reproducción de Android ExoPlayer dentro de ViewPager

Tengo un Paginador con una lista de URIs de videos. El problema es que ExoPlayer no reproduce los videos después de haberlos deslizado hacia adelante y hacia atrás. La primera vez los videos se reproducen normalmente, pero después de deslizarlos no lo hacen. ¿Alguna sugerencia?

Página:

<com.google.android.exoplayer2.ui.PlayerView
android:id=”@+id/videoMediaViewer”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
app:controller_layout_id=”@layout/exo_player_controls”
app:resize_mode=”fill”/>

Callback del Paginador:

private val pageChangeListener = object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
viewModel.media.value?.get(position)?.let { media ->
if (media.type == MediaType.Video)
setVideoForPosition(position, Uri.parse(media.links.original))
}
}
override fun onPageScrollStateChanged(state: Int) {}
}

private fun setVideoForPosition(position: Int, uri: Uri){
binding.carouselView.containerViewPager.get(position).findViewById(R.id.videoMediaViewer)?.also {
if (it.player == null) it.player = exoPlayer
if (exoPlayer.isPlaying) exoPlayer.stop()
exoPlayer.setMediaItem(MediaItem.fromUri(uri), 0)
exoPlayer.prepare()
}
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede haber varias razones por las cuales ExoPlayer no reproduce videos después de deslizar hacia adelante y hacia atrás. Una posible razón es que PlayerView aún puede estar reteniendo la instancia anterior del reproductor, lo que causa conflictos al reproducir el siguiente video. Una solución es liberar la instancia anterior del reproductor antes de establecer una nueva.

    Para implementar esto, agregue el siguiente código a onPageSelected():

    override fun onPageSelected(position: Int) {
        viewModel.media.value?.get(position)?.let { media ->
            if (media.type == MediaType.Video)
                setVideoForPosition(position, Uri.parse(media.links.original))
        }
        // liberar la instancia anterior del reproductor
        if (exoPlayer.isPlaying) {
            exoPlayer.release()
        }
    }
    

    Además, para evitar retrasos en la reproducción de videos, se recomienda utilizar exoPlayer.prepareAsync() en lugar de exoPlayer.prepare(). Esto permite que el reproductor prepare el siguiente video de forma asíncrona mientras el video anterior se está reproduciendo.

    Para implementar esto, reemplace exoPlayer.prepare() por exoPlayer.prepareAsync():

    private fun setVideoForPosition(position: Int, uri: Uri){
        binding.carouselView.containerViewPager.get(position).findViewById<playerview>(R.id.videoMediaViewer)?.also {
            if (it.player == null) it.player = exoPlayer
            if (exoPlayer.isPlaying) exoPlayer.stop()
            exoPlayer.setMediaItem(MediaItem.fromUri(uri), 0)
            exoPlayer.prepareAsync()
        }
    }
    

    Al implementar estas soluciones, ExoPlayer ahora debería poder reproducir videos incluso después de deslizar hacia adelante y hacia atrás.

Comments are closed.