我正在尝试开发一个android设备上的hls播放器,我有一些可以玩的测试流。我遇到的一个问题是,HLS流只是“停止”,在某些随机位置冻结,可能是在1分钟后,也可能是在20分钟之后。我得到的错误是:
11-20 14:14:10.484: W/音频系统(18531):AudioFlinger服务器死机!11-20 14:14:10.484: W/IMediaDeathNotifier(18531):媒体服务器死机
和11-20 14:14:10.484: E/MediaPlayer(18531):Error (100,0)
如果发生这种情况,我基本上不知道如何阻止或重新启动流。我甚至不知道为什么会这样。所以如果有人能回答这个问题,我会很高兴:)。
// Create a new media player and set the listeners
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
mMediaPlayer.reset();
return false;
}
});
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepareAsync();
//mMediaPlayer.prepare();
if(extras.getString("type") == "VOD") {
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setScreenOnWhilePlaying(true);
//mMediaPlayer.setOnVideoSizeChangedListener(this);
//mcontroller = new MediaController(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
public void onPrepared(MediaPlayer mediaplayer) {
Log.d(TAG, "onPrepared called");
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed) {
runOnUiThread(new Runnable() {
public void run() {
startVideoPlayback();
}
});
}
mcontroller = new MediaController(this);
mcontroller.setMediaPlayer(this);
mcontroller.setAnchorView(findViewById(R.id.surface));
mcontroller.setEnabled(true);
handler.post(new Runnable() {
public void run() {
mcontroller.setEnabled(true);
mcontroller.show();
}
});
}如果你需要更多的代码,请告诉我。
发布于 2013-11-20 22:35:00
我认为这就是它所说的:网络问题使MediaPlayer认为服务器关闭了连接。
对于HTTP流,我建议在设备上粘贴一个简单的代理服务器,这样您就可以更多地控制发送到播放器的数据。Apache库本身非常容易使用,或者您也可以选择像Naga这样的轻量级包装器。如果出现这样的错误,您可以在您离开的确切字节处发出重新连接请求。还有其他好处,比如可以根据需要缓存数据,但是控制远程通信提供了MediaPlayer所不具备的自由度。
备注以供将来参考:此答案不适合HLS。请参阅评论。
发布于 2015-11-03 18:19:33
检查error listener中的Error(100,0)。释放播放器不只是重置它并重新创建另一个对象。
原因之一是对使用AudioService的MediaPlayer服务的多线程访问。另一个问题可能就是你的情况--内存问题。尽量减少一起运行的玩家数量,并密切关注你的应用程序使用了多少内存。
以下是如何检测错误(100,0):
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
mMediaPlayer.release();
//create another mediaplayer preferrably in another thread
return false;
}
});https://stackoverflow.com/questions/20097512
复制相似问题