初级视频播放功能

作者: Ad大成 | 来源:发表于2019-08-15 17:15 被阅读4次

    打开相册选择视频

    /**
     * 打开相册,选择视频
     */
    public void pickVideo(View view) {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("video/*");
        startActivityForResult(intent, REQUEST_CODE);
    }
    

    使用系统播放器播放视频

    /**
     * 调用系统播放器播放视频
     */
    private void playVideoBySystemPlayer(Uri uri) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "video/*");
        startActivity(intent);
    }
    

    使用VideoView播放视频

    public void playInVideoView(Uri uri) {
        VideoView videoView = this.findViewById(R.id.videoView);
    //创建视频设置控制栏
        MediaController controller = new MediaController(activity); 
    // 必须传有Window的Context,比如Activity
    //给videoview设置控制栏
        videoView.setMediaController(controller);
    //控制栏的位置依附到videoview上
        controller.setAnchorView(videoView);
    //加载视频
        videoView.setVideoURI(uri);
    //开启视频
        videoView.start();
    }
    
    // 获取视频的长度
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            // 视频的播放时长
            int duration = videoView.getDuration(); 
        }
    });
    

    使用SurfaceView播放视频

    1. void surfaceCreated(SurfaceHolder holder):当SurfaceHolder被创建的时候回调。
    1. void surfaceChange(SurfaceHolder holder):当SurfaceHolder的尺寸发生变化的时候被回调。
    1. void surfaceDestroyed(SurfaceHolder holder):当SurfaceHolder被销毁的时候回调。
    private void playVideo(SurfaceView surfaceView) {
        try {
            // MediaPlayer
            final MediaPlayer mediaPlayer = new MediaPlayer();
            Uri uri = Uri.parse("http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4");
            mediaPlayer.setDataSource(this, uri);
            // SurfaceHolder
            surfaceView.getHolder().addCallback(new SurfaceHolder.Callback2() {
                @Override
                public void surfaceRedrawNeeded(SurfaceHolder holder) {
    
                }
    
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    // SurfaceView创建时调用
                    try {
                        mediaPlayer.setDisplay(holder);
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                    // 横竖屏切换
                }
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    // SurfaceView销毁时调用
                    mediaPlayer.stop();
                    mediaPlayer.release();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    获取视频封面

    public void getVideoCover() {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        Uri uri = Uri.parse("http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4");
        retriever.setDataSource(uri.toString(), new HashMap<String, String>()); // 获取网络视频的元信息
        // retriever.setDataSource(context,uri); // 获取本地视频的元信息
        Bitmap bitmap = retriever.getFrameAtTime();
        imageView.setImageBitmap(bitmap);
        // 获取屏幕的宽高
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        int widthPixels = metrics.widthPixels;
        int heightPixels = metrics.heightPixels;
        // 重新设置SurfaceView宽高
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        // 计算最佳缩放比例
        float widthRatio = width * 1.0f / widthPixels;
        float heightRatio = height * 1.0f / heightPixels;
        float ratio = Math.max(widthRatio, heightRatio);
        // 计算视频显示的宽高
        int displayWidth = (int) (width / ratio);
        int displayHeight = (int) (height / ratio);
        // 设置SurfaceView的宽高
        ViewGroup.LayoutParams layoutParams = surfaceView.getLayoutParams();
        layoutParams.width = displayWidth;
        layoutParams.height = displayHeight;
        surfaceView.requestLayout();
    }
    

    相关文章

      网友评论

        本文标题:初级视频播放功能

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