diff --git a/cameraview/src/main/gles/com/otaliastudios/cameraview/AudioMediaEncoder.java b/cameraview/src/main/gles/com/otaliastudios/cameraview/AudioMediaEncoder.java index cb2dbe9f..32dce9c8 100644 --- a/cameraview/src/main/gles/com/otaliastudios/cameraview/AudioMediaEncoder.java +++ b/cameraview/src/main/gles/com/otaliastudios/cameraview/AudioMediaEncoder.java @@ -55,11 +55,18 @@ class AudioMediaEncoder extends MediaEncoder { private AudioEncodingHandler mEncoder; private AudioRecordingThread mRecorder; private ByteBufferPool mByteBufferPool; + private Config mConfig; - // TODO add options - static class Config { } + static class Config { + int bitRate; + Config(int bitRate) { + this.bitRate = bitRate; + } + } - AudioMediaEncoder(@NonNull Config config) { } + AudioMediaEncoder(@NonNull Config config) { + mConfig = config; + } @NonNull @Override @@ -73,7 +80,7 @@ class AudioMediaEncoder extends MediaEncoder { final MediaFormat audioFormat = MediaFormat.createAudioFormat(MIME_TYPE, SAMPLING_FREQUENCY, CHANNELS_COUNT); audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); audioFormat.setInteger(MediaFormat.KEY_CHANNEL_MASK, CHANNELS); - audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE); + audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, mConfig.bitRate); audioFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, CHANNELS_COUNT); try { mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE); @@ -116,8 +123,8 @@ class AudioMediaEncoder extends MediaEncoder { } @Override - int getBitRate() { - return BIT_RATE; + int getEncodedBitRate() { + return mConfig.bitRate; } class AudioRecordingThread extends Thread { diff --git a/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoder.java b/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoder.java index cf999f1d..e82e8c1e 100644 --- a/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoder.java +++ b/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoder.java @@ -328,5 +328,5 @@ abstract class MediaEncoder { private long mStartPresentationTimeUs = Long.MIN_VALUE; private long mLastPresentationTimeUs = 0; - abstract int getBitRate(); + abstract int getEncodedBitRate(); } diff --git a/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoderEngine.java b/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoderEngine.java index 4b210bcb..0b9fa771 100644 --- a/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoderEngine.java +++ b/cameraview/src/main/gles/com/otaliastudios/cameraview/MediaEncoderEngine.java @@ -1,6 +1,5 @@ package com.otaliastudios.cameraview; -import android.media.MediaCodec; import android.media.MediaFormat; import android.media.MediaMuxer; import android.os.Build; @@ -10,7 +9,6 @@ import androidx.annotation.RequiresApi; import java.io.File; import java.io.IOException; -import java.nio.ByteBuffer; import java.util.ArrayList; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) @@ -58,7 +56,7 @@ class MediaEncoderEngine { // This is really naive & probably not accurate, but... int bitRate = 0; for (MediaEncoder encoder : mEncoders) { - bitRate += encoder.getBitRate(); + bitRate += encoder.getEncodedBitRate(); } int bytePerSecond = bitRate / 8; long sizeMaxDuration = (maxSize / bytePerSecond) * 1000L; diff --git a/cameraview/src/main/gles/com/otaliastudios/cameraview/VideoMediaEncoder.java b/cameraview/src/main/gles/com/otaliastudios/cameraview/VideoMediaEncoder.java index 4d64886b..13c4599a 100644 --- a/cameraview/src/main/gles/com/otaliastudios/cameraview/VideoMediaEncoder.java +++ b/cameraview/src/main/gles/com/otaliastudios/cameraview/VideoMediaEncoder.java @@ -99,7 +99,7 @@ abstract class VideoMediaEncoder extends Med } @Override - int getBitRate() { + int getEncodedBitRate() { return mConfig.bitRate; } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java index 46130d71..e707dec9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java @@ -20,6 +20,7 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren private static final int DEFAULT_VIDEO_FRAMERATE = 30; private static final int DEFAULT_VIDEO_BITRATE = 1000000; + private static final int DEFAULT_AUDIO_BITRATE = 64000; private static final int STATE_RECORDING = 0; private static final int STATE_NOT_RECORDING = 1; @@ -57,8 +58,13 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren @Override public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, float scaleX, float scaleY) { if (mCurrentState == STATE_NOT_RECORDING && mDesiredState == STATE_RECORDING) { + // Set default options + if (mResult.videoBitRate <= 0) mResult.videoBitRate = DEFAULT_VIDEO_BITRATE; + if (mResult.videoFrameRate <= 0) mResult.videoFrameRate = DEFAULT_VIDEO_FRAMERATE; + if (mResult.audioBitRate <= 0) mResult.audioBitRate = DEFAULT_AUDIO_BITRATE; + + // Video. Ensure width and height are divisible by 2, as I have read somewhere. Size size = mResult.getSize(); - // Ensure width and height are divisible by 2, as I have read somewhere. int width = size.getWidth(); int height = size.getHeight(); width = width % 2 == 0 ? width : width + 1; @@ -69,8 +75,6 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren case H_264: type = "video/avc"; break; // MediaFormat.MIMETYPE_VIDEO_AVC: case DEVICE_DEFAULT: type = "video/avc"; break; } - if (mResult.videoBitRate <= 0) mResult.videoBitRate = DEFAULT_VIDEO_BITRATE; - if (mResult.videoFrameRate <= 0) mResult.videoFrameRate = DEFAULT_VIDEO_FRAMERATE; LOG.w("Creating frame encoder. Rotation:", mResult.rotation); TextureMediaEncoder.Config config = new TextureMediaEncoder.Config(width, height, mResult.videoBitRate, @@ -83,11 +87,13 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren ); TextureMediaEncoder videoEncoder = new TextureMediaEncoder(config); + // Audio AudioMediaEncoder audioEncoder = null; if (mResult.audio == Audio.ON) { - audioEncoder = new AudioMediaEncoder(new AudioMediaEncoder.Config()); - mResult.audioBitRate = AudioMediaEncoder.BIT_RATE; + audioEncoder = new AudioMediaEncoder(new AudioMediaEncoder.Config(mResult.audioBitRate)); } + + // Engine mEncoderEngine = new MediaEncoderEngine(mResult.file, videoEncoder, audioEncoder, mResult.maxDuration, mResult.maxSize, SnapshotVideoRecorder.this); mEncoderEngine.start();