Ошибка Android MediaPlayer (1, -2147483648)

У меня есть два разных видео, которые я пытаюсь загрузить в 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 на ПК. Может быть полезно добавить, что в случае ОК видео и аудио воспроизводятся правильно. В случае ошибки (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) может соответствовать неподдерживаемым кодекам, поврежденным метаданным или неправильным заголовкам файлов. Если это так, не могли бы вы указать мне правильное направление для использования какого кодека? Благодарю.

13 ответов

Решение

Просто чтобы прояснить что-то для всех, кто читает этот вопрос, основываясь на названии

Если посмотреть на значение ошибки (1, -2147483648), значение "1" соответствует константе в MediaPlayer.MEDIA_ERROR_UNKNOWN.

-2147483648 соответствует шестнадцатеричному 0x80000000, который определен как UNKNOWN_ERROR в frameworks/native/include/utils/Errors.h

Это показывает, что источник ошибки трудно определить, так как это довольно общее возвращаемое значение, вызванное проблемами кодека и совместимости, как упомянуто выше, а также отменой потоков и некоторыми другими типами.

В связи с вашей проблемой, я бы порекомендовал обратиться к поддерживаемым форматам мультимедиа Android с совместимыми версиями Android и посмотреть, является ли тип кодировки причиной вашей проблемы, но, как уже упоминалось выше, ответ "Неизвестная ошибка" может быть вызван рядом проблем.

Я столкнулся с той же ошибкой на Android P (Pixel 2 XL), но все, что мне нужно было сделать, это поставить android:usesCleartextTraffic="true" на моем AndroidManifest.xml тег приложения.

Для потоковой передачи на сайте 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 

Есть и другие инструменты, которые вы можете найти здесь.

Если вы используете MediaPlayer для воспроизведения звука у меня возникла ошибка:

При выполнении .setDataSource()аргумент, который я передал, был строкой с путем к данному файлу. Это приводит ко всем видам исключений, для которых я не смог найти конкретных причин. Однако, когда разработчики Android изменили его на метод .setDataSource () , он разобрался.
Я получаю FileDescriptor объект из FileInputStream.
Вот код:

      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
     }
 }

Фактическое начало воспроизведения обрабатывается в OnPreparedListenerкак предлагается, например, здесь: Android Media Player: запуск при ошибке состояния 4 (-38,0) .
Настройка слушателя следующая:

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

андроид Котлин медиаплеер

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

Оформить заказ на тип носителя, поддерживаемый Android в документации:

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

Например, мы можем заметить, что устройства выше 3.0 поддерживают.mp4, но не все они поддерживают HD 720p.

Я также получаю сообщение об ошибке MEDIA_ERROR_UNKNOWN при воспроизведении видео (rtsp).

В моем случае я нахожу проблему с моим Wi-Fi. Некоторые соображения безопасности Wi-Fi ограничен для протокола RTSP. Так что я столкнулся с этой ошибкой MEDIA_ERROR_UNKNOWN. Один раз проверьте с вашими сетевыми разрешениями.

Когда я перехожу на мобильные данные для воспроизведения видео, это работает нормально для меня. Может быть, это будет полезно всем, кто сталкивается с такой же ошибкой:).

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

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

После этого все видео работали в VideoView при запуске на всех устройствах, которые я тестировал на API v19-v25.

У меня была похожая проблема. В моем случае видео будет воспроизводиться нормально, когда я сначала загрузил его на телефон, а затем воспроизвел. Но когда я пытался использовать Progressive HTTP, я получал ту же ошибку, отмеченную в OP.

Я проверил, что атомы ftyp, moov и mdat находятся в правильном порядке. Оказалось, что проблема заключалась в значении поля ftyp. Он был установлен на "qt". Я использовал MP4Box для извлечения дорожек и создания нового файла mp4, в котором для ftyp было установлено значение isom. Этот новый файл работал нормально для Progressive HTTP.

В моем случае у меня было сжатие Gzip на веб-адресе, где находится информация об URL-адресе. Сжатые медиа-файлы не могут быть декодированы на Android.

Я столкнулся с той же проблемой, но то, что я сделал на моей стороне,

Сначала я остановил медиаплеер, а затем выпустил его.

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

В моем случае ошибка была связана с тем, что у медиаплеера нет прав доступа к файлу для локально сохраненного видео. Попробуйте сохранить видео на /mnt/sdCARD каталог.

Если вы используете firebase, вы должны скопировать путь (или URL) из 1: Download 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;
  }  
 }  
 }

В моем случае эта проблема была вызвана медиа-URL с пробелами! Вот исправление:

mMediaPlayer.setDataSource(source.replaceAll(" ", "%20"));
Другие вопросы по тегам