1控件:surfaceView
videoView 两个控件用来播放视频
2 mediaplayer 只能播放MP4 或者3gp格式
3 surfaceView 重量级控件(用来显示控件内容 但是是耗时操作)
内部维护了两个线程
a 加载数据 显示数据
b 显示数据 加载数据
直接可以再子线程跟新ui(必须使用声明周期的方法)
4
此案例不开线程则需要使用添加生命周期的方法
案例Demo:
public class MainActivity extends AppCompatActivity {
private SurfaceView sfView;
private MediaPlayer mediaPlayer;
private SurfaceHolder sfh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sfView = (SurfaceView) findViewById(R.id.sf_view);
sfh = sfView.getHolder();
}
public void doclick(View view) {
new Thread(){
@Override
public void run() {
SystemClock.sleep(400);// 此处添加线程 睡眠几秒才可出结果
// 1 初始化mediaplayer
mediaPlayer = new MediaPlayer();
// 2设置播放路径 网络或者本地
try {
mediaPlayer.setDataSource("http://192.168.56.1/Demo/a.mp4");
//3 准备
mediaPlayer.prepareAsync();
// 4 设置显示 参数类型 SurfaceHolder 通过surfaceView 的方法获得(用来维护播放内容)
mediaPlayer.setDisplay(sfh);
// 准备监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 开始播放
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
不开线程就使用holder的声明周期播放
此控件播放逻辑比较繁琐 参见videoView
5 VideoView 其实就是对SurfaceView 和mediaplayer的封装
private VideoView vvVideo;// 此控件是对SurfaceView的一个封装
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_view);
// 找控件
vvVideo = (VideoView) findViewById(R.id.vv_video);
// 设置播放路径
vvVideo.setVideoPath("http://192.168.56.1/Demo/a.mp4");
vvVideo.start();
}
播放一段视频要对视频解码的
window下的播放器都使用了
视频解码原理: 使用的都是一个开源项目 ffmpeg(多个c大神写的)谷歌对其进行整改
qq影音的声明例如:(本程序中包含的解码器和滤镜修改了FFmpeg(http://ffmpeg.mplayerhq.hu/)项目中的部分代码,修改的源代码可以在 http://qqplayer.qzone.qq.com/中下载到。)
网友评论