Android 錄影主要使用 android.media.MediaRecorder,配合 SurfaceView/TextureView 預覽。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
private MediaRecorder mediaRecorder;
private TextureView textureView;
private String outputPath;
private void startRecording() {
mediaRecorder = new MediaRecorder();
// 設置音視頻源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
// 設置輸出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 設置編碼器
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// 設置輸出文件
mediaRecorder.setOutputFile(outputPath);
// 設置預覽 Surface
mediaRecorder.setVideoSize(1920, 1080);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoEncodingBitRate(8000000);
// 關鍵:綁定 TextureView 的 Surface
Surface surface = textureView.getSurfaceTexture();
mediaRecorder.setInputSurface(surface);
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
if (mediaRecorder != null) {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
}
}
onResume 打開相機會話,onPause 釋放 MediaRecorder 與 CameraDevice。CameraDevice + CaptureRequest 替代舊 Camera,控制更精細。MediaStore 或 getExternalFilesDir(),避免直接訪問公共目錄。MediaRecorder.OnErrorListener、OnInfoListener 處理存儲滿、權限撤銷等異常。完整項目代碼請參考提供的 CSDN 鏈接,包含 UI 控制、暫停/繼續、濾鏡等擴展功能。