diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java index eacca2fa..e49d54c9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java @@ -706,12 +706,34 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera } else { mMediaRecorder.setVideoEncoder(mMapper.map(mVideoCodec)); } - mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); + + if(getVideoBitRate() <= 0) { + mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); + } + else { + mMediaRecorder.setVideoEncodingBitRate(getVideoBitRate()); + } + if (mAudio == Audio.ON) { - mMediaRecorder.setAudioChannels(profile.audioChannels); - mMediaRecorder.setAudioSamplingRate(profile.audioSampleRate); + if(getAudioSampleRate() <= 0) { + mMediaRecorder.setAudioSamplingRate(profile.audioSampleRate); + } else { + mMediaRecorder.setAudioSamplingRate(getAudioBitRate()); + } + mMediaRecorder.setAudioEncoder(profile.audioCodec); - mMediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); + + if(getAudioChannels() == 0){ + mMediaRecorder.setAudioChannels(profile.audioChannels); + } else { + mMediaRecorder.setAudioChannels(getAudioChannels()); + } + + if(getAudioBitRate() <= 0) { + mMediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); + } else { + mMediaRecorder.setAudioEncodingBitRate(getAudioBitRate()); + } } if (mLocation != null) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java index 3fb41e8a..5f57adcb 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java @@ -61,6 +61,10 @@ abstract class CameraController implements protected Size mPictureSize; protected Size mPreviewSize; protected int mPreviewFormat; + protected int mVideoBitRate; + protected int mAudioBitRate; + protected int mAudioSampleRate; + protected int mAudioChannels; protected int mSensorOffset; private int mDisplayOffset; @@ -290,6 +294,21 @@ abstract class CameraController implements mVideoCodec = codec; } + final void setVideoBitRate(int videoBitRate) { + mVideoBitRate = videoBitRate; + } + + final void setAudioBitRate(int audioBitRate) { + mAudioBitRate = audioBitRate; + } + + final void setAudioSampleRate(int audioSampleRate) { + mAudioBitRate = audioSampleRate; + } + + final void setAudioChannels(int audioChannels){ + mAudioChannels = audioChannels; + } //endregion @@ -419,6 +438,22 @@ abstract class CameraController implements return mIsCapturingVideo; } + final int getVideoBitRate() { + return mVideoBitRate; + } + + final int getAudioBitRate() { + return mAudioBitRate; + } + + final int getAudioSampleRate() { + return mAudioSampleRate; + } + + final int getAudioChannels() { + return mAudioChannels; + } + //endregion //region Orientation utils diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 3f44b18e..b310559e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -116,6 +116,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { VideoCodec codec = VideoCodec.fromValue(a.getInteger(R.styleable.CameraView_cameraVideoCodec, VideoCodec.DEFAULT.value())); long videoMaxSize = (long) a.getFloat(R.styleable.CameraView_cameraVideoMaxSize, 0); int videoMaxDuration = a.getInteger(R.styleable.CameraView_cameraVideoMaxDuration, 0); + int videoBitRate = a.getInteger(R.styleable.CameraView_cameraVideoBitRate, 0); + int audioBitRate = a.getInteger(R.styleable.CameraView_cameraAudioBitRate, 0); + int audioSampleRate = a.getInteger(R.styleable.CameraView_cameraAudioSampleRate, 0); + int audioChannels = a.getInteger(R.styleable.CameraView_cameraAudioChannels, 0); // Size selectors List constraints = new ArrayList<>(3); @@ -191,6 +195,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { setVideoCodec(codec); setVideoMaxSize(videoMaxSize); setVideoMaxDuration(videoMaxDuration); + setVideoBitRate(videoBitRate); + setAudioBitRate(audioBitRate); + setAudioSampleRate(audioSampleRate); + setAudioChannels(audioChannels); // Apply gestures mapGesture(Gesture.TAP, tapGesture); @@ -1480,6 +1488,68 @@ public class CameraView extends FrameLayout implements LifecycleObserver { return mCameraController.isCapturingVideo(); } + /** + * Returns custom video bitrate, or 0 if no limit was set. + * + * @see #setVideoBitRate(int) + * @return custom video bitrate + */ + public int getVideoBitRate() { + return mCameraController.getVideoBitRate(); + } + + + /** + * Returns custom audio bitrate, or 0 if no limit was set. + * + * @see #setAudioBitRate(int) + * @return audio bit rate + */ + public int getAudioBitRate() { + return mCameraController.getVideoBitRate(); + } + + /** + * Returns custom audio bitrate, or 0 if no limit was set. + * + * @see #setAudioSampleRate(int) + * @return audio bit rate + */ + public int getAudioSampleRate() { + return mCameraController.getAudioSampleRate(); + } + + /** + * Sets custom video bitrate for recording. Use 0 or negatives to disable. + * + * @param videoBitRate The maximum video bitrate + */ + public void setVideoBitRate(int videoBitRate) { + mCameraController.setVideoBitRate(videoBitRate); + } + + /** + * Sets custom audio bitrate for recording. Use 0 or negatives to disable. + * + * @param audioBitRate The maximum video bitrate + */ + public void setAudioBitRate(int audioBitRate) { + mCameraController.setAudioBitRate(audioBitRate); + } + + /** + * Sets custom audio sample rate for recording. Use 0 or negatives to disable. + * + * @param audioSampleRate The maximum audio sample rate + */ + public void setAudioSampleRate(int audioSampleRate) { + mCameraController.setAudioSampleRate(audioSampleRate); + } + + public void setAudioChannels(int audioChannels){ + mCameraController.setAudioChannels(audioChannels); + } + //endregion //region Callbacks and dispatching diff --git a/cameraview/src/main/res/values/attrs.xml b/cameraview/src/main/res/values/attrs.xml index 53abcd38..7976a869 100644 --- a/cameraview/src/main/res/values/attrs.xml +++ b/cameraview/src/main/res/values/attrs.xml @@ -120,6 +120,17 @@ + + + + + + + + + + + - + app:cameraPlaySounds="true" + app:cameraSessionType="picture" + app:cameraVideoBitRate="128000" />