请帮我写出Android CameraX写出录制视频的代码,使用GLSurfaceView实现
时间: 2024-05-11 22:14:38 浏览: 11
以下是使用CameraX和GLSurfaceView实现录制视频的代码示例:
1. 添加依赖项
在build.gradle文件中添加以下依赖项:
```gradle
implementation "androidx.camera:camera-core:1.0.0-beta07"
implementation "androidx.camera:camera-camera2:1.0.0-beta07"
implementation "androidx.camera:camera-lifecycle:1.0.0-beta07"
```
2. 创建GLSurfaceView
在布局文件中添加GLSurfaceView:
```xml
<android.opengl.GLSurfaceView
android:id="@+id/glsurfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
在代码中获取GLSurfaceView实例:
```java
GLSurfaceView glSurfaceView = findViewById(R.id.glsurfaceview);
```
3. 创建CameraX实例
在代码中创建CameraX实例:
```java
private void startCamera() {
ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}, ContextCompat.getMainExecutor(this));
}
private void bindPreview(ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview.setSurfaceProvider(glSurfaceView.getSurfaceProvider());
cameraProvider.unbindAll();
cameraProvider.bindToLifecycle(this, cameraSelector, preview);
}
```
4. 创建MediaRecorder实例
在代码中创建MediaRecorder实例:
```java
private void prepareMediaRecorder() {
mediaRecorder = new MediaRecorder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mediaRecorder.setOutputFile(getOutputFile().getAbsoluteFile());
} else {
mediaRecorder.setOutputFile(getOutputFile().getAbsolutePath());
}
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setVideoEncodingBitRate(10000000);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoSize(1920, 1080);
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
```
5. 开始录制
在GLSurfaceView.Renderer的onDrawFrame()方法中开始录制:
```java
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
if (isRecording) {
GLES20.glViewport(0, 0, width, height);
GLES20.glUseProgram(programId);
// 绘制
...
// 录制
if (mediaRecorder != null) {
Surface surface = mediaRecorder.getSurface();
surfaceTexture.updateTexImage();
surfaceTexture.getTransformMatrix(transformMatrix);
GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, transformMatrix, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glUniform1i(uTextureUnitLocation, 0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBuffer[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId, 0);
GLES20.glViewport(0, 0, 1920, 1080);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
mediaRecorder.start();
}
}
// 刷新
glSurfaceView.requestRender();
}
```
6. 停止录制
在代码中停止录制:
```java
private void stopRecording() {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
private void stopCamera() {
CameraX.unbindAll();
}
```
以上就是使用CameraX和GLSurfaceView实现录制视频的代码示例。需要注意的是,在录制视频时,需要使用MediaRecorder的setVideoSource()方法将其设置为MediaRecorder.VideoSource.SURFACE,并将Surface传递给MediaRecorder,以便将OpenGL ES渲染的图像捕捉到视频中。