一.MediaPlayer

Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的

二.创建MediaPlayer实例

1:MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
2:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

三.MediaPlayer API

Android通过控制播放器的状态的方式来控制媒体文件的播放

prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。

start()是真正启动文件播放的方法,pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。

release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。

reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

四.例子,代码

4.1播放音乐

public class PlayMusicActivity extends Activity {

    private SeekBar sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_music);
sb=(SeekBar)findViewById(R.id.sb);
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mp!=null)
mp.seekTo(seekBar.getProgress());
}
});
} //播放音乐
MediaPlayer mp;
boolean isRun=true;
public void doPlay(View view){
if(mp!=null)
return;
isRun=true;
mp=new MediaPlayer();//构建一个播放器对象
mp.reset();//点击播放重置
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3";//歌曲的路径
try {
mp.setDataSource(path);//设置要播放的文件路径
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置多媒体类型
mp.prepare();//准备就绪
sb.setMax(mp.getDuration());//设置进度条最大值为音频文件的持续时间
mp.start();//开始播放 //更新进度
new Thread(new Runnable() {
@Override
public void run() {
while(isRun&&mp.getCurrentPosition()<=sb.getMax()){
sb.setProgress(mp.getCurrentPosition());
SystemClock.sleep(200);
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
} public void doPause(View view){
if(mp==null)
return;
if(mp.isPlaying()){
mp.pause();
((Button)view).setText("继续播放");
}else{
mp.start();
((Button)view).setText("暂停");
}
} public void doStop(View view){
if(mp!=null&&mp.isPlaying()){
isRun=false;
mp.stop();
mp.release();
mp=null;
}
} @Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
}
}

4.2播放视频

1.方法一:

//播放视频一
public void playVedio_1(View view){
Intent intent=new Intent(Intent.ACTION_VIEW);
Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");//更换为你自己的路径
intent.setDataAndType(uri,"video/mp4");
startActivity(intent);
}

2.方法二:

//播放视频二
public void playVedio_2(View view){
Intent intent=new Intent(this,PlayVideoActivity.class);
startActivity(intent);
}
public class PlayVideoActivity extends Activity {

    private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_video);
videoView=(VideoView)findViewById(R.id.videoView);
videoView.setMediaController(new MediaController(this));
Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");
videoView.setVideoURI(uri);
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
videoView.setBackground(null);
videoView.start();
}
});
}
}).start();
}
}

3.方法三:

//播放视频三
public void playVedio_3(View view){
Intent intent=new Intent(this,PlayVideo_2Activity.class);
startActivity(intent);
}
public class PlayVideo_2Activity extends Activity {

    private MediaPlayer mp;
private SurfaceView sfView;
private SurfaceHolder holder;
private SeekBar sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_video_2); sb=(SeekBar)findViewById(R.id.sb);
sfView=(SurfaceView)findViewById(R.id.sfView);
holder=sfView.getHolder(); sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mp!=null)
mp.seekTo(seekBar.getProgress());
}
});
} boolean isRun=true;
public void doPlay(View view){
if(mp!=null)
return;
isRun=true;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/goodmm.mp4";
try {
mp.setDataSource(path);//设置数据源
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDisplay(holder);//设置显示位置
mp.prepare();
sb.setMax(mp.getDuration());
sfView.setBackground(null);
mp.start(); new Thread(new Runnable() {
@Override
public void run() {
while (isRun&&mp.getCurrentPosition()<=sb.getMax()){
sb.setProgress(mp.getCurrentPosition());
SystemClock.sleep(200);
}
}
}).start(); } catch (IOException e) {
e.printStackTrace();
}
} public void doPause(View view){
if(mp==null)
return;
if(mp.isPlaying()){
mp.pause();
((Button)view).setText("继续播放");
}else{
mp.start();
((Button)view).setText("暂停");
}
} public void doStop(View view){
if(mp!=null&&mp.isPlaying()){
isRun=false;
mp.stop();
mp.release();
mp=null;
}
} @Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
} }

4.3录制

MediaRecorder:

Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。 
MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的。

4.3.1录制音频并播放

//录制音频
public void recorder_test(View view){
Intent intent=new Intent(this,RecorderActivity.class);
startActivity(intent);
}
public class RecorderActivity extends Activity {

