Android通过Camera2录制视频,写了个工具类,需要时直接拿来用
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import androidx.annotation.NonNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class RecordUtil {
private static final String TAG = "RecordUtil";
private MediaRecorder mMediaRecorder;
private CameraManager cameraManager;
private CameraDevice cameraDevice;
private CameraCaptureSession mPreviewSession;
private CaptureRequest.Builder mPreviewBuilder;
private CameraCaptureSession.StateCallback mSessionStateCallback;
private CameraCaptureSession.CaptureCallback mSessionCaptureCallback;
private Handler mChildHandler;
private SurfaceTexture surfaceTexture;
private String mCameraId;
private String fileName;
private Size previewSize = new Size(1920, 1080);;
public RecordUtil(CameraManager cameraManager, SurfaceTexture surfaceTexture, String mCameraId, Size previewSize) {
this.cameraManager = cameraManager;
this.surfaceTexture = surfaceTexture;
this.mCameraId = mCameraId;
this.previewSize = previewSize;
initSessionCaptureCallback();
initSessionStateCallback();
}
@SuppressLint("MissingPermission")
public void initCamera(String fileName) {
this.fileName = fileName;
try {
cameraManager.openCamera(mCameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
cameraDevice = camera;
createBuild();
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
Log.i(TAG, "onDisconnected");
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
Log.i(TAG, "onError = " + error);
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void createBuild() {
setUpMediaRecorder();
try {
mPreviewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<>();
Surface previewSurface = new Surface(surfaceTexture);
Surface recorderSurface = mMediaRecorder.getSurface();
surfaces.add(recorderSurface);
surfaces.add(previewSurface);
mPreviewBuilder.addTarget(recorderSurface);
mPreviewBuilder.addTarget(previewSurface);
cameraDevice.createCaptureSession(surfaces, mSessionStateCallback, mChildHandler);
mMediaRecorder.start();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void setUpMediaRecorder() {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(fileName);
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setVideoFrameRate(25);
mMediaRecorder.setVideoSize(previewSize.getWidth(), previewSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
try {
mMediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
private void initSessionStateCallback() {
mSessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mPreviewSession = session;
try {
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), mSessionCaptureCallback,
mChildHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
};
}
private void initSessionCaptureCallback() {
mSessionCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
long timestamp, long frameNumber) {
super.onCaptureStarted(session, request, timestamp, frameNumber);
}
@Override
public void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
@NonNull CaptureResult partialResult) {
super.onCaptureProgressed(session, request, partialResult);
}
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
}
@Override
public void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
@NonNull CaptureFailure failure) {
super.onCaptureFailed(session, request, failure);
}
};
}
public void stopRecord() {
if (mMediaRecorder != null) {
mMediaRecorder.setOnInfoListener(null);
mMediaRecorder.setPreviewDisplay(null);
mMediaRecorder.setOnErrorListener(null);
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
if (mPreviewSession != null) {
mPreviewSession.close();
}
if (cameraDevice != null) {
cameraDevice.close();
cameraDevice = null;
}
}
}