Android基础入门— MediaPlayer播放音频与视频

Android基础入门教程——9.2 MediaPlayer播放音频与视频

标签(空格分隔): Android基础入门教程

本节引言:

本节带来的是Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频

该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码

和播放音视频。它支持三种不同的媒体来源:

本地资源

内部的URI,比如你可以通过ContentResolver来获取

外部URL(流)

对于Android所支持的的媒体格式列表

对于Android支持的媒体格式列表,可见:Supported Media Formats 文档

本节我们就来用MediaPlayer来写个简单的播放音视频的例子!

官方API文档:MediaPlayer

1.相关方法详解

1)获得MediaPlayer实例:

可以直接new或者调用create方法创建:

MediaPlayer mp =newMediaPlayer();MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//无需再调用setDataSource

另外create还有这样的形式:

create(Context context, Uri uri, SurfaceHolder holder)

通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器

2)设置播放文件:

①raw下的资源:MediaPlayer.create(this, R.raw.test);
②本地文件路径:mp.setDataSource("/sdcard/test.mp3");
③网络URL文件:mp.setDataSource("http://www.xxx.com/music/test.mp3");


另外setDataSource()方法有多个,里面有这样一个类型的参数:FileDescriptor,在使用这个

API的时候,需要把文件放到res文件夹平级的assets文件夹里,然后使用下述代码设置DataSource:

AssetFileDescriptor fileDescriptor=getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(),fileDescriptor.getLength());

3)其他方法

<pre>

</pre>

dsd

getCurrentPosition( ):得到当前的播放位置

getDuration() :得到文件的时间

getVideoHeight() :得到视频高度

getVideoWidth() :得到视频宽度

isLooping():是否循环播放

isPlaying():是否正在播放

pause():暂停

prepare():准备(同步)

prepareAsync():准备(异步)

release():释放MediaPlayer对象

reset():重置MediaPlayer对象

seekTo(int msec):指定播放的位置(以毫秒为单位的时间)

setAudioStreamType(int streamtype):指定流媒体的类型

setDisplay(SurfaceHolder sh):设置用SurfaceHolder来显示多媒体

setLooping(boolean looping):设置是否循环播放

setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)

网络流媒体的缓冲监听

setOnCompletionListener(MediaPlayer.OnCompletionListener listener)

网络流媒体播放结束监听

setOnErrorListener(MediaPlayer.OnErrorListener listener)

设置错误信息监听

setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)

视频尺寸监听

setScreenOnWhilePlaying(boolean screenOn):设置是否使用SurfaceHolder显示

setVolume(float leftVolume, float rightVolume):设置音量

start():开始播放

stop():停止播放

2.使用代码示例

示例一:使用MediaPlayer播放音频:

运行效果图

关键代码

public class Main Activity extends AppCompatActivity implements View.OnClickListener {

     private Button btn_play;

     private Button btn_pause;

     private Button btn_stop;

     private MediaPlayer mPlayer =null;

     privatebooleanisRelease=true;// 判断是否MediaPlayer是否释放的标志

@Override

protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     setContentView(R.layout.activity_main);

     bindViews();

}

private void bindViews() {

     btn_play = (Button) findViewById(R.id.btn_play);

     btn_pause = (Button) findViewById(R.id.btn_pause

     btn_stop = (Button) findViewById(R.id.btn_stop);

     btn_play.setOnClickListener(this);

     btn_pause.setOnClickListener(this);

     btn_stop.setOnClickListener(this);

}

@Override

public void onClick(View v) {

    switch(v.getId()){

     case R.id.btn_play:

      if(isRelease){

      mPlayer = MediaPlayer.create(this,R.raw.fly);

      isRelease =false;

      }

     mPlayer.start();//开始播放btn_play.setEnabled(false);

    btn_pause.setEnabled(true);

btn_stop.setEnabled(true);break;

case R.id.btn_pause:

mPlayer.pause();//停止播放btn_play.setEnabled(true);

btn_pause.setEnabled(false);

btn_stop.setEnabled(false);break;

case R.id.btn_stop:

mPlayer.reset();//重置MediaPlayerm

Player.release();//释放MediaPlayer

isRelease =true;

btn_play.setEnabled(true);

btn_pause.setEnabled(false);

btn_stop.setEnabled(false);

break;

}

}

}

}


注意事项:

播放的是res/raw目录下的音频文件,创建MediaPlayer调用的是create方法,第一次启动播放前

不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法!

另外贴下官方文档中,从其他两种途径播放音频的示例代码:

