android video app setup media recorder
The android video app setup media recorder tutorial describes how to create and configure a media recorder object that will be passed to the capture request for the recording session.
Get Code
The code to start this tutorial is on github here
https://github.com/mobapptuts/android_camera2_api_video_app.git Tag camera2-video-media-recorder
or you can run this command
git clone https://github.com/mobapptuts/android_camera2_api_video_app.git –branch camera2-video-media-recorder
Steps
Create a MediaRecorder member
private MediaRecorder mMediaRecorder;
Initialise the MediaRecorder member inside the onCreate method
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera2_video_image); createVideoFolder(); mMediaRecorder = new MediaRecorder(); mTextureView = (TextureView) findViewById(R.id.textureView); mRecordImageButton = (ImageButton) findViewById(R.id.videoOnlineImageButton); mRecordImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mIsRecording) { mIsRecording = false; mRecordImageButton.setImageResource(R.mipmap.btn_video_online); } else { checkWriteStoragePermission(); } } }); }
Move the total rotation to an activity member
private int mTotalRotation;
private void setupCamera(int width, int height) { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { for(String cameraId : cameraManager.getCameraIdList()){ CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); if(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT){ continue; } StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation(); mTotalRotation = sensorToDeviceRotation(cameraCharacteristics, deviceOrientation); boolean swapRotation = mTotalRotation == 90 || mTotalRotation == 270; int rotatedWidth = width; int rotatedHeight = height; if(swapRotation) { rotatedWidth = height; rotatedHeight = width; } mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight); mVideoSize = chooseOptimalSize(map.getOutputSizes(MediaRecorder.class), rotatedWidth, rotatedHeight); mCameraId = cameraId; return; } } catch (CameraAccessException e) { e.printStackTrace(); } }
Create a member to hold the video size
private Size mVideoSize;
Get the camera video size from the setupCamera method
private void setupCamera(int width, int height) { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { for(String cameraId : cameraManager.getCameraIdList()){ CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); if(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT){ continue; } StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation(); mTotalRotation = sensorToDeviceRotation(cameraCharacteristics, deviceOrientation); boolean swapRotation = mTotalRotation == 90 || mTotalRotation == 270; int rotatedWidth = width; int rotatedHeight = height; if(swapRotation) { rotatedWidth = height; rotatedHeight = width; } mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight); mVideoSize = chooseOptimalSize(map.getOutputSizes(MediaRecorder.class), rotatedWidth, rotatedHeight); mCameraId = cameraId; return; } } catch (CameraAccessException e) { e.printStackTrace(); } }
Create a method to configure the media recorder
private void setUpMediaRecorder() throws IOException { mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFile(mVideoFilename); mMediaRecorder.setVideoEncodingBitRate(10000000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight()); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setOrientationHint(mTotalRotation); mMediaRecorder.prepare(); }
Clean up the MediaRecorder object when the application has been paused
private void closeCamera() { if(mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } if(mMediaRecorder != null) { mMediaRecorder.release(); mMediaRecorder = null; } }
Android video app setup media recorder summary
In the android video app setup media recorder tutorial we learned how to create and configure a MediaRecorder object.
Prior to setting up the media recorder object we needed to get the rotation and image size values required for the media recorder.