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)
- Textureview obtener Superficie
- Reproducción de vídeos de YouTube con ExoPlayer
- ExoPlayer no reproduce audio en los dispositivos que utilizan FFMPEG
- ExoPlayer deja de jugar en segundo plano
- ¿Hay una manera de utilizar ExoPlayer para recrear ThumbnailUtils.extractThumbnail
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"); }
- Obtención de pantalla en negro cuando se agrega ExoPlayer a GLSurfaceView
- Cómo utilizar ExoPlayer
- Cómo utilizar un solo jugador para los anuncios y el vídeo con google android Exoplayer
- Reproducción de HLS con ExoPlayer
- Android ExoPlayer: ¿Resuelve el problema de reproducción sin interrupciones / sin fisuras que está roto para el reproductor de medios Android
- En Android, usando exoplayer, ¿cómo rellenar surfaceview con un video que no tiene la misma relación de aspecto con el dispositivo?
- Configuración de encabezados para streaming de vídeo mp4 y reproducción de archivos con Exoplayer
- Exoplayer - InvalidResponseCodeException (404) mientras el archivo existe
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. * /
- Java.lang.StackOverflowError en com.google.maps.api.android.lib6.gmm6.lla
- Error "Versión de SDK de Android no encontrada" al ejecutar el emulador de Android de Genymotion desde Appcelerator Studio