首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AudioFlinger服务器死机|媒体服务器死机

Android AudioFlinger服务器死机|媒体服务器死机
EN

Stack Overflow用户
提问于 2013-11-20 21:38:55
回答 2查看 6.3K关注 0票数 2

我正在尝试开发一个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)

如果发生这种情况,我基本上不知道如何阻止或重新启动流。我甚至不知道为什么会这样。所以如果有人能回答这个问题,我会很高兴:)。

代码语言:javascript
复制
 // 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();
        }
    });
}

如果你需要更多的代码,请告诉我。

EN

回答 2

Stack Overflow用户

发布于 2013-11-20 22:35:00

我认为这就是它所说的:网络问题使MediaPlayer认为服务器关闭了连接。

对于HTTP流,我建议在设备上粘贴一个简单的代理服务器,这样您就可以更多地控制发送到播放器的数据。Apache库本身非常容易使用,或者您也可以选择像Naga这样的轻量级包装器。如果出现这样的错误,您可以在您离开的确切字节处发出重新连接请求。还有其他好处,比如可以根据需要缓存数据,但是控制远程通信提供了MediaPlayer所不具备的自由度。

备注以供将来参考:此答案不适合HLS。请参阅评论。

票数 1
EN

Stack Overflow用户

发布于 2015-11-03 18:19:33

检查error listener中的Error(100,0)。释放播放器不只是重置它并重新创建另一个对象。

原因之一是对使用AudioService的MediaPlayer服务的多线程访问。另一个问题可能就是你的情况--内存问题。尽量减少一起运行的玩家数量,并密切关注你的应用程序使用了多少内存。

以下是如何检测错误(100,0):

代码语言:javascript
复制
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;
        }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20097512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档