我正在尝试在Android设备上开发一个hls播放器,我有一些我可以玩的测试流。我遇到的一个问题是HLS流只是“停止”,在某些随机位置冻结,可能在1分钟后或20之后。我得到的错误是:
11-20 14:14:10.484:W / AudioSystem(18531):AudioFlinger服务器死了! 11-20 14:14:10.484:W / IMediaDeathNotifier(18531):媒体服务器死了
和 11-20 14:14:10.484:E / MediaPlayer(18531):错误(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();
}
});
}
请告诉您是否需要更多代码。
答案 0 :(得分:1)
我认为这就是它所说的:网络问题使MediaPlayer
认为服务器关闭了连接。
对于HTTP流媒体,我建议在设备上粘贴一个简单的代理服务器,以便您可以更多地控制发送给播放器的数据。 Apache库本身很容易使用,或者你可以选择像Naga这样的轻量级包装器。如果出现此类错误,您可以按照中断的确切字节进行重新连接请求。还有其他好处,例如能够在需要时缓存数据,但控制远程通信提供了MediaPlayer
无法找到的自由度。
注意以备参考:这个答案对HLS不利。见评论。
答案 1 :(得分:0)
检查错误侦听器是否有错误(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;
}
});