I am building an Android app that records video using Camera X. The probe in a Samsung A52 and it works correctly. When running on a Galaxy Core A03 I get these errors:
E/Recorder: Unable to initialize video encoder. androidx.camera.video.internal.encoder.InvalidConfigException: Encoder cannot created: null at androidx.camera.video.internal.workaround.EncoderFinder.findEncoder(EncoderFinder.java:88) at androidx.camera.video.internal.encoder.EncoderImpl.(EncoderImpl.java:214) at androidx.camera.video.Recorder.setupVideo(Recorder.java:1294) at androidx.camera.video.Recorder.initializeInternal(Recorder.java:998) at androidx.camera.video.Recorder.lambda$onSurfaceRequested$0$androidx-camera-video-Recorder(Recorder.java:396) at androidx.camera.video.Recorder$$ExternalSyntheticLambda16.run(Unknown Source:4) at androidx.camera.core.impl.utils.executor.SequentialExecutor$1.run(SequentialExecutor.java:111) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7815) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1094) Caused by: java.lang.NullPointerException at android.media.MediaCodec.native_setup(Native Method) at android.media.MediaCodec.(MediaCodec.java:1912) at android.media.MediaCodec.createByCodecName(MediaCodec.java:1890) at androidx.camera.video.internal.workaround.EncoderFinder.findEncoder(EncoderFinder.java:85) at androidx.camera.video.internal.encoder.EncoderImpl.(EncoderImpl.java:214) at androidx.camera.video.Recorder.setupVideo(Recorder.java:1294) at androidx.camera.video.Recorder.initializeInternal(Recorder.java:998) at androidx.camera.video.Recorder.lambda$onSurfaceRequested$0$androidx-camera-video-Recorder(Recorder.java:396) at androidx.camera.video.Recorder$$ExternalSyntheticLambda16.run(Unknown Source:4) at androidx.camera.core.impl.utils.executor.SequentialExecutor$1.run(SequentialExecutor.java:111) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7815) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1094) D/Recorder: Transitioning Recorder internal state: INITIALIZING --> ERROR D/PreviewView: Surface requested by Preview. D/SurfaceViewImpl: Surface created. D/SurfaceViewImpl: Surface changed. Size: 960x720 D/PreviewView: Preview transformation info updated. TransformationInfo{cropRect=Rect(0, 0 - 960, 720), rotationDegrees=90, targetRotation=0} D/PreviewTransform: Transformation info set: TransformationInfo{cropRect=Rect(0, 0 - 960, 720), rotationDegrees=90, targetRotation=0} 960x720 false D/SurfaceViewImpl: Surface set on Preview. D/SyncCaptureSessionBase: [androidx.camera.camera2.internal.SynchronizedCaptureSessionBaseImpl@d97cfb7] getSurface...done D/Camera2CameraImpl: {Camera@1dd1e08[id=0]} Posting surface closed java.lang.Throwable at androidx.camera.camera2.internal.Camera2CameraImpl.postSurfaceClosedError(Camera2CameraImpl.java:1174) at androidx.camera.camera2.internal.Camera2CameraImpl$2.onFailure(Camera2CameraImpl.java:1116) at androidx.camera.core.impl.utils.futures.Futures$CallbackListener.run(Futures.java:340) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:231) at androidx.camera.core.impl.utils.executor.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:173) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) D/DeferrableSurface: surface closed, useCount=0 closed=true androidx.camera.core.SurfaceRequest$2@3051f61 D/DeferrableSurface: Surface terminated[total_surfaces=2, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@3051f61} D/DeferrableSurface: Surface created[total_surfaces=3, used_surfaces=0](androidx.camera.core.SurfaceRequest$2@8dfc68e} D/Recorder: Surface is requested in state: ERROR, Current surface: 0 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mrkevin574.teteo, PID: 16045 java.lang.IllegalStateException: Surface was requested when the Recorder had encountered error androidx.camera.video.internal.ResourceCreationException: androidx.camera.video.internal.encoder.InvalidConfigException: Encoder cannot created: null at androidx.camera.video.Recorder.onSurfaceRequested(Recorder.java:406) at androidx.camera.video.VideoCapture.createPipeline(VideoCapture.java:416) at androidx.camera.video.VideoCapture.resetPipeline(VideoCapture.java:482) at androidx.camera.video.VideoCapture.lambda$createPipeline$0$androidx-camera-video-VideoCapture(VideoCapture.java:433) at androidx.camera.video.VideoCapture$$ExternalSyntheticLambda0.onError(Unknown Source:10) at androidx.camera.camera2.internal.Camera2CameraImpl.lambda$postSurfaceClosedError$14(Camera2CameraImpl.java:1175) at androidx.camera.camera2.internal.Camera2CameraImpl$$ExternalSyntheticLambda7.run(Unknown Source:4) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7815) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1094) V/FA: Recording user engagement, ms: 3688 D/TransportRuntime.SQLiteEventStore: Storing event with priority=HIGHEST, name=FIREBASE_CRASHLYTICS_REPORT for destination cct D/TransportRuntime.JobInfoScheduler: Scheduling upload for context TransportContext(cct, HIGHEST, MSRodHRwczovL2NyYXNobHl0aWNzcmVwb3J0cy1wYS5nb29nbGVhcGlzLmNvbS92MS9maXJlbG9nL2xlZ2FjeS9iYXRjaGxvZ1xBSXphU3lCcnBTWVQ0RkZMMDlyZUhKaTZIOUZZZGVpU25VVE92Mk0=) with jobId=-1451806366 in 1000ms(Backend next call timestamp 1649111614302). Attempt 1 I/Process: Sending signal. PID: 16045 SIG: 9
here the code of getVideoCapture():
private fun getVideoCapture() : VideoCapture<Recorder>{
val qualitySelector = QualitySelector.fromOrderedList(
listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD),
FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
)
val recorder = Recorder.Builder()
.setExecutor(ContextCompat.getMainExecutor(requireContext()))
.setQualitySelector(qualitySelector)
.build()
return VideoCapture.withOutput(recorder)
}
I have it exactly as the Android documentation tells me.
I'm also having the same error after learning about CameraX at the following link https://developer.android.com/codelabs/camerax-getting-started
I think it's true what Morrison Chang said, there is something problem with Low End Android devices.
So I downgraded the quality of the Recorder contained inside the startCamera() function from HIGHEST to SD or HD and it's work.
val recorder = Recorder.Builder()
//.setQualitySelector(QualitySelector.from(Quality.HIGHEST))
.setQualitySelector(QualitySelector.from(Quality.SD))//change to Quality.SD or Quality.HD
.build()
videoCapture = VideoCapture.withOutput(recorder)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With