Android AudioFlinger服务器死了媒体服务器死了

时间:2013-11-20 13:38:55

标签: android video-streaming android-mediaplayer

我正在尝试在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();
        }
    });
}

请告诉您是否需要更多代码。

2 个答案:

答案 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;
        }
    });