当前位置:首页 > 行业动态 > 正文

Android短视频录制,如何轻松实现高质量录制?

Android短视频录制可通过Camera2 API或MediaRecorder实现,需处理权限与存储。

【Android短视频录制】

一、调用系统相机的视频录制

1、添加必要权限:在 AndroidManifest.xml 文件中添加以下权限,以允许应用访问相机、录制音频和写入外部存储。

   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2、核心代码:通过调用系统相机的 API 来实现视频录制功能,以下是关键代码示例。

   Uri fileUri = Uri.fromFile(getOutputMediaFile());
   Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
   intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
   intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);   startActivityForResult(intent, RECORD_SYSTEM_VIDEO);

3、解释MediaStore.ACTION_VIDEO_CAPTURE 是调用系统视频录制的 action,需要设置一个 Uri 作为保存视频的路径,如果不传递自定义路径,视频将保存在默认路径(一般在 DCIM/Camera 下)。MediaStore.EXTRA_DURATION_LIMIT 用于限制视频录制时长,单位为秒。

4、完整示例代码

Android短视频录制,如何轻松实现高质量录制?

   public static final int RECORD_SYSTEM_VIDEO = 1;
   private VideoView mVideoView;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       mVideoView = (VideoView) findViewById(R.id.videoView);
   }
   /
     启用系统相机录制
    
     @param view
    /
   public void reconverIntent(View view) {
       Uri fileUri = Uri.fromFile(getOutputMediaFile());
       Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
       intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
       intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
       startActivityForResult(intent, RECORD_SYSTEM_VIDEO);
   }
   private File getOutputMediaFile() {
       if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
           Toast.makeText(this, "请检查 SDCard!", Toast.LENGTH_SHORT).show();
           return null;
       }
       File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "MyCameraApp");
       if (!mediaStorageDir.exists()) {
           mediaStorageDir.mkdirs();
       }
       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
       File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
       return mediaFile;
   }

二、自定义视频录制(使用 MediaRecorder)

1、优势:无需引入第三方库,不会增加 APK 体积;系统自带功能,几乎不存在机型适配问题;最终成片参数可控(分辨率、帧数、编码比特率)。

2、关键代码

初始化 MediaRecorder 并设置相关参数。

Android短视频录制,如何轻松实现高质量录制?

   mRecorder = MediaRecorder().apply {
       reset()
       setCamera(mCamera)
       setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
       setVideoSource(MediaRecorder.VideoSource.CAMERA)
       setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
       setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
       setVideoEncoder(MediaRecorder.VideoEncoder.H264)
       setVideoSize(640, 480)
       setVideoFrameRate(30)
       setVideoEncodingBitRate(3  1024  1024)
   }

开始录制和停止录制。

   mRecorder.prepare()
   mRecorder.start()
   // 停止录制
   mRecorder.stop()
   mRecorder.release()

3、注意事项:要确保在合适的线程中操作 MediaRecorder,通常是在主线程中进行 prepare、start、stop 和 release 等操作。

三、使用第三方框架(以 CameraKit 为例)

1、引入依赖:在项目的 build.gradle 文件中添加 CameraKit 的依赖。

Android短视频录制,如何轻松实现高质量录制?

   implementation 'com.camerakit:camerakit:1.0.0'

2、布局文件:在 XML 布局文件中添加 CameraKitView。

   <com.camerakit.CameraKitView
       android:id="@+id/camera"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

3、代码实现:在 Activity 或 Fragment 中获取 CameraKitView 对象,并实现视频录制功能。

   CameraKitView cameraKitView = findViewById(R.id.camera);
   cameraKitView.captureVideo(new CameraKitEventCallback<Video>() {
       @Override
       public void callback(Video video) {
           // 录制完成后的回调
       }
   });

4、优势:简单易用、功能丰富,支持实时滤镜、对焦、曝光等功能,方便开发者快速实现各种拍摄需求。

方式 优点 缺点 适用场景
调用系统相机 使用简单,视频清晰 录制完的视频体积大,画质配置有限 对视频画质要求不高,希望快速实现录制功能的场景
自定义视频录制(MediaRecorder) 无需第三方库,参数可控 需要较多代码实现,对开发能力要求较高 对视频参数有特定要求,如分辨率、帧率等的场景
第三方框架(CameraKit) 功能丰富,易于上手 可能需要额外处理一些兼容性问题 需要快速实现多种拍摄效果和功能的场景
问题1 如何设置系统相机录制视频的保存路径? 答:可以通过创建文件对象并转换为 Uri 来设置保存路径,例如Uri fileUri = Uri.fromFile(getOutputMediaFile());,然后在 Intent 中通过intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 来指定保存路径。
问题2 使用 MediaRecorder 录制视频时,如何设置视频的分辨率和帧率? 答:可以在初始化 MediaRecorder 后,使用setVideoSize(width, height) 方法设置分辨率,使用setVideoFrameRate(frameRate) 方法设置帧率,例如mRecorder.setVideoSize(640, 480); mRecorder.setVideoFrameRate(30);