初级视频播放功能

打开相册选择视频

/**
 * 打开相册,选择视频
 */
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();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 项目需要做一个简单的播放视频功能demo,后期会换成公司自己的组件,所以就没考虑使用第三方库了,直接上系统的Vid...
    冰川孤辰js阅读 70,669评论 24 130
  • 在一个寒冷的冬天,屋外风雪交加。天空灰蒙蒙的,鹅毛般的大雪纷纷扬扬地飘落下来,像给大地穿上了一件雪白的棉袄。 ...
    65a95057a802阅读 247评论 0 0
  • 今天在百度上看到一篇文章,觉得这一段关于意志力和气场的关系的描述挺好,现分享给大家: “意志力在...
    愿充凤凰茶山客阅读 727评论 8 13

友情链接更多精彩内容