【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、完整示例代码:
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 并设置相关参数。
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 的依赖。
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); 。 |