Android VideoView error (1,16) y muestra la pantalla en negro

Tengo una aplicación con un VideoView que está reproduciendo un archivo mp4 desde el almacenamiento interno (mi directorio de files paquetes)

En algunos dispositivos Samsung Epic Touch 4g (Galaxy SII) en lugar del video que se muestra la pantalla es totalmente negro. Todo lo demás en mi aplicación se comporta y responde normalmente para que el dispositivo no se "congela" en absoluto, es sólo mostrar sólo negro en la pantalla en lugar del vídeo.

Para iniciar mi video estoy usando una devolución de llamada onPreparedListener para hacer la llamada a start ():

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { mVideoView.start(); } }); 

Y configuro el video para que se reproduzca con esta llamada:

 //file is the reference to my video File object. //I am positive that it is correct mVideoView.setVideoPath(file.getAbsolutePath()); 

Tengo un conjunto onErrorListener como este:

 mVideoView.setOnErrorListener(new OnErrorListener(){ @Override public boolean onError(MediaPlayer arg0, int arg1, int arg2) { Log.i(myTag, "MP ERROR: "+ arg1 + " - " + arg2); /* I have also tried this here, no luck this way either mVideoView.setVideoPath(file.getAbsolutePath()); return true; */ return false; } }); 

Tras una inspección más cercana me di cuenta de que mi onErrorListener no está recibiendo una devolución de llamada en absoluto.

Mientras la oscuridad está en la pantalla, el Log se está volviendo spam con estos mensajes una y otra vez:

 V/PlayerDriver(2579): HandleInformationalEvent: PVMFInfoProcessingFailure V/PlayerDriver(2579): HandleInformationalEvent: type=16 UNHANDLED E/MFC_DEC_APP(2579): SsbSipMfcDecExe] IOCTL_MFC_DEC_EXE failed(ret : -2001) E/PVMFOMXVideoDecNode(2579): Ln 1652 OMX_EventError nData1 -2147479541 nData2 0 

Y (a veces las líneas siguientes son iterspersed con el spam de las líneas anteriores 4. Pero otras veces estos dos obtener spam por sí mismos después de varias iteraciones de spam de los anteriores 4.)

 W/MediaPlayer(30537): info/warning (1, 16) I/MediaPlayer(30537): Info (1,16) 

No creo que sea un problema de codificación con mi video (AVC MP4) porque el mismo video funciona exactamente en algunos dispositivos Epic Touch 4g (incluso algunos en la misma versión del sistema operativo). Y he utilizado el mismo vídeo en el pasado en este dispositivo, estos problemas comenzaron a suceder cuando el dispositivo se actualizó a la versión del sistema operativo 2.3.6.

¿Puede alguien arrojar algo de luz sobre los errores OMX / MFC que estoy viendo? ¿O alguien más ha tenido un problema con VideoView mostrando sólo una pantalla en negro en lugar del video? Finalmente hay alguna otra manera que debería estar iniciando la preparación / reproducción de mi archivo de vídeo que no podría resultar en estos errores y la pantalla en negro?

EDIT: He encontrado en este archivo que la advertencia # 16 es:

 /* Notification that a processing failure occurred (not fatal error) */ const PVMFStatus PVMFInfoProcessingFailure = 16; 

Que se supone que es un error no fatal. Que supongo que no se está estrellando por lo que no es "fatal", pero lo que está pasando está causando mi video no se muestra correctamente.

