Android MediaPlayer-Fehler (1, -2147483648)

84

Ich habe zwei verschiedene Videos, die ich in eine VideoViewVerwendung laden möchte

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

Die beiden Videos, seien es Video 1 und Video 2 , haben die folgenden Spezifikationen (extrahiert mit ffmpeg -i); Tatsächlich handelt es sich um zwei verschiedene Codierungen desselben Videos:

  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
    

Mir ist bekannt, dass die AAC-Unterstützung mit Honeycomb geliefert wurde, und deshalb habe ich die Videos mit mehreren Geräten getestet. Die Ergebnisse sind unten angegeben:

  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)

Beide Videos lassen sich in Google Chrome auf einem PC problemlos wiedergeben. Es kann nützlich sein, hinzuzufügen, dass im OK-Fall sowohl Video als auch Audio korrekt wiedergegeben werden. Im Fehlerfall (1, -2147483648) wird von allen Geräten (außer Nexus One) dasselbe Protokoll ausgegeben:

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

Im Fall (1) wird das folgende Protokoll von Nexus One gespuckt, und das Video wird nie geladen:

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

Im Fall (2) wird das folgende Protokoll von Nexus One gespuckt und endet, wie Sie sehen, mit einem Fehler (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

Nach dem, was ich gelesen habe, kann der Fehler (1, -2147483648) nicht unterstützten Codecs, beschädigten Metadaten oder falschen Dateiköpfen entsprechen. Wenn ja, können Sie mich in die richtige Richtung weisen, um welchen Codec zu verwenden? Vielen Dank.

Ayberk Özgür
quelle
2
Haben Sie die Videos auf allen Geräten gestreamt? Können Sie mir bitte Ihre Erkenntnisse mitteilen? Ich habe das gleiche Problem. Die Videos funktionieren auf wenigen Geräten und auf einigen nicht.
Adil Malik

Antworten:

111

Nur um etwas für jeden zu klären, der diese Frage anhand des Titels liest.

Bei Betrachtung des Fehlerwerts (1, -2147483648) entspricht der Wert '1' der Konstante in MediaPlayer.MEDIA_ERROR_UNKNOWN .

-2147483648 entspricht hexadezimal 0x80000000, das in Frameworks / native / include / utils / Errors.h als UNKNOWN_ERROR definiert ist

Dies zeigt, dass die Fehlerquelle schwer zu bestimmen ist, da es sich um einen ziemlich generischen Rückgabewert handelt, der durch Codec- und Kompatibilitätsprobleme wie oben erwähnt, aber auch durch Thread-Abbrüche und verschiedene andere Typen verursacht wird.

Für Ihr Problem würde ich empfehlen, die von Android unterstützten Medienformate mit kompatiblen Android-Versionen zu konsultieren und festzustellen, ob der Codierungstyp die Ursache für Ihr Problem ist. Wie oben erwähnt, kann die Antwort auf einen unbekannten Fehler jedoch durch eine Reihe von Problemen verursacht werden.

Sturrockad
quelle
1
Was ist die Lösung? Nicht haben? Ich verstehe nicht klar, was du meinst. Also nur ändern encoderoder entfernen encoder?
Huy Tower
@MirrorTowers: In meinem Fall hatte ich auf einigen Geräten nicht die Berechtigung, die Dateien zu lesen, obwohl es meine App war, die sie erstellt hat, nachdem ich sie von einem Server heruntergeladen und in den Cache-Ordner der App gestellt hatte. Versuchen Sie, die Leseberechtigungen zu ändern.
Nonzaprej
2
Ich habe diesen Fehler beim Streaming einer Ressource von https unter 3.0 erhalten. Es scheint, dass HTTPS nur ab Android 3.1 unterstützt wird
QuantumTiger
Als Update wird dies jetzt auch explizit als "MEDIA_ERROR_SYSTEM (-2147483648) - Systemfehler auf niedriger Ebene" definiert. In der Android-Online-Dokumentation für MediaPlayer (zum Zeitpunkt des Schreibens): developer.android.com/reference/android/media/… - hilft nicht unbedingt so viel, ist aber zumindest explizit da ...
Mick
27

Ich hatte den gleichen Fehler auf Android P (Pixel 2 XL), aber alles, was ich tun musste, war android:usesCleartextTraffic="true"mein AndroidManifest.xmlAnwendungstag zu setzen.

Rod Lima
quelle
Kann dir dabei nicht helfen. MediaPlayer ist nicht zuverlässig, ich möchte Ihnen empfehlen, ExoPlayer github.com/google/ExoPlayer
Rod Lima
7

Für das Streaming hat die Android-Site einen Hinweis:

Bei 3GPP- und MPEG-4-Containern muss das moov-Atom vor allen mdat-Atomen stehen, muss jedoch dem ftyp-Atom folgen.

Ich habe den gleichen Fehler erhalten, bevor ich das moovAtom bewegt habe . Um dies zu beheben, können Sie mp4Box mit diesem Befehl verwenden:

MP4Box -hint output.mp4 

Die meisten meiner Videos können danach gestreamt werden. Wenn es nicht funktioniert, versuchen Sie dies mit ffmpeg:

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

Es gibt andere Tools, die Sie hier finden können .

Trung Nguyen
quelle
2

Ich erhalte auch das gleiche MEDIA_ERROR_UNKNOWN- Fehlerproblem beim Abspielen von Videos (rtsp).

In meinem Fall habe ich Probleme mit meinem WLAN. Aus Sicherheitsgründen ist WLAN für das RTSP-Protokoll eingeschränkt. Damit ich mit diesem MEDIA_ERROR_UNKNOWN-Fehlerproblem konfrontiert bin. Überprüfen Sie dies einmal mit Ihren Netzwerkberechtigungen.

Wenn ich zum Abspielen von Videos auf mobile Daten umsteige, funktioniert das für mich einwandfrei. Vielleicht ist dies hilfreich, wenn jemand auf die gleiche Art von Fehler stößt :).

