Android开发Android开发Android开发经验谈

初级视频播放功能

2019-08-15  本文已影响4人  Ad大成

打开相册选择视频

/**
 * 打开相册,选择视频
 */
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();
}
上一篇下一篇

猜你喜欢

热点阅读