Skip to content

Instantly share code, notes, and snippets.

@alexbatashev
Created December 31, 2015 13:07
Show Gist options
  • Save alexbatashev/7013f21c73f07d96393d to your computer and use it in GitHub Desktop.
Save alexbatashev/7013f21c73f07d96393d to your computer and use it in GitHub Desktop.
Camera2 and MediaCodec
mSurfaceView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat("video/avc", mVideoSize.getWidth(), mVideoSize.getHeight());
int colorFormat = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
int videoBitrate = 90000;
int videoFramePerSecond = 25;
int iframeInterval = 2;
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
format.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, videoFramePerSecond);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iframeInterval);
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
List<Surface> surfaces = new ArrayList<>();
mEncodeSurface = mediaCodec.createInputSurface();
surfaces.add(mEncodeSurface);
final Surface mPreviewSurface = new Surface(mSurfaceView.getSurfaceTexture());
surfaces.add(mPreviewSurface);
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
mSession = session;
try {
CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(mPreviewSurface);
mSession.setRepeatingRequest(builder.build(), null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
// todo error
}
}, mBackgroundHandler);
CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
builder.addTarget(mEncodeSurface);
mSession.setRepeatingRequest(builder.build(), null, mBackgroundHandler);
mediaCodec.setCallback(new MediaCodec.Callback() {
@Override
public void onInputBufferAvailable(MediaCodec codec, int index) {
}
@Override
public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {
// pushing data
}
@Override
public void onError(MediaCodec codec, MediaCodec.CodecException e) {
}
@Override
public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
}
});
mediaCodec.start();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment