Error de Android MediaPlayer (1, -2147483648)

83

Tengo dos videos diferentes que estoy tratando de cargar en un VideoViewuso

videoView.setVideoURI(Uri.parse(url));

Los dos videos, que sean video 1 y video 2 , tienen las siguientes especificaciones (extraídas usando ffmpeg -i); de hecho, son dos codificaciones diferentes del mismo video:

  1. Video 1:

    Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '4fbfd5ece4b0932236fc234d.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp42isomavc1
        creation_time   : 2011-12-03 04:43:46
        genre           : Trailer
        artist          : Paramount Pictures
        title           : Captain America: The First Avenger - Theatrical Trailer #2
        encoder         : HandBrake 4344svn 2011111001
        date            : 2011
      Duration: 00:02:30.67, start: 0.000000, bitrate: 6738 kb/s
        Stream #0.0(und): Video: h264 (High), yuv420p, 1920x800 [PAR 1:1 DAR 12:5], 6575 kb/s, 23.97 fps, 90k tbr, 90k tbn, 180k tbc
        Metadata:
          creation_time   : 2011-12-03 04:43:46
        Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 159 kb/s
        Metadata:
          creation_time   : 2011-12-03 04:43:46
    
  2. Video 2:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '500416ea44aeb4b95d5ae8a0_hd.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        creation_time   : 2011-12-03 04:43:46
        title           : Captain America: The First Avenger - Theatrical Trailer #2
        artist          : Paramount Pictures
        date            : 2011
        encoder         : Lavf53.32.100
        genre           : Trailer
      Duration: 00:02:30.69, start: 0.000000, bitrate: 2045 kb/s
        Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 27:20 DAR 12:5], 1889 kb/s, 23.99 fps, 90k tbr, 180k tbn, 180k tbc
        Metadata:
          creation_time   : 2011-12-03 04:43:46
        Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 151 kb/s
        Metadata:
          creation_time   : 2011-12-03 04:43:46
    

Soy consciente de que Honeycomb incluía compatibilidad con AAC y, por lo tanto, probé los videos con varios dispositivos; Los resultados se dan a continuación:

  1. SGS II with custom 4.0.3 OS(Sensation ROM 3.4 with CF-Root kernel) - Video 1:OK - Video2:OK
  2. SGS I with Samsung 2.3.3 OS - Video 1:error (1, -2147483648) - Video 2:OK
  3. SGS I with custom 4.0.3 OS(ICS SGS TEAM ROM with Devil kernel) - Video 1:error (1, -2147483648) - Video 2:OK
  4. Nexus One with original 2.3.6 OS - Video 1:See (1) below - Video 2:See (2) below
  5. Emulator with 2.2 OS - Video 1:error (1, -2147483648) - Video 2:error (1, -2147483648)
  6. Emulator with 4.0.3 OS - Video 1:error (1, -2147483648) - Video 2:error (1, -2147483648)

Ambos videos se reproducen bien en Google Chrome en una PC. Puede ser útil agregar que, en el caso correcto, el video y el audio se reproducen correctamente. En el caso del error (1, -2147483648), se arroja el mismo registro desde todos los dispositivos (excepto Nexus One):

07-18 10:25:10.996: I/MediaPlayer(17860): uri is:http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4
07-18 10:25:10.996: I/MediaPlayer(17860): path is null
07-18 10:25:10.996: D/MediaPlayer(17860): Couldn't open file on client side, trying server side
07-18 10:25:39.859: D/MediaPlayer(17860): getMetadata
07-18 10:25:45.070: E/MediaPlayer(17860): error (1, -2147483648)
07-18 10:25:45.074: E/MediaPlayer(17860): Error (1,-2147483648)
07-18 10:25:45.078: D/VideoView(17860): Error: 1,-2147483648

En el caso (1), el siguiente registro se emite desde Nexus One y el video nunca se carga:

07-18 13:49:20.115: D/MediaPlayer(10109): Couldn't open file on client side, trying server side
07-18 13:49:20.115: I/StagefrightPlayer(68): setDataSource('http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4')
07-18 13:49:20.135: I/NuHTTPDataSource(68): connect to s3-eu-west-1.amazonaws.com:80/cf-templates-k6ohn88yswx5-eu-west-1/videos/4fbc88e7e4b0b0896e877764/4fbfd5ece4b0932236fc234d.mp4 @0
07-18 13:49:20.155: I/ActivityManager(98): Displayed com.woisio/.video.VideoActivity: +450ms
07-18 13:49:20.795: I/NuCachedSource2(68): Keep alive
07-18 13:49:22.185: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 4 buffers of size 460800 on input port
07-18 13:49:22.195: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 8 buffers of size 2304000 on output port
07-18 13:49:25.325: D/dalvikvm(9499): GC_EXPLICIT freed 13K, 50% free 2726K/5379K, external 1625K/2137K, paused 116ms
07-18 13:49:27.525: I/NuCachedSource2(68): Keep alive
07-18 13:49:28.235: I/NuCachedSource2(68): Cache full, done prefetching for now
07-18 13:49:30.275: D/dalvikvm(9902): GC_EXPLICIT freed 8K, 50% free 2714K/5379K, external 1625K/2137K, paused 69ms
07-18 13:49:34.255: D/Finsky(9066): [1] 5.onFinished: Installation state replication succeeded.
07-18 13:49:35.855: I/NuCachedSource2(68): Keep alive
07-18 13:49:39.055: D/dalvikvm(9911): GC_EXPLICIT freed 22K, 50% free 2710K/5379K, external 1625K/2137K, paused 38ms
07-18 13:49:42.575: I/NuCachedSource2(68): Keep alive
07-18 13:49:43.285: I/NuCachedSource2(68): Keep alive
07-18 13:49:44.095: D/dalvikvm(9918): GC_EXPLICIT freed 7K, 50% free 2708K/5379K, external 1625K/2137K, paused 66ms
07-18 13:49:49.085: D/dalvikvm(9925): GC_EXPLICIT freed 15K, 49% free 3268K/6407K, external 1625K/2137K, paused 50ms
07-18 13:49:50.925: I/NuCachedSource2(68): Keep alive
07-18 13:49:54.115: D/dalvikvm(6756): GC_EXPLICIT freed 9K, 44% free 3774K/6727K, external 1625K/2137K, paused 77ms
07-18 13:49:57.685: I/NuCachedSource2(68): Keep alive
07-18 13:49:58.375: I/NuCachedSource2(68): Keep alive
07-18 13:49:59.105: D/dalvikvm(9066): GC_EXPLICIT freed 385K, 53% free 3186K/6727K, external 1625K/2137K, paused 66ms
07-18 13:50:05.955: I/NuCachedSource2(68): Keep alive
07-18 13:50:06.045: D/dalvikvm(8047): GC_EXPLICIT freed 9K, 47% free 3830K/7111K, external 1625K/2137K, paused 86ms
07-18 13:50:09.465: I/3gw.Service(488): Mobile Network not connected - not roaming
07-18 13:50:12.765: I/NuCachedSource2(68): Keep alive
07-18 13:50:13.465: I/NuCachedSource2(68): Keep alive
07-18 13:50:18.775: I/WindowManager(98): Setting rotation to 3, animFlags=0
07-18 13:50:18.795: I/ActivityManager(98): Config changed: { scale=1.0 imsi=286/2 loc=en_US touch=3 keys=1/1/2 nav=3/1 orien=2 layout=34 uiMode=17 seq=34}
07-18 13:50:18.895: D/dalvikvm(169): GC_EXTERNAL_ALLOC freed 108K, 48% free 3253K/6215K, external 5172K/5180K, paused 37ms
07-18 13:50:21.005: I/NuCachedSource2(68): Keep alive
07-18 13:50:21.265: D/dalvikvm(98): GC_EXPLICIT freed 394K, 42% free 6631K/11335K, external 4458K/5567K, paused 109ms

En el caso (2), el siguiente registro se arroja desde Nexus One y, como puede ver, termina con un error (1, -2147483648):

07-18 13:47:03.595: D/MediaPlayer(10059): Couldn't open file on client side, trying server side
07-18 13:47:03.595: I/StagefrightPlayer(68): setDataSource('http://s3-eu-west-1.amazonaws.com/cf-templates-k6ohn88yswx5-eu-west-1/videos/4ff4514444aec3d2f9f07ead/500416ea44aeb4b95d5ae8a0_hd.mp4')
07-18 13:47:03.605: I/NuHTTPDataSource(68): connect to s3-eu-west-1.amazonaws.com:80/cf-templates-k6ohn88yswx5-eu-west-1/videos/4ff4514444aec3d2f9f07ead/500416ea44aeb4b95d5ae8a0_hd.mp4 @0
07-18 13:47:03.625: I/ActivityManager(98): Displayed com.woisio/.video.VideoActivity: +505ms
07-18 13:47:05.355: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 4 buffers of size 460800 on input port
07-18 13:47:05.355: I/OMXCodec(68): [OMX.qcom.video.decoder.avc] allocating 8 buffers of size 1382400 on output port
07-18 13:47:05.365: I/NuCachedSource2(68): Keep alive
07-18 13:47:08.375: D/MediaPlayer(10059): getMetadata
07-18 13:47:08.745: D/dalvikvm(9925): GC_EXPLICIT freed 651K, 49% free 3275K/6407K, external 1625K/2137K, paused 68ms
07-18 13:47:09.205: I/3gw.Service(488): Mobile Network not connected - not roaming
07-18 13:47:11.565: I/NuCachedSource2(68): Cache full, done prefetching for now
07-18 13:47:12.095: I/NuCachedSource2(68): Keep alive
07-18 13:47:14.245: W/QCvdec(68): H264_Utils::check_header 
07-18 13:47:14.245: W/QCvdec(68): check_header: start code 33
07-18 13:47:14.245: W/QCvdec(68): H264_Utils::check_header 
07-18 13:47:14.245: W/QCvdec(68): check_header: start code 10
07-18 13:47:14.245: W/QCvdec(68): Parsing Error unsupported profile or level
07-18 13:47:14.245: W/QCvdec(68): ETB in Invalid State
07-18 13:47:14.245: E/OMXCodec(68): [OMX.qcom.video.decoder.avc] ERROR(0x8000100a, 0)
07-18 13:47:14.245: E/MediaPlayer(10059): error (1, -2147483648)
07-18 13:47:14.285: E/MediaPlayer(10059): Error (1,-2147483648)
07-18 13:47:14.285: D/VideoView(10059): Error: 1,-2147483648

Por lo que he leído, el error (1, -2147483648) puede corresponder a códecs no compatibles, metadatos corruptos o encabezados de archivo incorrectos. Si es así, ¿podría indicarme la dirección correcta para utilizar qué códec? Gracias.

Ayberk Özgür
fuente
2
¿Obtuviste la transmisión de videos en todos los dispositivos? ¿Puede compartir sus hallazgos conmigo? Estoy teniendo el mismo problema. Los videos funcionan en algunos dispositivos y en algunos no.
Adil Malik

Respuestas:

108

Solo para aclarar algo para cualquiera que lea esta pregunta basada en el título.

Al mirar el valor de error (1, -2147483648), el valor '1' corresponde a la constante en MediaPlayer.MEDIA_ERROR_UNKNOWN .

-2147483648 corresponde al hexadecimal 0x80000000 que se define como UNKNOWN_ERROR en frameworks / native / include / utils / errors.h

Esto muestra que la fuente del error es difícil de precisar, ya que es un valor de retorno bastante genérico, provocado por problemas de compatibilidad y códec como se mencionó anteriormente, pero también cancelaciones de subprocesos y varios otros tipos.

Para su problema, recomendaría consultar los formatos multimedia compatibles con Android con versiones de Android compatibles y ver si el tipo de codificación es la causa de su problema, pero como se mencionó anteriormente, la respuesta de error desconocido puede deberse a una serie de problemas.

sturrockad
fuente
1
¿Cuál es la solución? ¿No tienes? No entiendo claramente a qué te refieres. Entonces, ¿solo necesita cambiar encodero debería eliminar encoder?
Torre Huy
@MirrorTowers: En mi caso, en algunos dispositivos no tenía permiso para leer los archivos a pesar de que fue mi aplicación quien los creó, después de descargarlos de un servidor y ponerlos en la carpeta de caché de la aplicación. Intente cambiar los permisos de lectura.
nonzaprej
2
Recibí este error al transmitir un recurso desde https en 3.0. Parece que HTTPS solo es compatible con Android 3.1 en adelante
QuantumTiger
Como actualización, ahora también se define explícitamente como 'MEDIA_ERROR_SYSTEM (-2147483648) - error del sistema de bajo nivel'. en la documentación en línea de Android para MediaPlayer (en el momento de escribir este artículo): developer.android.com/reference/android/media/… - no necesariamente ayuda tanto, pero al menos está ahí explícitamente ...
Mick
27

Me enfrentaba al mismo error en Android P (Pixel 2 XL), pero todo lo que tenía que hacer era poner android:usesCleartextTraffic="true"la AndroidManifest.xmletiqueta de mi aplicación.

