android : 使用 SoundPool 播放具有短演变周期的短声音
Posted
技术标签:
【中文标题】android : 使用 SoundPool 播放具有短演变周期的短声音【英文标题】:android : play short sound with short evoluting period using SoundPool 【发布时间】:2013-05-13 20:18:06 【问题描述】:我想实现一种我们可以在汽车上找到的雷达来帮助停车。在通过活页夹正确连接到我的活动的服务上,我启动了一个线程,该线程必须重复一个短的 sound.wav(110 毫秒长),并且会在短时间内发生变化。 使用此代码,在开始第一个循环播放声音但有困难并很快失去节奏。最糟糕的是,服务永远不会停止。垃圾收集器已饱和。 我没有找到正确实现这一点的方法。 谢了
public class MainService extends Service implements OnLoadCompleteListener
private boolean soundradarloaded;
private SoundPool spoolradar;
private int soundradarID;
private Thread timerThread;
private boolean timerThreadrunning;
public int onStartCommand(Intent intent, int flags, int startId)
soundradarloaded=false;
spoolradar = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundradarID = spoolradar.load(this, R.raw.beepradar1, 1);
spoolradar.setOnLoadCompleteListener(this);
timerThreadrunning=true;
timerThread=new Thread(new Runnable()
@Override
public void run()
int counter=0;
long offset=System.currentTimeMillis();
while(timerThreadrunning)
// Traitement
longtime=System.currentTimeMillis()-offset;
if(soundradarloaded && longtime%400==0)//play every 400ms
spoolradar.play(soundradarID, 1, 1, 1, 0, 1f);
try
Thread.sleep(1);
catch (InterruptedException ex)
);
timerThread.start();
@Override
public void onLoadComplete(SoundPool arg0, int arg1, int arg2)
if(arg0==spoolradar)
soundradarloaded=true;
@Override
public void onStop()
timerThreadrunning=false;
try
Thread.sleep(1);
catch (InterruptedException ex)
spoolradar.release(soundradarID);
【问题讨论】:
【参考方案1】:不保证 Thread.sleep() 的精度。如果 Thread.sleep(1) 被忽略,那么行
if(soundradarloaded && longtime%400==0)//play every 400ms
可以在同一毫秒内多次执行,并且几乎同时播放多个音频流(或在不希望的时间之后)。第二个问题是 timerThread 一直在运行并使用 CPU(和电池)。
查看https://developer.android.com/reference/java/util/Timer.html 或https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html 以获得更好的解决方案。
【讨论】:
以上是关于android : 使用 SoundPool 播放具有短演变周期的短声音的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?
Xamarin.Android 使用SoundPool进行音频播放
为啥我的 SoundPool 声音第一次在 Android 上没有播放?