Помилка Android MediaPlayer (1, -2147483648)


84

У мене є два різних відео, які я намагаюся завантажити у VideoViewкористування

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

Два відео, нехай вони будуть відео 1 та відео 2 , мають такі характеристики (витягнуті за допомогою ffmpeg -i); насправді це два різні кодування одного і того ж відео:

  1. Відео 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. Відео 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
    

Мені відомо, що підтримка AAC постачалась із Honeycomb, і тому я тестував відео на кількох пристроях; результати наведені нижче:

  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)

Обидва відео чудово відтворюються в Google Chrome на ПК. Можливо, було б корисно додати, що у випадку з OK відео і аудіо відтворюються правильно. У випадку помилки (1, -2147483648) той самий журнал викидається з усіх пристроїв (крім 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

У випадку (1) із Nexus One видається такий журнал, і відео ніколи не завантажується:

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

У випадку (2) такий журнал викидається з Nexus One і, як бачите, закінчується помилкою (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

З прочитаного помилка (1, -2147483648) може відповідати непідтримуваним кодекам, пошкодженим метаданим або неправильним заголовкам файлів. Якщо це так, не могли б ви вказати мені в правильному напрямку щодо використання якого кодека? Дякую.


2
Ви отримали потокове відео на всіх пристроях? Чи можете ви поділитися зі мною своїми висновками? У мене така сама проблема. Відео працюють на кількох пристроях, а на деяких - ні.
Аділ Малік

Відповіді:


111

Просто щоб пояснити щось кожному, хто читає це запитання, виходячи із заголовка.

При перегляді значення помилки (1, -2147483648) значення '1' відповідає константі в MediaPlayer.MEDIA_ERROR_UNKNOWN .

-2147483648 відповідає шістнадцятковій 0x80000000, яка визначається як UNKNOWN_ERROR у framework / native / include / utils / Errors.h

Це показує, що джерело помилки важко закріпити, оскільки це цілком загальне значення, яке повертається кодеком та проблемами сумісності, як згадувалося вище, а також скасування потоків та кілька інших типів.

Щодо вашої проблеми, я б порадив проконсультуватися з підтримуваними форматами мультимедійних форматів Android із сумісними версіями Android і з’ясувати, чи є тип кодування причиною вашої проблеми, але, як зазначено вище, відповідь «Невідома помилка» може бути спричинена низкою проблем.


1
Яке рішення? Не маєте? Я чітко не розумію, що ти маєш на увазі. Тож потрібно лише змінити encoderчи слід видалити encoder?
Huy Tower

@MirrorTowers: У моєму випадку на деяких пристроях я не мав дозволу на читання файлів, хоча їх створив мій додаток, завантаживши їх із сервера та помістивши в папку кешу програми. Спробуйте змінити дозволи на читання.
nonzaprej

2
Я отримав цю помилку під час потокового передавання ресурсу з https 3.0. Здається, HTTPS підтримується лише з Android 3.1 і пізніше
QuantumTiger

В якості оновлення - це також чітко визначено як „MEDIA_ERROR_SYSTEM (-2147483648) - системна помилка низького рівня“. в онлайновій документації Android для MediaPlayer (на момент написання статті): developer.android.com/reference/android/media/… - не обов’язково так сильно допомагає, але принаймні там явно ...
Мік

28

Я зіткнувся з тією ж помилкою на Android P (Pixel 2 XL), але все, що мені потрібно було зробити, - це помістити мітку android:usesCleartextTraffic="true"мого AndroidManifest.xmlдодатка.


Не можу вам у цьому допомогти. MediaPlayer не є надійним, я хотів би рекомендувати вам використовувати ExoPlayer github.com/google/ExoPlayer
Rod Lima

7

Для потокового передавання на сайті Android є примітка:

Для контейнерів 3GPP та MPEG-4 атом moov повинен передувати будь-яким атомам mdat, але повинен бути наступником атома ftyp.

Я отримав ту саму помилку перед переміщенням moovатома. Щоб виправити це, ви можете використовувати mp4Box за допомогою цієї команди:

MP4Box -hint output.mp4 

Більшість моїх відео можуть транслюватись після цього. Якщо це не працює, спробуйте це за допомогою ffmpeg:

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

Є й інші інструменти, які ви можете знайти тут .


2

Я також отримую те саме повідомлення про помилку MEDIA_ERROR_UNKNOWN під час відтворення відео (rtsp).

У моєму випадку я знаходжу проблему зі своїм Wi-Fi. Деякі причини безпеки wifi обмежені для протоколу RTSP. Отже, я зіткнувся з проблемою помилки MEDIA_ERROR_UNKNOWN. Одного разу зверніться до своїх мережевих дозволів.

Коли я переходжу до мобільних даних для відтворення відео, у мене це прекрасно працює. Можливо, це буде корисно тому, хто стикається з такою ж помилкою :).


2

Подбайте про тип носія підтримки та роздільну здатність вашого пристрою. error (1, -2147483648)Часто виникають помилки , коли пристрій не підтримує тип відеоматеріалу, кодеки або роздільну здатність.

Ознайомтесь із типом носія, який підтримується Android у документації:

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

Наприклад, ми можемо помітити, що пристрій вище 3.0 підтримує .mp4, але не всі вони підтримують HD 720p.


1

У мене була подібна проблема. У моєму випадку відео буде чудово відтворюватися, коли я спочатку завантажував його на телефон, а потім відтворював. Але коли я намагався використовувати прогресивний HTTP, я отримав ту саму помилку, зазначену в OP.

Я перевірив, що атоми ftyp, moov та mdat були в правильному порядку. Виявилося, що проблема полягала у значенні поля ftyp. Було встановлено значення 'qt'. Я використав MP4Box для вилучення доріжок і створення нового файлу mp4, для якого ftyp був встановлений на 'isom'. Цей новий файл чудово працював для прогресивного HTTP.


1

Я вирішив це подібно до способу, зазначеного у відповіді @ nam-trung, однак, оскільки мої відео вже були h264 і mp4, все, що мені потрібно було зробити, було виконати наступне для кожного файлу:

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

Після цього всі відео працювали у VideoView під час запуску на всіх пристроях, які я тестував на запуску API v19 до v25.


0

У моєму випадку помилка сталася через те, що медіаплеєр не мав дозволів на файли для локально збереженого відео. Спробуйте зберегти відео у /mnt/sdCARDкаталозі.


2
Я не можу зберегти відео, воно має транслюватися з зовнішнього сервера.
Айберк Озгюр,

0

Я стикався з такою ж проблемою, але те, що я зробив на моїй стороні, це

Спочатку я зупиняю медіаплеєр, а потім відпускаю його.

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


-1

У моєму випадку цю проблему спричинила URL-адреса мультимедіа з пробілами! Ось виправлення:

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

Це робить додаток Android Universal Media Player (UAMP). Виправлення, щоб він працював для таких URL-адрес, як на cbsrmt.com, правильно показано вище.
Lee Hounshell

-1

якщо ви використовуєте firebase, вам слід скопіювати шлях (або URL-адресу) з 1: Завантажте URL-адресу, яка містить https: // firebasestorage .............

не з місця зберігання

2: <uses-permission android:name="android.permission.INTERNET" />додайте цей дозвіл у тег маніфесту всередині папки маніфесту

всередині Правила зберігання

всередині Правила зберігання:

rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
 allow read, write: if true;
  }  
 }  
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.