EDIT 2: algunos registros más del dispositivo mientras se inicia el vídeo. Todos estos vienen antes del spam de los anteriores:

 D/PowerManagerService(2677): acquireWakeLock flags=0xa tag=KEEP_SCREEN_ON_FLAG uid=1000 pid=2677 myUID=1000 myPID=2677 myTID=23672 I/ALSAModule(2579): Initialized ALSA PLAYBACK device hifi W/AudioFlinger(2579): write blocked for 99 msecs, 318 delayed writes, thread 0x61a00 I/libfimc(2677): bool SecFimc::create(SecFimc::FIMC_DEV, fimc_overlay_mode, unsigned int):: Fimc reserved memory =0x57da0000 E/Surface(6585): Surface::init token -2 identity 3401 E/action=%s(2677): com.android.music.musicservicecommand D/AudioService(2677): musicservicecommand E/MediaPlayer-JNI(6585): setDataSource: outside path in JNI is ?x@ I/WindowManager(2677): CREATE SURFACE Surface(name=SurfaceView, identity=3401, mNativeSurface=0) IN SESSION android.view.SurfaceSession@40825e90: pid=6585 format=4 flags=0x200 / Window{40bbc478 SurfaceView paused=false} D/MediaPlayerService(2579): getPlayerType. Ln=935 D/MediaPlayerService(2579): createPlayer. type=1 D/MediaPlayerService(2579): create PVPlayer V/PlayerDriver(2579): PVSuspensionState struct constructor V/PVPlayer(2579): PVPlayer constructor V/PVPlayer(2579): construct PlayerDriver V/PlayerDriver(2579): constructor V/PlayerDriver(2579): OpenCore hardware module not found V/PlayerDriver(2579): start player thread V/PlayerDriver(2579): startPlayerThread V/PlayerDriver(2579): InitializeForThread V/PlayerDriver(2579): OMX_MasterInit V/PlayerDriver(2579): OsclScheduler::Init V/PlayerDriver(2579): CreatePlayer D/(2579): SISO TEST registering PVMFRecognizerPluginFactory D/(2579): SISO TEST registering PVMFRecognizerPluginFactory success V/PlayerDriver(2579): AddToScheduler V/PlayerDriver(2579): PendForExec V/PlayerDriver(2579): OsclActiveScheduler::Current V/PlayerDriver(2579): StartScheduler V/PVPlayer(2579): send PLAYER_SETUP V/PlayerDriver(2579): Send player code: 2 V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_SETUP status=PVMFSuccess V/PVPlayer(2579): setVideoSurface(0x46b0d0) V/PVPlayer(2579): setVideoSurface(0x2d8cd0) V/PVPlayer(2579): prepareAsync D/ViewRoot(3990): handleAppVisibility:TN_USA_U1_SPR V/PlayerDriver(2579): Send player code: 3 V/PlayerDriver(2579): handleSetDataSource V/PlayerDriver(2579): handleSetDataSource- scanning for extension V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_SET_DATA_SOURCE status=PVMFSuccess V/PVPlayer(2579): run_init s=0, cancelled=0 V/PlayerDriver(2579): Send player code: 6 V/PlayerDriver(2579): release string is 2.3.6 len 5 V/PlayerDriver(2579): HandleInformationalEvent: PVMFInfoDurationAvailable V/PlayerDriver(2579): .... with duration = 168483 ms V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_INIT status=PVMFSuccess V/PlayerDriver(2579): dongju PlayerCommand::PLAYER_INIT enter V/PlayerDriver(2579): File EXT is : .mp4 E/PlayerDriver(2579): PlayerDriver::it is a not Protected file V/PlayerDriver(2579): PlayerCommand::PLAYER_INIT exit V/PVPlayer(2579): run_set_video_surface s=0, cancelled=0 V/PlayerDriver(2579): Send player code: 4 W/PlayerDriver(2579): Using generic video MIO V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_SET_VIDEO_SURFACE status=PVMFSuccess V/PVPlayer(2579): run_set_audio_output s=0, cancelled=0 V/PlayerDriver(2579): Send player code: 5 V/PlayerDriver(2579): Create realtime output V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_SET_AUDIO_SINK status=PVMFSuccess V/PVPlayer(2579): run_prepare s=0, cancelled=0 V/PlayerDriver(2579): Send player code: 7 V/PlayerDriver(2579): disable natpkt - 0 I/MFC_DEC_APP(2579): [SsbSipMfcDecOpen] MFC Library Ver 1.00 I/MFC_DEC_APP(2579): [SsbSipMfcDecOpen] handle(61) V/PlayerDriver(2579): HandleInformationalEvent: UNKNOWN PVMFStatus V/PlayerDriver(2579): HandleInformationalEvent: type=44 UNHANDLED W/MediaPlayer(6585): info/warning (1, 44) I/MediaPlayer(6585): Info (1,44) V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_PREPARE status=PVMFSuccess V/PlayerDriver(2579): PLAYER_PREPARE complete mDownloadContextData=0x0, mDataReadyReceived=0 D/MediaPlayer(6585): getMetadata V/PVPlayer(2579): setLooping(0) V/PVPlayer(2579): check_for_live_streaming s=0, cancelled=0 V/PlayerDriver(2579): Send player code: 12 V/PVPlayer(2579): setLooping(0) V/PlayerDriver(2579): Send player code: 12 E/PVPlayer(2579): isDrmfile playing 0 E/PVPlayer(2579): OPLBlocked = 0 E/MediaPlayerService(2579): MediaPlayerService::mIsAnyDrmVideoPlaying : 0 E/MediaPlayerService(2579): MediaPlayerService::mpCheckOPLBlocked : 0 V/PVPlayer(2579): start E/AudioPolicyManager(2579): getParamFromPolicy D/AudioPolicyManager(2579): mCurDevice is 2 V/AudioPolicyManager(2579): getDeviceForStrategy() strategy 0, device 2 V/AudioPolicyManager(2579): getNewDevice() selected device 2 I/FmRadioController(2677): Jni player_SetVolume :7 I/FmRadioController(2677): ---Jni player_SetVolume--- V/PlayerDriver(2579): Send player code: 8 V/PlayerDriver(2579): dongju handleStart E/PlayerDriver(2579): PlayerDriver::handleTvOut state=[1] E/PlayerDriver(2579): PlayerDriver::it is not a DRM file.So don't suspend TVOUT V/PlayerDriver(2579): CommandCompleted V/PlayerDriver(2579): Completed command PLAYER_START status=PVMFSuccess 

