我的安卓应用程序在
安卓监视器在崩溃之前记录了以下内容:
更准确地说,我的问题是:
我在这里找到了一个函数:
VideoView
中在线播放视频。从文件播放视频时,它正常工作,甚至可以实时流式传输(使用m3u8
);它始终从同一源流式传输,并且当我使用外部播放器/浏览器时,也可以正常流式传输(因此我不认为这是源的问题,该源类似于此文件:https://publish.dvlabs.com/democracynow/360/dn2016-0810.mp4)安卓监视器在崩溃之前记录了以下内容:
10-13 12:02:56.204 32460-32748/com.workingagenda.democracydroid D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1)
10-13 12:02:56.205 32460-32472/com.workingagenda.democracydroid D/MediaHTTPConnection: proxy null port 0
10-13 12:02:57.904 32460-32460/com.workingagenda.democracydroid D/MediaPlayer: getMetadata
10-13 12:02:58.438 32460-377/com.workingagenda.democracydroid W/MediaPlayer: info/warning (3, 0)
然后当它崩溃时,我会得到这些日志:
10-13 12:05:33.812 32460-32472/com.workingagenda.democracydroid W/MediaHTTPConnection: readAt 26869519 / 241 => java.net.ProtocolException: unexpected end of stream
10-13 12:08:32.480 32460-3546/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004)
10-13 12:08:32.480 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004)
10-13 12:08:32.481 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004
[ 10-13 12:08:32.512 5066: 453 E/ ]
Destroy C2D instance
[ 10-13 12:08:32.512 5066: 453 E/ ]
Destroy C2D instance
10-13 12:08:32.635 32460-32472/com.workingagenda.democracydroid E/MediaPlayer: error (1, -1004)
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid E/MediaPlayer: Error (1,-1004)
10-13 12:08:32.668 32460-32460/com.workingagenda.democracydroid D/VideoView: Error: 1,-1004
更准确地说,我的问题是:
- 我想知道这个错误
E/MediaPlayer: Error (1,-1004)
是什么(因为我在网上没有找到任何有关它的信息)。 - 如果像我怀疑的那样,基本上是文件/流结束错误,那么我希望能得到一些帮助,以缓冲或以其他方式加载视频,以避免这种情况发生?
我在这里找到了一个函数:
MediaPlayer.prepareAsync()
,链接在这里:https://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync(),当一个VideoView
打开一个视频时,它会自动调用此函数,但这似乎不起作用。
编辑
所以解决方案让我使用了Google的ExoPlayer,它很容易替换我的VideoView,并且工作得很好。
- 将ExoPlayer添加为依赖项
- 在布局中更改视图为
SimpleExoPlayerView
- 在Activity中初始化
SimpleExoPlayer
- 初始化
MediaSource
并附加到播放器 - 不再需要时记得
release()
。