【问题标题】: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:

标签: android media-player


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多