Rod Lima
fuente
No puedo ayudarte con eso. MediaPlayer no es confiable, me gustaría recomendarle que use ExoPlayer github.com/google/ExoPlayer
Rod Lima
7

Para la transmisión, el sitio de Android tiene una nota:

Para contenedores 3GPP y MPEG-4, el átomo moov debe preceder a cualquier átomo mdat, pero debe suceder al átomo ftyp.

Recibí el mismo error antes de mover el moovátomo. Para solucionar este problema, puede utilizar mp4Box con este comando:

MP4Box -hint output.mp4 

La mayoría de mis videos se pueden transmitir después de eso. Si no funciona, intente esto con ffmpeg:

ffmpeg -i input.flv -f mp4 -vcodec libx264 -vprofile baseline -acodec libfaac -ar 16k -ab 32k output.mp4
MP4Box -hint output.mp4 

Hay otras herramientas que puede encontrar aquí .

Trung Nguyen
fuente
2

También obtengo el mismo MEDIA_ERROR_UNKNOWN error para reproducir video (rtsp).

En mi caso, tengo problemas con mi wifi. Algunas razones de seguridad wifi está restringido para el protocolo RTSP. Entonces me enfrento a este problema de error MEDIA_ERROR_UNKNOWN. Una vez verifique con sus permisos de red.

Cuando cambio a datos móviles para reproducir videos, me funciona bien. Puede ser que esto sea útil para quienes enfrentan el mismo tipo de error :).

Anshu
fuente
2

Tenga cuidado con el tipo de medio de soporte y la resolución de su dispositivo. Errorerror (1, -2147483648) suelen aparecer cuando su dispositivo no admite el tipo de medio de video, los códecs o la resolución.

Consulte el tipo de medio compatible con Android en la documentación:

https://developer.android.com/guide/appendix/media-formats.html

Por ejemplo, podemos notar que los dispositivos por encima de 3.0 admiten .mp4, pero no todos admiten HD 720p.

Renaud Boulard
fuente
1

Tuve un problema similar. En mi caso, el video se reproduciría bien cuando lo descargué al teléfono primero y luego lo reproduje. Pero cuando intenté usar HTTP progresivo, obtendría el mismo error anotado en el OP.

Verifiqué que los átomos ftyp, moov y mdat estaban en el orden correcto. Resultó que el problema era el valor del campo ftyp. Estaba configurado en 'qt'. Usé MP4Box para extraer las pistas y crear un nuevo archivo mp4 que tenía el ftyp configurado en 'isom'. Este nuevo archivo funcionó bien para HTTP progresivo.

jdramer
fuente
1

Resolví esto de manera similar a como se indica en la respuesta de @ nam-trung, sin embargo, como mis videos ya eran h264 y mp4, todo lo que tenía que hacer era ejecutar lo siguiente en cada archivo:

ffmpeg -i input.mp4 -vprofile baseline output.mp4

Después de eso, todos los videos funcionaron en VideoView cuando se ejecutaron en todos los dispositivos que probé ejecutando API v19 a v25.

MattMatt
fuente
0

En mi caso, el error se debió a que el reproductor multimedia no tenía permisos de archivo en el video almacenado localmente. Intente almacenar el video en el /mnt/sdCARDdirectorio.

droide
fuente
2
No puedo almacenar el video, debe transmitirse desde un servidor externo.
Ayberk Özgür
0

Estaba enfrentando el mismo problema, pero lo que hice de mi lado es

Primero detengo el reproductor multimedia y luego lo lanzo.

mMediaPlayer.stop (); mMediaPlayer.release ();

sharma_kunal
fuente
-1

En mi caso, este problema fue causado por una URL multimedia con espacios. Aquí está la solución:

mMediaPlayer.setDataSource(source.replaceAll(" ", "%20"));
Lee Hounshell
fuente
La aplicación Android Universal Media Player (UAMP) hace esto. La solución para que funcione para URL como las de cbsrmt.com se muestra correctamente arriba.
Lee Hounshell
-1

si está usando firebase, entonces debe copiar la ruta (o url) de 1: Download Url que contiene https: // firebasestorage .............

no desde el lugar de almacenamiento

2: <uses-permission android:name="android.permission.INTERNET" /> agregue este permiso en la etiqueta de manifiesto dentro de la carpeta de manifiesto

dentro de las reglas de almacenamiento

Dentro de las Reglas de almacenamiento:

rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
 allow read, write: if true;
  }  
 }  
 }
Nitesh Yadav
fuente