    private MediaRecorder recorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder);
} //开始录音
public void doStart(View view){
if(recorder!=null)
return;
recorder=new MediaRecorder();//构建了一个录音设备
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置录音文件格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置声音编码类型
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
recorder.setOutputFile(path);//设置输出文件位置
try {
recorder.prepare();//录音设备就绪
recorder.start();//开始录音
} catch (IOException e) {
e.printStackTrace();
}
} //录音结束
public void doStop(View view){
if(recorder!=null){
recorder.stop();
recorder.release();
recorder=null;
}
} //播放录音
MediaPlayer mp;
public void doPlay(View view){
if(mp!=null)
return;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
try {
mp.setDataSource(path);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
} @Override
protected void onDestroy() {
super.onDestroy();
doStop(null);
}
}

4.3.2录制视频并播放

//录制视频
public void recorder_video_test(View view){
Intent intent=new Intent(this,Recorder_VideoActivity.class);
startActivity(intent);
}
public class Recorder_VideoActivity extends Activity {

    private MediaPlayer mp;
private SurfaceView sfView;
private SurfaceHolder holder;
private MediaRecorder recorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder__video);
sfView=(SurfaceView)findViewById(R.id.sfView);
holder=sfView.getHolder();
} //开始录像
public void doStart(View view){
recorder=new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
recorder.setOutputFile(path);
recorder.setPreviewDisplay(holder.getSurface());
try {
recorder.prepare();
recorder.start();
} catch (IOException e) {
e.printStackTrace();
}
} public void doStop(View view){
if(recorder!=null){
try{
recorder.stop();
}catch (Exception ex){
ex.printStackTrace();
}
} } public void doPlay(View view){
if(mp!=null)
return;
mp=new MediaPlayer();
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
try {
mp.setDataSource(path);//设置数据源
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDisplay(holder);//设置显示位置
mp.prepare();
sfView.setBackground(null);
mp.start();
}catch (Exception ex){
ex.printStackTrace();
} }
}

Android基础_多媒体的更多相关文章

  1. Android基础_一次上传多张图片

    获取权限 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission ...

  2. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  3. Android基础新手教程——4.4.1 ContentProvider初探

    Android基础新手教程--4.4.1 ContentProvider初探 标签(空格分隔): Android基础新手教程 本节引言: 本节给大家带来的是Android四大组件中的最后一个--Con ...

  4. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  5. Android基础测试题(二)

    今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...

  6. Mono.Android 基础

    Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...

  7. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  8. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  9. 基础4 Android基础

    基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...

随机推荐

  1. angularf封装echarts

    前言:angular中快速使用echarts 在html使用ehart很简单,你只需要引入文件和按照官方例子按照对应参数配置和数据填充就Ok了,那么在angular中怎么使用eharts(可以使用ec ...

  2. Spring官方文档翻译

    随笔:有人曾这样评价spring,说它是Java语言的一个巅峰之作,称呼它为Java之美,今天,小编就领大家一起来领略一下spring之美! Spring官方文档:http://docs.spring ...

  3. iOS白名单设置

    在做分享.支付的时候需要跳转到对应的app,这里有需要设置的白名单列表<key>LSApplicationQueriesSchemes</key> <array> ...

  4. 《python参考手册(第四版)》【PDF】下载

    <python参考手册(第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382222 内容介绍 本书是权威的Python语 ...

  5. 当前时间、前n天、后n天、取前n条记录、从第n条开始取m条

    当前时间:NOW() 前n天:DATE_SUB(NOW(),INTERVAL n DAY) 后n天:DATE_SUB(NOW(),INTERVAL -n DAY) 取前n条记录:SELECT * FR ...

  6. Data Base mongodb高版本与低版本的区别

    mongodb高版本与低版本的区别 一.mongodb引擎: Mongodb 3.0支持用户自定义存储引擎,用户可配置使用mmapv1或者wiredTiger存储引擎. 3.2版本以后默认的开启的是w ...

  7. Android 环境搭建、基础窗口window/Mac

    1.五步搞定Android开发环境部署--非常详细的Android开发环境搭建教程 2.Android开发学习之路--MAC下Android Studio开发环境搭建 4.Android常用开发工具以 ...

  8. LeetCode中的最大子串和问题(Maximum Subarray)

    问题描述: Find the contiguous subarray within an array (containing at least one number) which has the la ...

  9. 自定义结构化config文件

    前言 开发过程中我们会经常使用到各种config文件,经常我们会使用appSettings进行设置所用的配置,但是随着配置量的增多,都放在appSettings里面明显是不合适的,一方面配置容易混乱, ...

  10. js获取图片的EXIF,解决图片旋转问题

    相信大家在做项目的时候会遇到在canvas里加入图片时,图片发生90°,180°的旋转.当时的你肯定时懵逼的,为毛. 其实这就是图片的EXIF搞的鬼. 什么是EXIF 简单来说,Exif 信息就是由数 ...