音板应用程序上的媒体播放器错误

Posted

技术标签:

【中文标题】音板应用程序上的媒体播放器错误【英文标题】:mediaplayer error on soundboard app 【发布时间】:2011-04-13 17:22:43 【问题描述】:

我有一个音板应用程序,它在按下按钮时调用音频文件。但是,在按下并播放了大多数按钮后,我开始收到这些媒体播放器错误。有谁知道如何检测它并重新启动或完全阻止它发生?谢谢你的时间。

-科尔比

    for (Map.Entry<Integer, Integer> entry : map.entrySet()) 
        ImageButton button = (ImageButton) findViewById(entry.getKey());
        button.setOnClickListener(new View.OnClickListener() 
            public void onClick(View v) 
                try 
                    int sound = map.get(v.getId());
                    mp = MediaPlayer.create(myMain.this, sound);
                    mp.prepare();
                 catch (IllegalStateException e) 



                 catch (IOException e) 

                
                mp.seekTo(0);
                mp.start();

            
        

        );

    

04-13 10:11:39.873: INFO/MediaPlayer(23152): MediaPlayer start() 04-13 10:11:39.873: 详细/MediaPlayerService(18229): [666] setLooping(0) 04-13 10:11:39.873: 详细/MediaPlayerService(18229): [666] setVolume(1.000000, 1.000000) 04-13 10:11:39.873: VERBOSE/Audiosink(18229): setVolume(1.000000, 1.000000) 04-13 10:11:39.873: 详细/MediaPlayerService(18229): [666] 开始 04-13 10:11:39.873: DEBUG/AwesomePlayer(18229): [U5B] 播放 (556) 04-13 10:11:39.873:调试/AwesomePlayer(18229):[U5B] play_l(562) 04-13 10:11:39.873: VERBOSE/AudioSink(18229): 打开(44100, 1, 1, 4) 04-13 10:11:39.873: 错误/AudioFlinger(18229): 没有更多可用的轨道名称 04-13 10:11:39.873:错误/AudioTrack(18229):AudioFlinger 无法创建轨道,状态:12 04-13 10:11:39.873: 错误/AudioSink(18229): 无法创建音轨 04-13 10:11:39.873: 错误/MediaPlayer(23152): 错误 (-19, 0) 04-13 10:11:39.894: INFO/MediaPlayer(23152): MediaPlayer handleMessage what=5 04-13 10:11:39.894: INFO/MediaPlayer(23152): MediaPlayer handleMessage what=1 04-13 10:11:39.894: INFO/MediaPlayer(23152): MediaPlayer handleMessage what=4 04-13 10:11:42.114: INFO/MediaPlayer(23152): MediaPlayer create() 04-13 10:11:42.114:信息/媒体播放器(23152):媒体播放器 04-13 10:11:42.114: VERBOSE/MediaPlayerService(18229): Client(667) 构造函数

【问题讨论】:

考虑使用声音池。你还喜欢这个吗?检查这个answer: 【参考方案1】:

詹姆斯的想法是正确的。一段时间后,您创建了太多 MediaPlayer 实例,并且内存不足。我之前发布的一个解决方案就是这样的:

public MediaPlayer mp;
public Resources res = getResources();

View.OnClickListener listener = new View.OnClickListener() 
    public void onClick(View v) 
        try 
            int sound = map.get(v.getId());
            AssetFileDescriptor afd = res.openRawResourceFd(sound);

            mp.reset();
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.prepare();
            mp.start();
         catch (IOException e) 
            e.printStackTrace();
        
    


for(Map.Entry<Integer, Integer> entry : map.entrySet()) 
    ImageButton button = (ImageButton)findViewById(entry.getKey());
    button.setOnClickListener(listener);

这可能无法编译(我假设您的声音 ID 来自 res/raw 文件夹),但想法是,只需拥有一个 MediaPlayer 实例,并且每当单击按钮时,重置该实例,设置数据源到相应的 FileDescriptor,准备它,然后开始播放。

【讨论】:

我在使用reset() 方法时遇到了NullPointerException 的问题。我切换到release() 方法并解决了我的问题 @Darcy:你的 NPE 可能在别处。 release() 将要求您在再次使用之前重新初始化。如果您再次使用它,reset() 只是将其重置为未初始化状态,但不会释放资源。【参考方案2】:

我不太确定,但我认为您只想为每个声音创建一次媒体播放器,然后调用 start、seekTo 和 stop。

【讨论】:

以上是关于音板应用程序上的媒体播放器错误的主要内容,如果未能解决你的问题,请参考以下文章

多个 MediaPlayers 不断失败 - Android 工作室

播放完成后如何释放我的媒体播放器?

discord.py(python)中的ffmpeg播放器自动离开

咀嚼播放器和本地化上的颤振构建错误

断言失败:电影播放器​​的激活状态错误(一)

带有 XML 参数的 REST 服务操作上的 HTTP 错误 415 不受支持的媒体类型(Jersey + Jetty)