Anshu
quelle
2

Achten Sie auf den Support-Medientyp und die Auflösung Ihres Geräts. Fehler error (1, -2147483648)treten häufig auf, wenn Ihr Videomedientyp, Ihre Codecs oder Ihre Auflösung von Ihrem Gerät nicht unterstützt werden.

Überprüfen Sie den von Android unterstützten Medientyp in der Dokumentation:

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

Beispielsweise können wir feststellen, dass Geräte über 3.0 .mp4 unterstützen, aber nicht alle unterstützen HD 720p.

Renaud Boulard
quelle
1

Ich hatte ein ähnliches Problem. In meinem Fall würde das Video gut abgespielt, wenn ich es zuerst auf das Telefon heruntergeladen und dann abgespielt hätte. Wenn ich jedoch versuchte, Progressive HTTP zu verwenden, wurde der gleiche Fehler im OP angezeigt.

Ich habe überprüft, ob die Atome ftyp, moov und mdat in der richtigen Reihenfolge sind. Es stellte sich heraus, dass das Problem der Wert des ftyp-Feldes war. Es wurde auf 'qt' gesetzt. Ich habe MP4Box verwendet, um die Tracks zu extrahieren und eine neue MP4-Datei zu erstellen, deren ftyp auf 'isom' gesetzt war. Diese neue Datei funktionierte gut für Progressive HTTP.

jdramer
quelle
1

Ich habe dies ähnlich wie in der Antwort von @ nam-trung gelöst. Da meine Videos jedoch bereits h264 und mp4 waren, musste ich für jede Datei nur Folgendes ausführen:

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

Danach funktionierten alle Videos in VideoView, wenn sie auf allen Geräten ausgeführt wurden, die ich unter API v19 bis v25 getestet habe.

MattMatt
quelle
0

In meinem Fall war der Fehler darauf zurückzuführen, dass der Mediaplayer keine Dateiberechtigungen für das lokal gespeicherte Video hatte. Versuchen Sie, das Video im /mnt/sdCARDVerzeichnis zu speichern .

droiding
quelle
2
Ich kann das Video nicht speichern, es muss von einem externen Server gestreamt werden.
Ayberk Özgür
0

Ich hatte das gleiche Problem, aber was ich auf meiner Seite getan habe, ist

Zuerst stoppe ich den Media Player und lasse ihn dann frei.

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

sharma_kunal
quelle
-1

In meinem Fall wurde dieses Problem durch eine Medien-URL mit Leerzeichen verursacht! Hier ist das Update:

mMediaPlayer.setDataSource(source.replaceAll(" ", "%20"));
Lee Hounshell
quelle
Die Android Universal Media Player App (UAMP) erledigt dies. Das Update, mit dem es für URLs wie die bei cbsrmt.com funktioniert, ist oben korrekt dargestellt.
Lee Hounshell
-1

Wenn Sie firebase verwenden, sollten Sie den Pfad (oder die URL) von 1: Download Url kopieren, die den https: // firebasestorage enthält .............

nicht vom Lagerort

2: <uses-permission android:name="android.permission.INTERNET" />Fügen Sie diese Berechtigung im Manifest-Tag im Manifest-Ordner hinzu

innerhalb der Lagerregeln

innerhalb Lagerungsregeln:

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