引言:多媒体:(包含文字 图片 音频 视频)
一、MediaPlayer的简介
请看官方文档介绍:MediaPlayer class can be used to control playback of audio/video files and streams.
意思是:媒体播放器类可用于控制音频/视频文件和流的播放。
同时MediaPlay有生命周期,如下:
二、示例(播放音频)
//1.创建一个MediaPlayer对象
MediaPlayer player = new MediaPlayer();
// 2.设置要播放的资源 path 可以是本地也可以是网络
try {
player.setDataSource(Environment.getExternalStorageDirectory()
.getPath() + "/xpg.mp3");
// 3.准备播放
player.prepare();
// 设置一个准备完成的监听(设备准备完成后,回调)
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 4.开始播放
player.start();
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.
player.stop();
三、生命周期(略)
四、示例(播放视频)
①播放视频需要用到一个控件,即:SurfaceView 。
②SurfaceView 介绍:
surfaceview 控件是一个重量级控件 ,内部维护了2个线程 。工作原理:假如有A,B线程,
A 获取数据 负责显示
B 负责显示 获取数据 两者交替进行。
surfaceview 可以直接在子线程更新ui (补充: 与进度相关的控件可以直接在子线程更新ui )。
A 获取数据 负责显示
B 负责显示 获取数据 两者交替进行。
surfaceview 可以直接在子线程更新ui (补充: 与进度相关的控件可以直接在子线程更新ui )。
另外:
SurfaceView播放视频,只支持 3gp、MP4格式 。
③示例代码:
final SurfaceHolder surfaceHolder = sfv.getHolder();(sfv是显示视频的控件SurfaceView)
//添加一个callback
surfaceHolder.addCallback(new Callback() {
//当surfaceView销毁的时候调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surface destroyed");
if(player!=null&&player.isPlaying()){
currentPosition = player.getCurrentPosition();
player.stop();
}
}
//当surfaceview初始化了
@Override
public void surfaceCreated(SurfaceHolder holder) {
//1.创建MediaPlayer对象
player = new MediaPlayer();
// 2.设置要播放的资源 path 可以是本地也可以是网络
try {
player.setDataSource(Environment.getExternalStorageDirectory()
.getPath() + "/oppo.mp4");
// 2.1设置播放视频的内容SurfaceHolder 是用来维护视频播放的内容
player.setDisplay(surfaceHolder);
// 3.准备播放,注意:设置的资源是网络资源 要用player.prepareAsync()异步
player.prepare();
// 设置一个准备完成的监听
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 4.开始播放
player.start();
//继续上次的位置播放
player.seekTo(currentPosition);
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//表面发生变化
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
});
五、组件介绍(VideoView)
这个控件其实就是对
SurfaceView
和
MediaPlayer
进行封装。使用起来更加简单。
六、vitamio框架
可以播放市面上大部分格式,同样也是对MediaPlayer的封装、扩展。七、总结
①由于C语言有操作硬件的能力 ,java没有 ,因此mediaPlayer只是上层应用,会通过jni实现native来调用c(c++)进而操作硬件的音乐播放。
②当使用的资源是从网络获取的时候,一定要使用设置的资源是网络资源 要用player.prepareAsync(),此方法是异步的。
③实际应用中,如果只是实现播放功能,就可以使用第三方框架;如果真正去开发播放器,就得用到MediaPlayer,甚至更底层的c(FFmpeg是由几十个C程序员开源项目,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序)。
*