Android视频录制、播放的两种方式一

2025-11-19 17:17:25

1、注意:这里播放camera录制的视频使用VideoView,不使用MediaPlayer和SurfaceView的结合。用帧布局Framelayout布局,VideoView和ImageView,播放时隐藏视频缩略图,暂停时或初始化时显示视频缩略图。

因为VideoView没有设置监听播放和暂停状态的事件,所以我自定义一个CustomVideoView继承了VideoView,在里面创建一个监听方法和重写VideoView的播放、暂停的方法。

使用相机intent获取视频是使用最少代码使得你的应用获取视频的捷径.一个视频获取intent可以包含以下额外信息:

MediaStore.EXTRA_OUTPUT-此设置需要一个保存视频的路径和文件名的Uri.此设置是可选的但是强列推荐的.如果你不指定此值,相机应用就把请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中.

MediaStore.EXTRA_VIDEO_QUALITY- 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1.

MediaStore.EXTRA_DURATION_LIMIT- 此值设置获取视频的长度,以秒为单位.

MediaStore.EXTRA_SIZE_LIMIT- 此值设置获取视频文件的大小,以字节为单位.

2、空白窗口Activity的XML布局视图:

Android视频录制、播放的两种方式一

3、Activity的代码如下:

public class MainActivity extends AppCompatActivity {    private static int REQUST_VIDEO = 1;    private Button btn;    private Button btn_start;    private FrameLayout fl;    private CustomVideoView video;    private ImageView iv;    private String sdCard;    private String videoPath;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init(){        btn = ((Button) findViewById(R.id.btn_recoder));        btn_start = ((Button) findViewById(R.id.btn_start));        fl = ((FrameLayout) findViewById(R.id.fl_video));        video = ((CustomVideoView) findViewById(R.id.video));        iv = ((ImageView) findViewById(R.id.iv));        sdCard = Environment.getExternalStorageDirectory().getPath();        String currenTimeMillis = new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date(System.currentTimeMillis()));        videoPath = sdCard + "/" +  "0000.mp4";        MediaController controller = new MediaController(this);        video.setMediaController(controller);        if (video.isPlaying()){            iv.setVisibility(View.INVISIBLE);        }        video.setPlayPauseListener(new CustomVideoView.PlayPauseListener() {            @Override            public void onPlay() {                Toast.makeText(MainActivity.this,"播放",Toast.LENGTH_SHORT).show();                iv.setVisibility(View.INVISIBLE);            }            @Override            public void onPause() {                Toast.makeText(MainActivity.this,"暂停",Toast.LENGTH_SHORT).show();                iv.setVisibility(View.VISIBLE);            }        });        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);                intent.putExtra(MediaStore.EXTRA_OUTPUT,videoPath);                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);                startActivityForResult(intent,REQUST_VIDEO);            }        });    }    private Bitmap getVideoBitmap(String videoPath){        MediaMetadataRetriever retriever = null;        try {            retriever = new MediaMetadataRetriever();            retriever.setDataSource(videoPath);            Bitmap bitmap = retriever.getFrameAtTime();            return bitmap;        }finally {            retriever.release();        }    }    private Bitmap getVideoBitmap2(Uri uri){        MediaMetadataRetriever retriever = null;        try {            retriever = new MediaMetadataRetriever();            retriever.setDataSource(this,uri);            Bitmap bitmap = retriever.getFrameAtTime();            return bitmap;        }finally {            retriever.release();        }    }    public void start(View view){        iv.setVisibility(View.INVISIBLE);        video.start();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK){            if (requestCode == REQUST_VIDEO){                fl.setVisibility(View.VISIBLE);                btn_start.setVisibility(View.VISIBLE);                Uri uri = data.getData();                video.setVideoURI(uri);//                Bitmap bitmap = getVideoBitmap(videoPath);                Bitmap bitmap = getVideoBitmap2(uri);                iv.setImageBitmap(bitmap);            }        }    }}

//自定义VideoViewpublic class CustomVideoView extends VideoView {    private PlayPauseListener listener;    public CustomVideoView(Context context) {        super(context);    }    public CustomVideoView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public void setPlayPauseListener(PlayPauseListener listener){        this.listener = listener;    }    @Override    public void pause() {        super.pause();        if (listener!=null){            listener.onPause();        }    }    @Override    public void start() {        super.start();        if (listener!=null){            listener.onPlay();        }    }    interface PlayPauseListener{        void onPlay();        void onPause();    }}

4、最终效果图如下:

Android视频录制、播放的两种方式一

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