美文网首页
视频播放

视频播放

作者: dev晴天 | 来源:发表于2018-08-11 19:38 被阅读0次
    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/中下载到。)
    

    相关文章

      网友评论

          本文标题:视频播放

          本文链接:https://www.haomeiwen.com/subject/qxzdbftx.html