android实现视频录制

本文介绍了如何在Android平台上实现视频录制,主要涉及MediaRecorder类以及SurfaceView和SurfaceHolder的使用。通过布局文件配置SurfaceView,结合开始和结束按钮,利用SurfaceHolder控制Surface,并设置合适的Surface类型。此外,还提到了通过监听事件启动录制以及使用意图(Intent)进行录制的另一种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,自定义录制

1.首先使用到的类

         MediaRecorder 这是实现视频录制的类,同时也可以实现音频录制

        SurfaceView  ,SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置这个控件用于显示录制视频的控件,相当于录制的时候的预览

       SurfaceHolder   surface的控制器,用来操纵surface,处理它的Canvas上画的效果和动画,控制表面,大小,像素等。



2. 开始录制

      1.首先在布局文件中  添加SurfaceView 控件 再添加一个开始按钮,一个结束按钮

               

                       <SurfaceView
                                   android:id="@+id/surfaceview"
                                  android:layout_width="match_parent"
                                  android:layout_height="match_parent">
                      </SurfaceView>


       2. 查找到SurfaceView 控件 获取 SurfaceHolder

               

                       SurfaceHolder holder = surfaceview.getHolder();// 取得holder
                        holder.addCallback(this); // holder加入回调接口    给SurfaceView当前的持有者一个回调对象。 需要实现其方法,匿名内部类也可以
                        // setType必须设置,要不出错.
                        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


                       

                               //注释-----解释----

                       SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface
                       SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface
                       SURFACE_TYPE_GPU:适用于GPU加速的Surface
                       SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有                       Camera 负责提供给预览Surface数据,这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。

                       虽然setType()方法已经被声明deprecated,但是必要的时候还是设置下比较好。


       3.给开始按钮添加监听事件

            

        mediarecorder = new MediaRecorder();// 创建mediarecorder对象
        mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 录音源为麦克风
        mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制视频源为Camera(相机)
        mediarecorder .setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
       mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  // 设置录制的视频编码h263 h264
        mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
        mediarecorder.setVideoSize(176, 144);     // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
        mediarecorder.setVideoFrameRate(20);//设置逐帧率
        mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 将视频 设置预览 的surface
        mediarecorder   .setAudioEncodingBitRate(   256 * 1024   );// 128K 
        File folder = FileUtils.getMediaRecorderFolder(this);      // 4. 设置录音要保存的位置  自定义的文件保存类 用于存储文件
        File targetFile = new File(folder, "vedio" + System.currentTimeMillis() + ".3gp");
        mediarecorder.setOutputFile(targetFile.getAbsolutePath());
        try {
                 mediarecorder.prepare();// 准备录制
                  mediarecorder.start();// 开始录制
        } catch (IllegalStateException e) {
            e.printStackTrace(); // TODO Auto-generated catch block
        } catch (IOException e) {
            e.printStackTrace(); // TODO Auto-generated catch block
        }


       3. 实现其回调接口

           

  @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // surfaceDestroyed的时候同时对象设置为null
        surfaceview = null;
        surfaceHolder = null;
        mediarecorder = null;
    }

       3. 停止按钮的事件

if (mediarecorder != null) {
            // 停止录制
            mediarecorder.stop();
            // 释放资源
            mediarecorder.release();
            mediarecorder = null;
        }

二,使用意图录制

        Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
        File folder = FileUtils.getMediaRecorderFolder(this);
        File targetFile = new File(folder, "a	" + System.currentTimeMillis() + ".3gp");
        Uri imageFileUri = Uri.fromFile(targetFile);
        i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
        i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(i, 102);






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值