Eroare Android MediaPlayer (1, -2147483648) (Programare, Android, Media Player, Android Videoview)

Ayberk Özgür a intrebat.

Am două videoclipuri diferite pe care încerc să le încarc într-un fișier VideoView utilizând

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

Cele două videoclipuri, să fie video 1 și video 2, au următoarele specificații (extrase cu ajutorul aplicației ffmpeg -i); de fapt, acestea sunt două codificări diferite ale aceluiași videoclip:

  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
    

Sunt conștient de faptul că suportul AAC a venit odată cu Honeycomb și, prin urmare, am testat videoclipurile cu mai multe dispozitive; rezultatele sunt prezentate mai jos:

  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)

Ambele videoclipuri se redau bine în Google Chrome pe un PC. Ar putea fi util să adaug că, în cazul OK, atât videoclipul, cât și sunetul sunt redate corect. În cazul de eroare (1, -2147483648), același jurnal este emis de toate dispozitivele (cu excepția 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

În cazul (1), următorul jurnal este emis de Nexus One, iar videoclipul nu se încarcă niciodată:

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

În cazul (2), următorul jurnal este emis de Nexus One și, după cum puteți vedea, se termină cu o eroare (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

Din ceea ce am citit, eroarea (1, -2147483648) poate corespunde unor codecuri neacceptate, metadate corupte sau anteturi de fișier incorecte. Dacă este așa, puteți să-mi indicați în ce direcție să folosesc care codec? Vă mulțumim.

Comentarii

  • Ați reușit să transmiteți videoclipurile pe toate dispozitivele? Poți să îmi împărtășești concluziile tale? Am aceeași problemă. Videoclipurile funcționează pe câteva dispozitive și pe altele nu. –  > Por Adil Malik.
12 răspunsuri
sturrockad

Doar pentru a clarifica ceva pentru oricine citește această întrebare pe baza titlului.

Atunci când ne uităm la valoarea erorii (1, -2147483648), valoarea „1” corespunde constantei din MediaPlayer.MEDIA_ERROR_UNKNOWN.

-2147483648 corespunde valorii hexazecimale 0x80000000 care este definită ca UNKNOWN_ERROR în frameworks/native/include/utils/Errors.h

Acest lucru arată că sursa erorii este greu de identificat, deoarece este o valoare de retur destul de generică, generată de probleme de codec și compatibilitate, după cum s-a menționat mai sus, dar și de anularea firelor de execuție și de alte câteva tipuri.

Pentru problema dvs., v-aș recomanda să consultați Formate media acceptate de Android cu versiunile Android compatibile și să vedeți dacă tipul de codificare este cauza problemei dumneavoastră, dar, așa cum am menționat mai sus, răspunsul Unknown Error poate fi cauzat de mai multe probleme.

Comentarii

  • Care este soluția? Nu aveți? Nu înțeleg clar ce vrei să spui. Deci, trebuie doar să schimbați encoder sau ar trebui să eliminați encoder? –  > Por Huy Tower.
  • @MirrorTowers: În cazul meu, pe unele dispozitive nu aveam permisiunea de a citi fișierele, deși aplicația mea era cea care le crease, după ce le descărcase de pe un server și le pusese în folderul cache al aplicației. Încearcă să schimbi permisiunile de citire. –  > Por nonzaprej.
  • Am primit această eroare când am transmis o resursă din https pe 3.0. Se pare că HTTPS este suportat doar de la Android 3.1 încoace –  > Por QuantumTiger.
  • Ca o actualizare – acest lucru este acum, de asemenea, definit în mod explicit ca „MEDIA_ERROR_SYSTEM (-2147483648) – eroare de sistem de nivel scăzut.” în documentația online Android pentru MediaPlayer (la momentul redactării): developer.android.com/reference/android/media/… – nu ajută neapărat atât de mult, dar cel puțin este acolo în mod explicit… –  > Por Mick.
Rod Lima

M-am confruntat cu aceeași eroare pe Android P (Pixel 2 XL), dar tot ce a trebuit să fac a fost să pun android:usesCleartextTraffic="true" pe pagina mea AndroidManifest.xml tag-ul aplicației.

Comentarii

  • Nu te pot ajuta cu asta. MediaPlayer nu este de încredere, aș dori să vă recomand să utilizați ExoPlayer github.com/google/ExoPlayer –  > Por Rod Lima.
Trung Nguyen

Pentru streaming, site-ul Android are o notă:

Pentru containerele 3GPP și MPEG-4, atomul moov trebuie să preceadă orice atomi mdat, dar trebuie să urmeze atomul ftyp.

Am primit aceeași eroare înainte de a muta moov atom. Pentru a remedia acest lucru, puteți utiliza mp4Box cu această comandă:

MP4Box -hint output.mp4 

Majoritatea videoclipurilor mele pot rula după aceea. Dacă nu funcționează, încercați acest lucru cu ffmpeg:

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

Există și alte instrumente pe care le puteți găsi aici.

Anshu

Sunt, de asemenea, obtinerea același MEDIA_ERROR_UNKNOWN problemă de eroare pentru redarea video (rtsp).

În cazul meu, am găsit problema cu wifi-ul meu. Din anumite motive de securitate, wifi este restricționat pentru protocolul RTSP. Așa că mă confrunt cu această problemă de eroare MEDIA_ERROR_UNKNOWN. Verificați odată cu permisiunile de rețea.

Când mă mut la datele mobile pentru a reda video, funcționează bine pentru mine. poate că acest lucru va fi de ajutor pentru oricine se confruntă cu același tip de eroare :).

Renaud Boulard

Aveți grijă de tipul de suport media și de rezoluția dispozitivului dvs. Eroare error (1, -2147483648) deseori, apar atunci când tipul de suport video, codecurile sau rezoluția nu sunt acceptate de dispozitivul dvs.

Verificați tipul de media suportat de Android în documentație :

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

De exemplu, putem observa că dispozitivele de peste 3.0 acceptă .mp4, dar nu toate suportă HD 720p.

jdramer

Am avut o problemă similară. În cazul meu, videoclipul se reda fără probleme atunci când îl descărcam mai întâi pe telefon și apoi îl redam. Dar când am încercat să folosesc Progressive HTTP, am primit aceeași eroare menționată în OP.

Am verificat dacă atomii ftyp, moov și mdat erau în ordinea corectă. S-a dovedit că problema era valoarea câmpului ftyp. Acesta era setat la „qt ‘. Am folosit MP4Box pentru a extrage piesele și a crea un nou fișier mp4 care avea ftyp setat la ‘isom’. Acest nou fișier a funcționat bine pentru Progressive HTTP.

MattMatt

Am rezolvat acest lucru în mod similar cu modul indicat în răspunsul lui @nam-trung, totuși, deoarece videoclipurile mele erau deja h264 și mp4 tot ce a trebuit să fac a fost să execut următoarele pe fiecare fișier:

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

După aceea, toate videoclipurile au funcționat în VideoView atunci când au fost rulate pe toate dispozitivele pe care le-am testat și care rulează API v19 până la v25.

Vojtanos

Dacă utilizați MediaPlayer pentru redarea audio, acesta a fost cazul de eroare pentru mine:

La executarea .setDataSource() argumentul pe care l-am transmis a fost un șir de caractere cu calea către fișierul dat. Acest lucru duce la tot felul de excepții pentru care nu am reușit să găsesc motive particulare. Cu toate acestea, atunci când a fost schimbat în FileDescriptor, în conformitate cu Android Developers – Metoda .setDataSource(), s-a rezolvat.
Primesc FileDescriptor obiect din FileInputStream.
Iată codul:

val player: MediaPlayer = MediaPlayer()
fun playRecording() {
    try {
        replayFileStream = FileInputStream(path)
        val fd = replayFileStream?.fd
        player.setDataSource(fd)
        player.prepareAsync()
        // start should be called from onPreparedListener
     } catch (e: Exception) {
        // catch exceptions
     }
 }

Începutul efectiv al redării este gestionat în OnPreparedListener așa cum se sugerează, de exemplu, aici: Android Media Player: Start apelat în starea 4 error(-38,0).
Configurația ascultătorului este următoarea:

player.setOnPreparedListener(object: MediaPlayer.OnPreparedListener {
    override fun onPrepared(player:MediaPlayer) {
        player.start()
    }
})

droiding

În cazul meu, eroarea s-a datorat faptului că mediaplayer nu avea permisiuni de fișier pentru videoclipul stocat local. Încercați să stocați videoclipul pe fișierul /mnt/sdCARD director.

Comentarii

  • Nu pot stoca videoclipul, acesta trebuie să fie transmis de pe un server extern. –  > Por Ayberk Özgür.
sharma_kunal

M-am confruntat cu aceeași problemă, dar ceea ce am făcut pe partea mea este

În primul rând am oprit media player-ul și apoi l-am eliberat.

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

Lee Hounshell

În cazul meu, această problemă a fost cauzată de un URL media cu spații! Iată soluția:

mMediaPlayer.setDataSource(source.replaceAll(" ", "%20"));

Comentarii

  • Aplicația Android Universal Media Player (UAMP) face acest lucru. Rezolvarea pentru a o face să funcționeze pentru URL-uri precum cele de la cbsrmt.com este corect prezentată mai sus. –  > Por Lee Hounshell.
Nitesh Yadav

dacă folosiți firebase , atunci ar trebui să copiați calea (sau adresa URL) de la 1: Url de descărcare care conține https://firebasestorage………….

nu din locația de stocare

2 : <uses-permission android_name="android.permission.INTERNET" />adăugați această permisiune în tag-ul manifest din interiorul folderului manifest

în interiorul Regulilor de stocare

în interiorul Reguli de stocare :

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