Android 音频(干货)

本文通过示例代码详细解析了Android开发中SoundPool组件的使用方法,并针对其加载与播放不同步的问题给出了具体解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

妹的,博主测了一晚上,有的时候有声音,有的时候没有,终于找到原因了= =!!!

看官看完代码应该就知道答案了,答案最后给出


public class MainActivity extends Activity {
	MediaPlayer mMediaPlayer;//适合加载长时段的音频,加载速度慢,只能加载一个音频
	SoundPool soundPool;//适合加载短的音频,加载速度快,可以同时播放多个音频,可以设置声音的大小、速度、品质等
	HashMap<Integer, Integer> soundPoolMap;//由于Load的时候是独立一个线程,所以先要加载好放到一个地方(所以这里暂且先放MAP里咯,下面有说明)
	float streamVolumeCurrent;//当前音量

	@SuppressLint("NewApi")//判断soundPool中音频是否加载完成需要api8,我设的最低是7= =
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		 mMediaPlayer = MediaPlayer.create(this,R.raw.backsound);//初始化MediaPlayer
		 //测试pause和stop
		 try {
		 mMediaPlayer.start();
		 Thread.sleep(3000);
		 mMediaPlayer.seekTo(0);//回到播放起点
		 Thread.sleep(3000);
		 mMediaPlayer.start();
		 Thread.sleep(3000);
		 mMediaPlayer.pause();
		 Thread.sleep(3000);
		 mMediaPlayer.start();
		 mMediaPlayer.stop();//经博主测试,stop后就无法启动了
		 } catch (InterruptedException e) {
		 // TODO Auto-generated catch block
		 e.printStackTrace();
		 }

		 //初始化,参数分别为:最多可同时播放数,播放类型,播放质量
		soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
		//这里放入了两个音频
		soundPoolMap = new HashMap<Integer, Integer>();
		//最后一个参数是代表优先级
		soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1));
		soundPoolMap.put(2, soundPool.load(this, R.raw.dog, 1));
		//获取当前音量
		AudioManager mgr = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
		streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
		//这里监听音频加载完成
		soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
			
			@SuppressLint("NewApi")
			@Override
			//三个参数分别代表:soundPool,sampleId,status
			public void onLoadComplete(SoundPool arg0, int arg1, int arg2) {
				//当status状态为0时表示加载完成
				if (arg2 == 0){

					try {
						/*播放音频
						参数说明:
						soundID:资源ID
						leftVolume:左频道声音
						rightVolume:右频道声音
						loop:-1代表循环,0代表不循环
						rate:值0.5-2.0设置1为正常*/
						
						//加载成功后的音频5秒钟后停止
						soundPool.play(soundPoolMap.get(arg1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);
						Thread.sleep(5000);
						soundPool.stop(arg1);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			}
		});
		

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		//退出销毁
		soundPool.release();
	}

}



原因是soundPool.load加载的时候它是独立线程不占用主线程,所以2货博主开始的错误代码是

soundPool.play(soundPool.load(this, R.raw.bird, 1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);

后来写成这样也不对

soundPoolMap.put(1, soundPool.load(this, R.raw.bird, 1));
soundPool.play(soundPoolMap.get(1), streamVolumeCurrent, streamVolumeCurrent, 1, -1, 1f);
都是因为没有加载完就开始播放了,没加载完你能播个毛线啊!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值