本地Uri

```

Uri myUri = ....; // initialize Uri hereMediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(getApplicationContext(), myUri);mediaPlayer.prepare();mediaPlayer.start();

```

外部URL

String url ="http://........"; // your URL hereMediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(url);mediaPlayer.prepare(); // might take long! (for buffering, etc)mediaPlayer.start();

Note:假如你通过一个URL以流的形式播放在线音频文件,该文件必须可以进行

渐进式下载

示例二:使用MediaPlayer播放视频

MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的

组件来显示MediaPlayer播放的图像输出,我们可以使用用SurfaceView

来显示,下面我们使用SurfaceView来写个视频播放的例子:

运行效果图

实现代码

布局文件:activity_main.xml


MainActivity.java

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener,SurfaceHolder.Callback{privateMediaPlayer mPlayer =null;privateSurfaceView sfv_show;privateSurfaceHolder surfaceHolder;privateButton btn_start;privateButton btn_pause;privateButton btn_stop;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindViews();    }privatevoidbindViews() {        sfv_show = (SurfaceView) findViewById(R.id.sfv_show);        btn_start = (Button) findViewById(R.id.btn_start);        btn_pause = (Button) findViewById(R.id.btn_pause);        btn_stop = (Button) findViewById(R.id.btn_stop);        btn_start.setOnClickListener(this);        btn_pause.setOnClickListener(this);        btn_stop.setOnClickListener(this);//初始化SurfaceHolder类,SurfaceView的控制器surfaceHolder = sfv_show.getHolder();        surfaceHolder.addCallback(this);        surfaceHolder.setFixedSize(320,220);//显示的分辨率,不设置为视频默认}@OverridepublicvoidonClick(View v) {switch(v.getId()) {caseR.id.btn_start:                mPlayer.start();break;caseR.id.btn_pause:                mPlayer.pause();break;caseR.id.btn_stop:                mPlayer.stop();break;        }    }@OverridepublicvoidsurfaceCreated(SurfaceHolder holder) {        mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson);        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);        mPlayer.setDisplay(surfaceHolder);//设置显示视频显示在SurfaceView上}@OverridepublicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,intheight) {}@OverridepublicvoidsurfaceDestroyed(SurfaceHolder holder) {}@OverrideprotectedvoidonDestroy() {super.onDestroy();if(mPlayer.isPlaying()) {            mPlayer.stop();        }        mPlayer.release();    }}

代码很简单,布局有个SurfaceView,然后调用getHolder获得一个SurfaceHolder对象,

在这里完成SurfaceView相关的设置,设置了显示的分辨率以及一个Callback接口,

重写了SurfaceView创建时,发生变化时,以及销毁时的三个方法!然后按钮控制播放

以及暂停而已~

示例三:使用VideoView播放视频

除了使用MediaPlayer + SurfaceView播放视频的方式,我们还可以使用VideoView来直接

播放视频,我们稍微改点东西就可以实现视频播放!运行效果和上面的一致,就不贴了,

直接上代码!

MainActivity.java

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateVideoView videoView;privateButton btn_start;privateButton btn_pause;privateButton btn_stop;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindViews();    }privatevoidbindViews() {        videoView = (VideoView) findViewById(R.id.videoView);        btn_start = (Button) findViewById(R.id.btn_start);        btn_pause = (Button) findViewById(R.id.btn_pause);        btn_stop = (Button) findViewById(R.id.btn_stop);        btn_start.setOnClickListener(this);        btn_pause.setOnClickListener(this);        btn_stop.setOnClickListener(this);//根据文件路径播放if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            videoView.setVideoPath(Environment.getExternalStorageDirectory() +"/lesson.mp4");        }//读取放在raw目录下的文件//videoView.setVideoURI(Uri.parse("android.resource://com.jay.videoviewdemo/" + R.raw.lesson));videoView.setMediaController(newMediaController(this));    }@OverridepublicvoidonClick(View v) {switch(v.getId()) {caseR.id.btn_start:                videoView.start();break;caseR.id.btn_pause:                videoView.pause();break;caseR.id.btn_stop:                videoView.stopPlayback();break;        }    }}


本节小结:

好的,本节跟大家简单的介绍了下如何使用MediaPlayer播放音频以及结合SurfaceView

来播放视频,最后还写了一个用VideoView播放视频的例子,都是些非常简单的用法~

相信大家学习起来非常简单~嗯,谢谢~


//http://www.w2bc.com/Article/80927

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容