Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use MediaCodec with Camera2?

Tags:

android

I am new to android. I have been looking for ways to record a video using Camera2 api and MediaCodec but no luck. I saw a sample by Google(https://github.com/googlesamples/android-Camera2Video) using MediaRecorder. My question is how to replace this MediaRecorder with MediaCodec.

like image 883
Armego Chylla Avatar asked Nov 28 '17 14:11

Armego Chylla


1 Answers

What about (for VP8):

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_VP8, width, height);
String codecName = new MediaCodecList(MediaCodecList.REGULAR_CODECS).findEncoderForFormat(format);
if (codecName == null)
    return;
Surface encoderInput = null;
try {
    MediaCodec codec = MediaCodec.createByCodecName(codecName);
    codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    encoderInput = codec.createInputSurface();
    codec.setCallback(new MediaCodec.Callback() {
        @Override
        public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) {}

        @Override
        public void onOutputBufferAvailable(@NonNull MediaCodec codec, int index, @NonNull MediaCodec.BufferInfo info) {
            // Your stuff here
        }

        @Override
        public void onError(@NonNull MediaCodec codec, @NonNull MediaCodec.CodecException e) {}

        @Override
        public void onOutputFormatChanged(@NonNull MediaCodec codec, @NonNull MediaFormat format) {}
    });
} catch (IOException e) {
    e.printStackTrace();
}

//...
List<Surface> targets = new ArrayList<>();
targets.add(encoderInput);

//...
CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
builder.addTarget(encoderInput);

//...
camera.createCaptureSession(targets...);
session.setRepeatingRequest(builder.build()....);
like image 96
aberaud Avatar answered Oct 31 '22 12:10

aberaud