音板应用程序上的媒体播放器错误
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)