Android
多媒体之
MediaPlayer
Android
应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。
Android
提供了常见音频,视频的编码,解码机制,
Android
支持的音频格式有
MP3,WAV
和
3GP
等,支持的视频格式有
MP4
和
3GP等。
Android
提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自
Android
应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。
不仅如此,
Android
也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。
——音频和视频的播放
——
MediaPlayer
播放音频
1)MediaPalyer
进行播放控制的方式:
start():
开始或者恢复播放
stop():
停止播放
pause():
暂停播放
2)MediaPlayer
装载指定音频文件的方式
static MediaPlayer create
(Content,Uri):
从指定
Uri
来装载音频文件,并返回新创建的
MediaPlayer
对象。
static MediaPlayer create(Content,int resid):
从
redid
资源
ID
来装载音频文件,并返回新创建的
MediaPlayer
对象。
上面这两个方法使用起来很简单,但这两个方法每次都会返回新的
MediaPlayer.
如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过
setDataSource
方法装载指定的音频文件。
MediaPlayer m = new MediaPlayer():
只需要创建一个对象
setDataSource(String path):
指定装载
path
路径所代表的文件
setDataSource(FileDescriptor fs,long offset,long length):
指定装载
fd
所代表的文件中从
offset
开始,长度为
length
的文件内容。
setDataSource(FileDescriptor fd):
指定装载
fd
所代表的文件
setDataSource(Context,Uri):
指定装载
Uri
所代表的文件
执行
setDataSource
方法之后,
MediaPlayer
并未真正装载那些音频文件,还需要调用
prepare()
方法准备装载音频。
3)
播放应用
raw
的资源文件
MediaPlayer m=MediaPlayer.create(this,R.raw.apple);
m.start();
4)
播放应用
raw
的资源文件
MediaPlayer m=new MediaPlayer();
m.setDataSource(Context,Uri.parse(
"android.resource://"+getPackageName()+"/"+R.raw.apple"))
5)
播放应用的原始资源文件
a)
调用
Context
的
getAssets()
获取
AssetManager;
b)
调用
AssetManager
的
openFd(String name)
方法打开指定的原生资源
.
返回
AssetFileDescriptor
对象
c)
调用
AssetFileDescriptor
的
getFileDescriptor()
方法来获取音频文件的
FileDescriptor.
d)
创建
MediaPlayer
对象,调用
setDataSource(FileDescriptor)
方法。
e)
调用
MediaPlayer
的
prepare()
方法准备音频
f)
调用
MediaPlayer
的
start(),stop(),pause()
方法控制播放即可
5)
播放外部存储器上音频文件
a)
创建
MediaPlayer
对象,调用
setDataSource("/sdcard/apple.mp3")
b)
调用
MediaPlayer
对象的
prepare()方法
c)
调用
MediaPlayer
的
start(),stop(),pause()
方法控制播放即可
6)
播放来自网络的音频文件
a)
根据网络上的音频文件所在的位置创建
Uri
对象。
Uri uri = Uri.parse("http://www.baidu.com/song.mp3");
b)
创建
MediaPlayer
对象,调用
setDataSource(Context,Uri);
c)
调用
MediaPlayer
对象的
prepare()方法
d)
调用
MediaPlayer
的
start(),stop(),pause()
方法控制播放即可
7)
如播放下一首歌曲的代码:
mPlayer.reset();//
空闲状态
mPlayer.setDataSource("/sdcard/gequ.mp3");
mPlayer.prepare();
mPlayer.start();
8)MediaPlayer
还提供了事件监听器的方法
setOnCompletionListener():
播放完成事件绑定事件监听器
setOnErrorListener():
播放错误事件绑定事件监听器
setOnPreparedListener():
调用
prepare()
方法时触发该监听器
setOnSeekCompleteListener():
调用
seek()
方法时触发该监听器
9)Mediaplayer
除了调用
prepare()
方法准备声音之外,
还可以调用
prepareAsync()
来准备声音,他们的区别在于:
prepareAsync()
是异步的,它不会阻塞当前的
UI
线程。
10)MediaPlayer
的状态图
reset():
清空MediaPlayer
中的数据
setDataSource():
设置音频数据
prepare():
准备装载音频数据
prepareAsync():
准备装载音频数据(异步)
seekTo():
重新定位到音频数据的什么位置,单位毫秒
seekTo()
是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发
OnSeekComplete.onSeekComplete()
,如果需要是可以调用
setOnSeekCompleteListener(OnSeekCompleteListener)
设置监听器来处理的。
start():
pause():
stop():
release():
释放
MediaPlayer
资源
11)
其他的方法
setLooping(true):
是否重复播放
setAudioStreamType()
设置使用的音频流
A(播放音乐的界面)—>B
onPause()—>onCreate,onStart/onResume
—>onStop
先看效果吧:
接下来我就说下步骤:
1.音乐路径:
我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~
2.播放音乐要MediaPlayer
MediaPlayer
mediaPlayer=new MediaPlayer();
3.音乐的声音控制
AudioManager
audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
4.音乐的开始与暂停
public void start(View view){
mediaPlayer.start();
new Thread(){
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//一秒
Message msg=
handler.obtainMessage();
msg.what=0x123;
handler.sendMessage(msg);
}.start();
public void stop(View view){
mediaPlayer.pause();
}
5.布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:onClick="start"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"
android:onClick="stop"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/sb1"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/sb2"/>
</LinearLayout>
6.Activity:
public class MainActivity extends Activity {
private SeekBar sb1,sb2;
private MediaPlayer mediaPlayer;
private TextView tv;
private AudioManager audioManager;
private Handler handler =new Handler(){
//收到Handler发回的消息被回调
public void handleMessage(Message msg) {
//更新UI组件
if(msg.what==0x123){
int current=mediaPlayer.getCurrentPosition();
sb1.setProgress(current);
public void start(View view){
mediaPlayer.start();
new Thread(){
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//一秒
Message msg=
handler.obtainMessage();
msg.what=0x123;
handler.sendMessage(msg);
}.start();
public void stop(View view){
mediaPlayer.pause();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sb1=(SeekBar) findViewById(R.id.sb1);
sb2=(SeekBar) findViewById(R.id.sb2);
tv=(TextView) findViewById(R.id.tv);
//实例了一个mediaplayer,并给它装在了音乐
/*//这个方法使用起来很简单
//但是这俩个方法每次都会返回新的MediaPlayer
//如果程序需要播放多个音频文件
//使用该方法不合适
mediaPlayer=mediaPlayer.create(this, R.raw.music);*/
mediaPlayer=new MediaPlayer();
//加载资源文件
try {
String path=Environment.getExternalStorageDirectory().
getAbsolutePath()+"/music.mp3";
mediaPlayer.setDataSource(path);
/*mediaPlayer.setDataSource(this,
Uri.parse
("android.resource://"+getPackageName()+"/"+R.raw.music));*/
//如果是setDataSource,那么调用完这个文件之后,音频文件没有真正的加载
//要调用prepare方法
//异步的加载方式
//mediaPlayer.prepareAsync();
mediaPlayer.prepare();
//设置循环播放
mediaPlayer.setLooping(false);
//mediaPlayer.setOnErrorListener(listener);
//1.setLooping --false
//2.在播放完成时触发
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
//加载下一首
Toast.makeText(MainActivity.this, "播放完成", 0).show();
tv.setText(convert(mediaPlayer.getDuration()));
sb1.setMax(mediaPlayer.getDuration());
sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
//mediaPlayer.start();
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
if(fromUser){
mediaPlayer.seekTo(progress);
audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
sb2.setMax(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
sb2.setProgress(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));
sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
//一句话
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
progress, AudioManager.FLAG_SHOW_UI);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
protected void onDestroy() {
// TODO Auto-generated method stub
if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer=null;//回收资源
super.onDestroy();
private String convert(int duration){
int second=duration/1000;
int minute=second/60;
//剩余秒数
int miao=second%60;
return minute+":"+miao;
一个极其简单的音乐播放器~很简单很简单~~先看效果吧:接下来我就说下步骤:1.音乐路径:我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~2.播放音乐要MediaPlayerMediaPlayer mediaPlayer=new MediaPlayer();3.音乐的声音控制AudioManager au
Android中播放音乐的几种方式前言
前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑,其中涉及,RxJava2的被压、解除订阅等知识点,虽然简单,最起码没有丢了RxJava,后续Rxjava会继续研究,做记录.
andorid提供了对声音
class main
user media
group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm
ioprio rt 4
Android:使用MediaPlayer播放本地音乐标签(空格分隔): androidAndroid使用MediaPlayer播放本地音乐
一装载音频
1 静态方法
2 动态加载
3 两种方式对比
二MediaPlayer的控制方法
三事件监听
1 准备监听事件
2 完成监听事件
3 错误监听事件
4 定位监听事件
四进度控制
1 添加SeekBar控件
2 给SeekBar设置监听
3 在启动播
项目背景:
多媒体USB音乐,底层调用MediaPlayer来播放U盘中读取的歌曲,由于最初版本将一首MP3歌曲甜蜜蜜写到了AS的raw目录,直接本地播放,做了一首假数据:
//临时代码,写死歌曲甜蜜蜜,点击后会播放甜蜜蜜
// mMediaPlayer.setDataSource(AudioHelper.getContext(),
// Uri.parse("android.resource://"+AudioHel
MediaPlayer通过资源ID播放Raw目录下音频资源文件:MediaPlayer mMediaPlayer;
mMediaPlayer = MediaPlayer.create(this, R.raw.bomb); //
mMediaPlayer.setLooping(true); // 设置循环播放
mMediaPlayer.start(); // 开始播放
mMediaPlayer.s
(1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面
(2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本控件,用于提示当前播放状态和 播放暂停 停止等功能。具体代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
androi
MediaPlayerMediaPlayer类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。它支持三种不同的媒体来源:
内部URI,比如你可以通过ContentResolver来获取
外部URL(流)
对于Android支持的媒体格式列表,可见:Supported Media Formats文档在播放网络上的视频流时,Android原生的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
Android 可以通过以下几个步骤来实现播放音乐:
1. 创建一个 MediaPlayer 对象,该对象将用于播放音乐。可以使用 MediaPlayer 类提供的静态方法 create() 来创建一个新的 MediaPlayer 对象。
2. 为 MediaPlayer 对象设置数据源。可以使用 setDataSource() 方法设置要播放的音乐文件的路径或 URI。
3. 准备 MediaPlayer 对象。可以使用 prepare() 或 prepareAsync() 方法准备 MediaPlayer 对象。如果使用 prepareAsync() 方法,则需要注册一个 OnPreparedListener 来在 MediaPlayer 准备完成后接收通知。
4. 开始播放音乐。可以使用 start() 方法开始播放音乐。
5. 可以使用 pause() 方法暂停播放音乐,并使用 seekTo() 方法跳到特定的播放位置。
6. 播放完成后,可以使用 setOnCompletionListener() 方法注册一个 OnCompletionListener,以便在播放完成时接收通知。
7. 最后,可以在 Activity 或 Fragment 的 onDestroy() 方法中释放 MediaPlayer 对象,并将其设置为 null。
以上就是在 Android 上实现播放音乐的基本步骤。