samplerate
Android 怎么播放网页上的音频
对播放行为的控制是三个大家非常熟悉的方法:start()、stop()和pause()。通过static MediaPlayer create(Context, Uri)这个方法,可以获得一个新创建的MediaPlayer对象。在播放过程中,有几个可以监听播放过程的监听器,如:n setOnCompletionListener(MediaPlayer.OnCompletionListener listener),监听音频播放结束;n setOnErrorListener(MediaPlayer.OnErrorListener listener),监听播放过程中的错误事件;n setOnPreparedListener(MediaPlayer.OnPreparedListener listener),当prepare()被调用时触发。然而,使用MediaPlayer播放时,也有一些问题。我们知道MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁的时间相对较长。此外,如果我们需要在同一时刻播放很多声音,MediaPlayer是不支持的。因此,我们需要一个更加轻量级的声音播放工具。Android提供了另外一种,叫做SoundPool,它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。下面我们进入一个实例看看SoundPool到底是怎么工作的。例如,现在在一个五子棋游戏中,我们需要在棋子落盘的时候播放一段声音。我们可以利用SoundPool,因为它时间很短,而且需要反复播放,并且我们不希望声音占用太大资源。先看看代码:private SoundPool soundPool;soundPool= newSoundPool(10,AudioManager.STREAM_SYSTEM,5);soundPool.load(this,R.raw.collide,1);soundPool.play(1,1, 1, 0, 0, 1);代码非常简单,第一行是声明了一个SoundPool对象,这个一般是作为类的成员属性出现的。第二行将soundPool实例化,第一个参数为soundPool可以支持的声音数量,这决定了Android为其开设多大的缓冲区,第二个参数为声音类型,在这里标识为系统声音,除此之外还有AudioManager.STREAM_RING以及AudioManager.STREAM_MUSIC等,系统会根据不同的声音为其标志不同的优先级和缓冲区,最后参数为声音品质,品质越高,声音效果越好,但耗费更多的系统资源。第三行,系统为soundPool加载声音,第一个参数为上下文参数,第二个参数为声音的id,一般我们将声音信息保存在res的raw文件夹下,如下图所示。第三个参数为声音的优先级,当多个声音冲突而无法同时播放时,系统会优先播放优先级高的。第四行就是播放了,第一个参数为id,id即为放入到soundPool中的顺序,比如现在collide.wav是第一个,因此它的id就是1。第二个和第三个参数为左右声道的音量控制。第四个参数为优先级,由于只有这一个声音,因此优先级在这里并不重要。第五个参数为是否循环播放,0为不循环,-1为循环。最后一个参数为播放比率,从0.5到2,一般为1,表示正常播放。
android 如何实现音乐播放
在Android平台下,要实现声音的播放是十分容易实现的,只要生成一个MediaPlayer对象,并调用它的相关方法,就能改变对声音播放进行控制。MediaPlayer对象有一下各种状态: 熟悉了MediaPlayer对象的各种状态后以及转换条件,就能很好的控制媒体播放。 例如:播放res/raw文件夹中的歌曲十分简单,只需写如下代码: MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);mp.start(); 也可以指定音乐文件的位置来进行播放,例如,在sdcard根目录下有有一首歌曲:test.mp3。则可以这样播放: MediaPlayer mp = new MediaPlayer(); String song = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.mp3"; try { mp.setDataSource(song); mp.prepare(); mp.start(); } catch (Exception e) { e.printStackTrace(); } 建议在播放音乐的时候把MediaPlayer放在Service中,因为如果放在Activity中会使得界面特别卡。而且音乐不能放到后台里播放,一旦退出Activity,音乐就会暂停播放。 可以在Activity中布局相关的界面,例如按钮等。然后通过这个Activitiy来启动这个Service。要通过UI与Service交互,可以通过Intent对象传递消息。更复杂一些,要实现Service向Activity发送消息,并利用这些消息来更新UI,这可以用广播机制,例如告诉Activity是否正在播放,播放进度,当前播放歌曲条目等信息。 例如以下实例代码: /*Activity中*/@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnPlay = (Button)findViewById(R.id.btnPlay); btnPause = (Button)findViewById(R.id.btnPause); btnPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SoundService.class); intent.putExtra("playing", true); startService(intent); } }); btnPause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SoundService.class); intent.putExtra("playing", false); startService(intent); } }); }} 播放音乐的Service代码:package com.yzy.sound; import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder; public class SoundService extends Service { private MediaPlayer mp; @Override public void onCreate() { super.onCreate(); mp = MediaPlayer.create(this, R.raw.test); } @Override public void onDestroy() { super.onDestroy(); mp.release(); stopSelf(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { boolean playing = intent.getBooleanExtra("playing", false); if (playing) { mp.start(); } else { mp.pause(); } return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } }
上一篇:网购电影票
下一篇:没有了