#android #opengl-es-2.0 #android-camera2
Вопрос:
Я пытаюсь использовать Camera2 для записи видео с помощью MediaCodec.
Есть две части, которые я хочу завершить.
1.Используйте Camera2 для записи видео с помощью MediaCodec(успешно)
2.Используйте OpenGL для добавления текстовых меток в мой выходной файл mp4(ошибка)
вот ошибка msg
2021-08-18 16:42:04.196 3820-3861/com.sample.Camera2 E/GLConsumer: [SurfaceTexture-1-3820-2] checkAndUpdateEglState: invalid current EGLDisplay
2021-08-18 16:42:04.204 3820-3861/com.sample.Camera2 E/AndroidRuntime: FATAL EXCEPTION: ImageListener
Process: com.sample.Camera2_chiu, PID: 3820
java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)
at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)
at android.graphics.SurfaceTexture.updateTexImage(SurfaceTexture.java:243)
at com.sample.Camera2.CameraConnectionFragment$SurfaceTextureManager.awaitNewImage(CameraConnectionFragment.java:1118)
at com.sample.Camera2.CameraConnectionFragment$6.onConfigured(CameraConnectionFragment.java:936)
at java.lang.reflect.Method.invoke(Native Method)
at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)
Я использую mSurface, чтобы моя ЧАСТЬ 1 удалась, но я застрял в ЧАСТИ 2 из-за ошибки.
private void prepareEncoder(int width, int height, int bitrate) throws IOException {
mBufferInfo = new MediaCodec.BufferInfo();
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
mEncoder = MediaCodec.createEncoderByType(MIME_TYPE);
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
!!!!!---- 1.THE FIRST PART TO Recording---!!!!
mSurface = mEncoder.createInputSurface();
!!!!!---- 2.THE SECORD PART TO Build up the OpenGL(EGL Surface)
/////mInputSurface = new CodecInputSurface(mSurface);
mEncoder.start();
Вот моя функция записи (часть 2)
public void startRecordingVideo() {
//Get activity
TextureView mTextureView = getTextureView();
if (mCameraDevice == null || !mTextureView.isAvailable()) {
return;
}
try {
closePreviewSession();
prepareEncoder(inputSize.getWidth(), inputSize.getHeight(), 1000000);
mInputSurface.makeCurrent();
prepareSurfaceTexture();
SurfaceTexture AutoFitST = mTextureView.getSurfaceTexture();
assert AutoFitST != null;
AutoFitST.setDefaultBufferSize(640, 480);
recordRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
Surface previewSurface = new Surface(AutoFitST);
recordRequestBuilder.addTarget(previewSurface);
Surface recorderSurface = new Surface(mStManager.getSurfaceTexture());
(Part 2) recordRequestBuilder.addTarget(recorderSurface);
(Part 1) //recordRequestBuilder.addTarget(mSurface);
// Start a capture session
// Once the session starts, we can update the UI and start recording
mCameraDevice.createCaptureSession(
(Part 2) Arrays.asList(previewSurface, recorderSurface),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
mCaptureSession = cameraCaptureSession;
try {
// Finally, we start displaying the camera preview.
recordRequest = recordRequestBuilder.build();
mCaptureSession.setRepeatingRequest(
recordRequest, captureCallback, backgroundHandler);
Thread recording_th = new Thread(r_StartRecord);
recording_th.start();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Activity activity = getTextureViewContext();
if (null != activity) {
Toast.makeText(activity.getApplicationContext(), "Config Error", Toast.LENGTH_SHORT).show();
}
}
}, backgroundHandler);
} catch (IOException | CameraAccessException e) {
e.printStackTrace();
}
}
Возможно ли, что часть 2 mStManager.getSurfaceTexture не получает никаких данных Camera2 и вызвала ошибку msg?? Спасибо за помощь!