Una vez tuve un problema similar, y lo superé recargando la actividad cuando recibí un error en mi devolución de llamada. Al principio funcionó, pero más tarde siguió fallando, lo que provocó un reinicio infinito de la actividad. Entonces decidí poner una imagen en lugar del video en tales casos (realmente no era tan importante).

Vale la pena el intento supongo … Si usted no recibe ninguna devolución de llamada a su onErrorListener, sólo ejecutarlo 5 segundos después de la actividad está viva, para probar si resuelve su problema.

Este es el código que escribí para volver a cargar una actividad:

 public void reload(String boolExtra) { Intent intent = getIntent(); overridePendingTransition(0, 0); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); finish(); overridePendingTransition(0, 0); startActivity(intent); } 

Otro enfoque que puedo sugerir – jugar con los códecs. Sé que funciona bien en otros dispositivos, pero nunca se puede saber si el códec para este dispositivo específico, que viene con esta versión específica de Android, tiene un error. Trate de cambiar sus dimensiones también.

La mejor de las suertes 🙂

 File filepath = new File(Environment.getExternalStorageDirectory()+"/Video/"+"abc_video.mp4"); Uri path = Uri.fromFile(filepath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "video/*"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Utilice esto para ejecutar su video, creo que su problema sería resuelto.

Dado que usted ha dicho que reiniciar la actividad a veces funciona, yo apostaría a que es un desencadenador de eventos multi-threaded que normalmente se produce antes de que su detector onPrepared () se dispara, pero no siempre en el caso de los teléfonos específicos causando problemas. No podría decir cuando usted realmente prepara el vídeo para ser jugado, pero estoy adivinando que está en onCreate (). Si es así, recomendaría probar el siguiente mecanismo:

En su clase de actividad, cree un miembro booleano así:

 protected boolean bMyVideoIsReady = false; 

Una vez que tenga eso, modifique su escucha:

  mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { if (MyActivity.this.bMyVideoIsReady) mVideoView.start(); else MyActivity.this.bMyVideoIsReady = true; } }); 

Una vez que las modificaciones están en su lugar, añada lo siguiente al onResume () de su actividad:

 @Override protected void onResume() { super.onResume(); if (bMyVideoIsReady) mVideoView.start(); else bMyVideoIsReady = true; } 

Lo que esto logrará es que si el video se carga antes de que la Actividad esté lista para empezar a reproducirlo, su oyente simplemente establecerá la bandera booleana en TRUE y luego onResume () verá el indicador establecido y comenzará a reproducir su video. Si onResume () se llama antes de que el video termine de cargar, entonces simplemente establecerá el indicador y ahora su oyente lo verá y comenzará a reproducir el video en ese momento. De esta forma, tu video no comenzará a reproducirse antes de que la Actividad esté lista y espero que impida esta extraña conducta que estás presenciando.

  • VideoView en Viewpager, detener el vídeo al cambiar de página
  • Error de MediaPlayer de Android (1, -2147483648)
  • Añadir vista en la parte superior de MediaController
  • ¿Por qué el tamaño de la vista de video cambió automáticamente dependiendo del tamaño del video?
  • VideoView Flujo de carga insuficiente
  • Android: El servidor de DrmManager murió
  • Error al eliminar el fragmento que contiene videoView en 4.0.4
  • Mover vídeo ... usar animación de traducción
  • ¿Cómo puedo reproducir video rtsp desde el servidor wowza?
  • Cómo prebuffer VideoView A mientras otro VideoView B está jugando - Android
  • Video en línea no se reproduce
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.