Android MediaPlayer 错误 (1, -2147483648)

Posted

技术标签:

【中文标题】Android MediaPlayer 错误 (1, -2147483648)【英文标题】:Android MediaPlayer error (1, -2147483648) 【发布时间】:2012-07-17 09:53:15 【问题描述】:

我有两个不同的视频,我正在尝试使用

将它们加载到 VideoView
videoView.setVideoURI(Uri.parse(url));

这两个视频,分别是 video 1video 2,具有以下规格(使用ffmpeg -i 提取);实际上,它们是同一视频的两种不同编码:

    视频 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:

    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
    

我知道 Honeycomb 提供了 AAC 支持,因此我在多个设备上测试了视频;结果如下:

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

这两个视频都可以在 PC 的 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) 可能对应于不受支持的编解码器、损坏的元数据或不正确的文件头。如果是这样,您能否指出我使用哪种编解码器的正确方向?谢谢。

【问题讨论】:

您是否在所有设备上播放视频?你能和我分享你的发现吗?我有同样的问题。这些视频在少数设备上有效,而在少数设备上则无效。 【参考方案1】:

只是为了根据标题为阅读此问题的任何人澄清一些事情。

查看错误值 (1, -2147483648) 时,'1' 值对应于MediaPlayer.MEDIA_ERROR_UNKNOWN 中的常量。

-2147483648对应十六进制0x80000000,在frameworks/native/include/utils/Errors.h中定义为UNKNOWN_ERROR

这表明错误的来源很难确定,因为它是一个非常通用的返回值,由上面提到的编解码器和兼容性问题以及线程取消和其他几种类型引发。

对于您的问题,我建议使用兼容的 android 版本咨询Android Supported Media Formats,看看编码类型是否是您问题的原因,但如上所述,未知错误响应可能是由许多问题引起的。

【讨论】:

解决办法是什么?没有?我不清楚你的意思。所以只需要更改encoder 还是应该删除encoder @MirrorTowers:就我而言,在某些设备上,即使是我的应用程序创建了这些文件,但在从服务器下载它们并将它们放入应用程序的缓存文件夹。尝试更改读取权限。 我在 3.0 上从 https 流式传输资源时收到此错误。似乎只有 Android 3.1 以后才支持 HTTPS 作为更新 - 现在也明确定义为“MEDIA_ERROR_SYSTEM (-2147483648) - 低级系统错误。”在 MediaPlayer 的 Android 在线文档中(在撰写本文时):developer.android.com/reference/android/media/… - 不一定有太大帮助,但至少它是明确的......【参考方案2】:

我在 Android P (Pixel 2 XL) 上遇到了同样的错误,但我所要做的就是将 android:usesCleartextTraffic="true" 放在我的 AndroidManifest.xml 应用程序标签上。

【讨论】:

帮不了你。 MediaPlayer不靠谱,推荐你用ExoPlayergithub.com/google/ExoPlayer【参考方案3】:

对于流式传输,Android 网站有说明:

对于 3GPP 和 MPEG-4 容器,moov atom 必须位于任何 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 

您还可以找到其他工具here。

【讨论】:

【参考方案4】:

播放视频(rtsp)时,我也遇到了同样的 MEDIA_ERROR_UNKNOWN 错误问题。

就我而言,我发现我的 wifi 有问题。一些安全原因 wifi 受限于 RTSP 协议。所以我面临这个 MEDIA_ERROR_UNKNOWN 错误问题。请检查您的网络权限。

当我转向移动数据播放视频时,它对我来说效果很好。 可能这会对面临同样错误的人有所帮助:)。

【讨论】:

【参考方案5】:

注意您设备的支持媒体类型和分辨率。 错误 error (1, -2147483648) 经常出现,当您的设备不支持您的视频媒体类型、编解码器或分辨率时。

在文档中查看 Android 支持的媒体类型:

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

例如,我们可以注意到 3.0 以上的设备支持 .mp4,但并非所有设备都支持 HD 720p。

【讨论】:

【参考方案6】:

我遇到了类似的问题。在我的情况下,当我先将视频下载到手机然后播放时,视频会正常播放。但是当我尝试使用渐进式 HTTP 时,我会收到 OP 中提到的相同错误。

我验证了 ftyp、moov 和 mdat 原子的顺序正确。原来问题出在 ftyp 字段的值上。它被设置为“qt”。我使用 MP4Box 来提取曲目并创建一个新的 mp4 文件,其中 ftyp 设置为“isom”。这个新文件适用于渐进式 HTTP。

【讨论】:

【参考方案7】:

我以类似于@nam-trung 的回答中所述的方式解决了这个问题,但是由于我的视频已经是 h264mp4 我需要做的就是运行以下在每个文件上:

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

之后,当在我测试过的所有设备上运行时,所有视频都可以在 VideoView 中运行 API v19 到 v25。

【讨论】:

【参考方案8】:

如果您使用MediaPlayer 播放音频,这对我来说是错误的情况:

在执行.setDataSource() 时,我传递的参数是一个带有给定文件路径的字符串。这导致了我无法找到特定原因的各种异常。不过改成FileDescriptor后,根据Android Developers - .setDataSource() method,就搞定了。 我从FileInputStream 获取FileDescriptor 对象。 代码如下:

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: Start called in state 4 error(-38,0) 。 监听器设置如下:

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

androidkotlinmediaplayer

【讨论】:

你能用Java描述一下吗?【参考方案9】:

在我的情况下,错误是由于媒体播放器对本地存储的视频没有文件权限。尝试将视频存储到/mnt/sdCARD 目录。

【讨论】:

我无法存储视频,它必须从外部服务器流式传输。【参考方案10】:

我遇到了同样的问题,但是我这边做的是

首先我停止媒体播放器,然后释放它。

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

【讨论】:

【参考方案11】:

就我而言,我在网址信息所在的网址上进行了 Gzip 压缩。压缩的媒体文件可能无法在 android 上解码。

【讨论】:

【参考方案12】:

就我而言,这个问题是由带有空格的媒体 URL 引起的!这是修复:

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

【讨论】:

Android 通用媒体播放器应用程序 (UAMP) 执行此操作。上面正确显示了使其适用于 cbsrmt.com 等 URL 的修复程序。【参考方案13】:

如果您使用的是 firebase ,那么您应该从 1: Download Url 复制路径(或 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;
    
   
 

【讨论】:

以上是关于Android MediaPlayer 错误 (1, -2147483648)的主要内容,如果未能解决你的问题,请参考以下文章

Android MediaPlayer错误码整理

Android:'无法播放此视频'; MediaPlayer和VideoView错误1 -38

Android MediaPlayer 错误 (1, 9100) - Lg L7

android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer

应该有字幕控制器已经设置 Mediaplayer 错误 Android

MediaPlayer的错误列表速查(android)