安卓MediaPlayer错误(1,-2147483648)

91

我有两个不同的视频,想要使用 VideoView 加载它们。

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

两个视频,让我们称之为视频1视频2,具有以下规格(使用ffmpeg -i提取);实际上,它们是相同视频的两个不同编码:

  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
    
我知道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:见下面的(1) - Video 2:见下面的(2)
  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中的PC上都可以播放。值得注意的是,在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

在这种情况下,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

在第二种情况下,从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
你在所有设备上都能流畅播放视频吗?能否请你与我分享一下你的发现?我也遇到了同样的问题。有些设备可以播放视频,而有些则不行。 - Adil Malik
13个回答

123

仅为澄清问题标题而言,需要说明一些事情。

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

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

这表明错误的来源很难确定,因为它是一个非常通用的返回值,可能由编解码器和兼容性问题引起,如上所述,但也可能是线程取消等其他类型的问题。

对于您的问题,我建议咨询与Android版本兼容的Android支持的媒体格式,并查看编码类型是否是您的问题的原因,但如上所述,未知错误响应可能由许多问题引起。


1
什么是解决方案?没有吗?我不太明白你的意思。所以只需要更改“编码器”还是应该删除“编码器”? - Huy Tower
@MirrorTowers:在我的情况下,有些设备上,即使是我的应用程序创建了这些文件并从服务器下载到应用程序的缓存文件夹中,我也没有读取文件的权限。尝试更改读取权限。 - nonzaprej
2
当我在3.0上从https流式传输资源时,我收到了这个错误。看起来只有从Android 3.1开始才支持HTTPS。 - QuantumTiger
2
作为更新 - 现在在Android MediaPlayer的在线文档中(撰写时)也明确定义为“MEDIA_ERROR_SYSTEM(-2147483648)-低级系统错误。”:https://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html - 并不一定有太大帮助,但至少它是明确的... - Mick

34

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


无法帮助你解决这个问题。MediaPlayer 不够可靠,我建议你使用 ExoPlayer https://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
如果您正在使用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()
    }
})


你能用 Java 描述一下吗? - Noor Hossain

2

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

在我的情况下,我发现我的wifi存在问题。由于某些安全原因,wifi被限制了RTSP协议。因此,我面临着这个MEDIA_ERROR_UNKNOWN错误问题。请检查您的网络权限。

当我切换到移动数据来播放视频时,一切正常。 希望这对于遇到相同错误的人有所帮助 :)


2
请注意设备支持的媒体类型和分辨率。 当您的视频媒体类型、编解码器或分辨率不受设备支持时,经常会出现错误error (1, -2147483648)
请参阅Android文档中支持的媒体类型: https://developer.android.com/guide/appendix/media-formats.html 例如,我们可以发现3.0以上的设备支持.mp4,但并非所有设备都支持720p高清。

1
我按照@nam-trung的回答类似地解决了这个问题,但由于我的视频已经是h264mp4格式,所以我只需要在每个文件上运行以下命令:
ffmpeg -i input.mp4 -vprofile baseline output.mp4

在此之后,我测试了所有API版本在各种设备上运行VideoView的视频,所有视频都能正常播放。

1

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

我验证了ftyp、moov和mdat原子的正确顺序。结果发现问题出在ftyp字段的值上。它被设置为“qt ”。我使用MP4Box提取轨道并创建一个新的mp4文件,其中ftyp设置为“isom”。这个新文件对于渐进式HTTP来说可以正常工作。


0

我曾经遇到过同样的问题,但是我在我的代码中做了以下操作:

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

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


0
在我的情况下,我在网址中启用了Gzip压缩。在Android上可能无法解码已压缩的媒体文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接