android音视频探究
1 获取mediaplayer 实例
final MediaPlayer mediaPlayer = new MediaPlayer();
//[2]设置你要播放的音频资源的路径 path:可以是网络路径 也可以是本地路径
try {
mediaPlayer.setDataSource("http://169.254.87.250:8080/xpg.mp3");
//[3]准备播放
//mediaPlayer.prepare();
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//[4]开始播放
mediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
2 surfaceview介绍
补充:native方法:是c或者c++实现的
c语言已经帮我们开了子线程 所以我们不用开子线程了
注意:播放视频 只支持3gp 或者 MP4格式 rmvb avi
[1]surfaceView 是一个重量级控件
[2]内部维护了2个线程 A ----加载数据 ----显示数据
B ----负责显示 ---加载数据
[3]可以直接在子线程更新ui
实现代码
private MediaPlayer mediaPlayer;
private int currentPosition; //当前视频播放的位置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SurfaceView sfv = (SurfaceView) findViewById(R.id.sfv);
// [1.1]获取 surfaceHolder
SurfaceHolder holder = sfv.getHolder();
holder.addCallback(new Callback() {
//sufrfaceView销毁了
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
if (mediaPlayer!=null && mediaPlayer.isPlaying()) {
//正在播放
//获取到当前播放的位置
currentPosition = mediaPlayer.getCurrentPosition();
//停止播放
mediaPlayer.stop();
}
}
//说明sufrfaceView 准备好了
@Override
public void surfaceCreated(SurfaceHolder holder) {
//在这个方法里面去播放视频
try {
// [1]获取mediaplayer 实例
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("http://169.254.87.250:8080/cc.MP4");
// [3]准备播放
mediaPlayer.prepareAsync();
// [3.1]设置视频播放的内容 显示的位置 surfaceHolder 用来维护视频的内容
mediaPlayer.setDisplay(holder);
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// [4]开始播放
mediaPlayer.start();
//[5]继续上次的位置继续播放
mediaPlayer.seekTo(currentPosition);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
3 videoView控件的使用
2行代码搞定
videoView是对 SurfaceView 和 mediaPlayer 的封装
github优秀控件:https://github.com/lipangit/JieCaoVideoPlayer
4 vitamio
打造万能的视频播放器
类库
解码的原理:使用的是ffmpeg这样的一个开源项
vitamio官网:https://www.vitamio.org/docs/Tutorial/2014/0423/32.html
github优秀控件:https://github.com/yixia/VitamioBundle/tree/v3.0
1 获取mediaplayer 实例
final MediaPlayer mediaPlayer = new MediaPlayer();
//[2]设置你要播放的音频资源的路径 path:可以是网络路径 也可以是本地路径
try {
mediaPlayer.setDataSource("http://169.254.87.250:8080/xpg.mp3");
//[3]准备播放
//mediaPlayer.prepare();
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//[4]开始播放
mediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
2 surfaceview介绍
补充:native方法:是c或者c++实现的
c语言已经帮我们开了子线程 所以我们不用开子线程了
注意:播放视频 只支持3gp 或者 MP4格式 rmvb avi
[1]surfaceView 是一个重量级控件
[2]内部维护了2个线程 A ----加载数据 ----显示数据
B ----负责显示 ---加载数据
[3]可以直接在子线程更新ui
实现代码
private MediaPlayer mediaPlayer;
private int currentPosition; //当前视频播放的位置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SurfaceView sfv = (SurfaceView) findViewById(R.id.sfv);
// [1.1]获取 surfaceHolder
SurfaceHolder holder = sfv.getHolder();
holder.addCallback(new Callback() {
//sufrfaceView销毁了
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
if (mediaPlayer!=null && mediaPlayer.isPlaying()) {
//正在播放
//获取到当前播放的位置
currentPosition = mediaPlayer.getCurrentPosition();
//停止播放
mediaPlayer.stop();
}
}
//说明sufrfaceView 准备好了
@Override
public void surfaceCreated(SurfaceHolder holder) {
//在这个方法里面去播放视频
try {
// [1]获取mediaplayer 实例
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("http://169.254.87.250:8080/cc.MP4");
// [3]准备播放
mediaPlayer.prepareAsync();
// [3.1]设置视频播放的内容 显示的位置 surfaceHolder 用来维护视频的内容
mediaPlayer.setDisplay(holder);
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// [4]开始播放
mediaPlayer.start();
//[5]继续上次的位置继续播放
mediaPlayer.seekTo(currentPosition);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
3 videoView控件的使用
2行代码搞定
videoView是对 SurfaceView 和 mediaPlayer 的封装
github优秀控件:https://github.com/lipangit/JieCaoVideoPlayer
4 vitamio
打造万能的视频播放器
类库
解码的原理:使用的是ffmpeg这样的一个开源项
vitamio官网:https://www.vitamio.org/docs/Tutorial/2014/0423/32.html
github优秀控件:https://github.com/yixia/VitamioBundle/tree/v3.0