Android学习总结(十六) ———— MediaPlayer播放音频与视频
一、基本概念
本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构。Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。 MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
它支持三种不同的媒体来源:
- 本地资源
- 内部的URI,比如你可以通过ContentResolver来获取
- 外部URL(流) 对于Android所支持的的媒体格式列表
二、代码之旅
2.1 使用MediaPlayer播放音频:
布局代码很简单,就播放、暂停、停止按钮,这里就不写出来了,我们还是赶紧看看关键代码吧,代码示例如下:
package com.nyl.mediaplayertest; import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnPlay;
private Button btnPause;
private Button btnStop; private MediaPlayer mediaPlayer = null;
private boolean isRelease = true; //判断MediaPlayer是否释放的标志 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); //初始化控件
} private void initView() {
btnPlay = (Button) findViewById(R.id.btnPlay);
btnPause = (Button) findViewById(R.id.btnPause);
btnStop = (Button) findViewById(R.id.btnStop); btnPlay.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnStop.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnPlay: //播放
if (isRelease){
//在raw下的资源
mediaPlayer = MediaPlayer.create(this,R.raw.fly);
isRelease = false;
}
mediaPlayer.start(); //开始播放
btnPlay.setEnabled(false);
btnPause.setEnabled(true);
btnStop.setEnabled(true);
break; case R.id.btnPause:
mediaPlayer.pause(); //停止播放
btnPlay.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
break; case R.id.btnStop:
mediaPlayer.reset(); //重置MediaPlayer
mediaPlayer.release(); //释放MediaPlayer
isRelease = true;
btnPlay.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
break;
}
}
}
注意:播放的是res/raw目录下的音频文件,创建MediaPlayer调用的是create方法,第一次启动播放前 不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法!
当点击播放按钮时,音乐就会播放,哈哈哈~话不多说,感兴趣的朋友还是自己动手操作吧,我们来看运行效果图,如下所示:

2.2 使用MediaPlayer播放视频
MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的 组件来显示MediaPlayer播放的图像输出,我们可以使用用SurfaceView 来显示,下面我们使用SurfaceView来写个视频播放的例子,布局代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <SurfaceView
android:id="@+id/sfvShow"
android:layout_width="match_parent"
android:layout_height="300dp" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center|bottom"> <Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始" /> <Button
android:id="@+id/btnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停 " /> <Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="终止" /> </LinearLayout> </LinearLayout>
接着就是最关键的代码的,如下所示:
package com.nyl.mediaplayerdemo; import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener, SurfaceHolder.Callback { private SurfaceView sfvShow;
private Button btnStart;
private Button btnPause;
private Button btnStop; private MediaPlayer mediaPlayer = null;
private SurfaceHolder surfaceHolder; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView(); //初始化布局控件
} private void initView() {
sfvShow = (SurfaceView) findViewById(R.id.sfvShow);
btnStart = (Button) findViewById(R.id.btnStart);
btnPause = (Button) findViewById(R.id.btnPause);
btnStop = (Button) findViewById(R.id.btnStop); btnStart.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnStop.setOnClickListener(this); //初始化SurfaceHolder类,SurfaceView的控制器
surfaceHolder = sfvShow.getHolder();
surfaceHolder.addCallback(this);
//显示的分辨率,不设置为视频默认
surfaceHolder.setFixedSize(320,220);
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnStart:
mediaPlayer.start();
break;
case R.id.btnPause:
mediaPlayer.pause();
break;
case R.id.btnStop:
mediaPlayer.stop();
break;
} } @Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.lesson);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置视频显示在SurfaceView上
mediaPlayer.setDisplay(surfaceHolder);
} @Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } @Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
运行效果图如下所示:

亲爱的园友们,MediaPlayer播放音频与视频我们就学到这里了,有什么不足的地方欢迎大家提出宝贵意见哦!
Android学习总结(十六) ———— MediaPlayer播放音频与视频的更多相关文章
- android 学习随笔十六(广播 )
1.广播接收者 BroadcastReceiver 接收系统发出的广播 现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了 Andro ...
- Android学习(十六) 通过GestureOverlayView进行手势识别
一.使用GestureOverlayView进行手势识别: 1.使用Gestures Builder生成手势文件,Gestures Builder为SDK中的示例项目,使用new-->Other ...
- Android学习(十六) 通过GestureDetector进行手势识别
一.手势交互过程: 1)触屏时,触发MotionEvent事件. 2)被OnTouchListener监听,在onTouch()中获得MotionEvent对象. 3)GestureDetector转 ...
- MediaPlayer播放音频,也可以播放视频
使用MediaPlayer播放音频或者视频的最简单例子: JAVA代码部分: public class MediaPlayerStudy extends Activity { private Butt ...
- Android MediaPlayer 播放音频
本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPla ...
- 十一、Android学习第十天——项目开始(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十一.Android学习第十天——项目开始 Android知识点的学习告一 ...
- Android学习第十天
计算机表示图形的几种方式 a) Bmp:以高质量保存,用于计算机 b) Jpg:以良好的质量保存,用于计算机或网络 c) Png:以高质量保存 d) ...
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十六周
java学习第十六周-并发 本周,学习了Java中线程,并发的知识,在老师的带领下,进行了对知识的理解学习,以及对实验的运行讲解,对这一块内容掌握的还可以,在自主编程中,也能够完成.线, ...
随机推荐
- bzoj3625
fft 分治虽然是万能的,但是太慢了 分治是nlog^2n的,太慢了,于是我们用求逆和开根 设f(x)表示答案为x的方案数 c表示物品的生成函数 那么f=f*f*c+1 f*f表示左右儿子的方案数 c ...
- linux中消息队列<一>
1 概念 (1)链表式结构组织,存放于内核. (2)通过队列标识来引用. (3)通过一个消息类型来索引指定的数据 2 创建消息队列 #include <sys/msg.h> int msg ...
- HDU - 2612 Find a way 双起点bfs(路径可重叠:两个队列分别跑)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- jQuery 如何获取ASP.NET服务器控件的值
由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,总结有以下3种方法: 服务器控件代码:<asp:TextBox ID="txtUserID ...
- 简单实现TabBar的自定义
StackoverFlow上看到的,通过继承UITabBarController创建自定义TabBarController.在原有TabBar的基础上添加一个背景层,在其基础上增加三个自定义按钮,通过 ...
- 【NOI广东省选模拟赛】割
[问题描述] 给出 n 个数 a1,a2,...,an, 询问有多少个三元组(i, j, k)满足以下两个条件:1. i < j < k: 2. ai*aj*ak 是 p 的倍数. [输入 ...
- react native设置容器阴影
shadowColor:'#eee',shadowOffset:{h:10,w:10},shadowRadius:3,shadowOpacity:0.8,
- vi/vim打开文件提示Found a swap file by the name
问题分析 有一次在远程连接主机时,用vi打开文件my.ini却提示:Found a swap file by the name ".my.ini.swp".百度了下才知道,原来在使 ...
- android studio ffmpeg简单使用 (cmake)
编译ffmpeg android studio 新建项目,勾选上 将编译好的libffmpeg.so库扔到src/main/jniLibs/armeabi下(主要这里我只编译了arm的ffmpeg的库 ...
- Zynq7000开发系列-4(新:Xilinx交叉编译环境搭建)
一.前言 本来上一篇文章已经讲了Xilinx交叉编译环境的搭建,但是我在后续的使用中发现:使用2011年版本的交叉编译链编译OpenCV 3.1.0时出现错误: 网络搜索一番,查明是交叉编译链的问题 ...