Exoplayer lanza excepción de inicialización de decodificador para archivos mp4 grandes en android

Estoy usando Exoplayer para reproducir videos como una lista de reproducción continuamente en android. Cuando reproduzco vídeos de baja calidad mp4 funciona bien, pero cuando intento reproducir vídeos mp4 de mayor calidad después de reproducir uno o dos vídeos en la lista de reproducción la pantalla no muestra nada y el registro da la siguiente excepción

Com.google.android.exoplayer.MediaCodecTrackRenderer $ DecoderInitializationException: Falló el inicio del decodificador: OMX.amlogic.avc.decoder.awesome, MediaFormat (video / avc, 198826, 1920, 1080, -1.0, -1, -1, -1, -1, -1)

Incluso si bucle el mismo video de alta calidad la primera vez que se reproduce y luego segunda vez esta excepción se lanza. Cuando el tamaño del video es más de 80mb esta excepción se lanza. Es algún problema de tamaño de búfer? Puede alguien por favor me guía. muchas gracias

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.adplayertexture); AdplayerTexture=(TextureView)findViewById(R.id.AdPlayerTexture); AdplayerTexture.setBackgroundColor(Color.BLACK); AdplayerTexture.setSurfaceTextureListener(this); } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { AdPlayerSurface = new Surface( surface); playMedia(AdPlayerSurface); } private void playMedia(Surface surface){ mediaplayer=new ExoPlayer(); mediaplayer.play(this,Videopathlist[CurrentVideoIndex],surface; mediaplayer.addListener(this); } @Override public void onStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == ExoPlayer.STATE_ENDED) { //releasing the resources mediaplayer.DestroyPlayer(); AdPlayerSurface.release(); AdPlayerSurface=new Surface(AdplayerTexture.getSurfaceTexture()); CurrentVideoIndex++; playMedia(AdPlayerSurface); } 

Esta es la función play () en la clase root2mediaplayer

 public void playMedia(Activity playerActivity,String mediapath,final long Position,Surface mediasurface){ String Systemroot = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); try{ File myFile=new File(Systemroot + java.io.File.separator + "Videos" + java.io.File.separator + mediapath); Uri uri = Uri.fromFile(myFile); final int numRenderers = 2; SampleSource sampleSource = new FrameworkSampleSource(playerActivity, uri, /* headers */ null, numRenderers); // Build the track renderers TrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT); TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource); // Build the ExoPlayer and start playback MoviePlayer = ExoPlayer.Factory.newInstance(numRenderers); MoviePlayer.prepare(videoRenderer, audioRenderer); MoviePlayer.addListener(this); // Pass the surface to the video renderer. MoviePlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, mediasurface); MoviePlayer.seekTo(Position); MoviePlayer.setPlayWhenReady(true); }catch(Exception e){ e.printStackTrace(); FileLog("exception in mediaplayer"); } 

Sin mirar su código completo y sin saber qué dispositivo / plataforma ve este problema (aunque desde su pregunta se ve como ah / w plataforma de AMLOGIC), sólo puedo supongo que puede ser que no están liberando los recursos de MediaCodec en su reproductor Cuando la reproducción termina y / o cambia la reproducción de vídeo nuevo.

MediaCodec se publica en la API releaseCodec () en https://github.com/google/ExoPlayer/blob/master/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java .

Es posible que desee comprobar si realmente se llama cuando detiene la reproducción del primer video e inicia la reproducción del siguiente video en su lista de reproducción.

Por lo general, todas las plataformas móviles de gama alta tienen decodificadores basados ​​en h / w que utilizan una memoria de vídeo limitada y dedicada (accesible sólo por decodificadores h / w) en el sistema para descodificar tramas. En algunas plataformas, no será posible crear un decodificador si alguna otra aplicación (o la misma aplicación) del sistema ha creado otra instancia del mismo descodificador basado en h / w y no lo ha publicado cuando se va a fondo (en Actividad Lenguaje del ciclo de vida, onStop, etc.).

Además, si la memoria de vídeo dedicada no se libera cuando se destruyen los decodificadores, se agotará la memoria de vídeo limitada disponible en la plataforma en un par de sesiones de reproducción de vídeo debido a la pérdida.

Busque los registros de la plataforma completa de adb cuando crea y destruye las instancias de MediaCodec (o en su caso, detenga e inicie la reproducción del siguiente video en la lista de reproducción). Eso puede darte algunas pistas.

Espero que mi consejo de alto nivel es de algún uso para usted para cazar el problema. ¡¡¡Buena suerte!!!.

En lugar de eliminar completamente ExoPlayer y Surface, deberías ser capaz de reutilizar las mismas instancias de ExoPlayer y Surface.

Simplemente detenga ExoPlayer, cree los nuevos objetos FrameSampleSource / MediaCodec {Audio, Video} TrackRender y, a continuación, llame a prepare nuevo.

El nuevo código haría algo como:

  • MoviePlayer.stop ()
  • MoviePlayer.seekTo (0)
  • Nuevo FrameworkSampleSource y MediaCodec {Audio, Video} TrackRenders
  • MoviePlayer.prepare (newVideoRenderer, newAudioRenderer)

Consulte los comentarios para el método de detención :

/ ** * Detiene la reproducción. Utilice {@code setPlayWhenReady (false)} en lugar de este método si la intención * es hacer una pausa en la reproducción. *

* Llamar a este método hará que el estado de reproducción pase a * {@link ExoPlayer # STATE_IDLE}. Todavía se puede usar la instancia del reproductor y * {@link ExoPlayer # release ()} debe seguir siendo invitada en el reproductor si ya no es necesario. *

* Llamar a este método no restablece la posición de reproducción. Si se utiliza esta instancia del reproductor * para reproducir otro video desde su inicio, se debe llamar {@code seekTo (0)} después de detener * el reproductor y antes de prepararlo para el siguiente video. * /

  • ExoPlayer AudioTrack Tartamudez
  • Control del volumen de Exoplayer con una barra de búsqueda
  • Android - Exoplayer 2 - reproduce múltiples sonidos / audio simultáneamente - MergingMediaSource
  • Caché ExoPlayer
  • ¿Es posible precargar múltiples secuencias con Exoplayer y reproducir varios videos simultáneamente?
  • Reproducción de vídeo cifrado con ExoPlayer
  • ExoPlayer: obtiene las canciones metadata de la secuencia HTTP
  • Android - Visualización de ExoPlayer en un círculo
  • Vídeo de escala de matriz en TextureView Android
  • Exoplayer tocando archivos m3u8 en Android
  • Intentar trabajar con ExoPlayer - muchas incógnitas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.