Skip to content

Commit 92eb6c0

Browse files
committed
io.appium.settings: recording: clamp frame rate also to make recording more solid
Signed-off-by: sirmordred <[email protected]>
1 parent 4a0e029 commit 92eb6c0

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

app/src/main/java/io/appium/settings/recorder/RecorderConstant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class RecorderConstant {
4949
public static final int AUDIO_CODEC_REPEAT_PREV_FRAME_AFTER_MS = 1000000;
5050
public static final int AUDIO_CODEC_I_FRAME_INTERVAL_MS = 5;
5151
public static final int AUDIO_CODEC_DEFAULT_BITRATE = 64000;
52-
public static final int VIDEO_CODEC_FRAME_RATE = 30;
52+
public static final int VIDEO_CODEC_DEFAULT_FRAME_RATE = 30;
5353
public static final long MEDIA_QUEUE_BUFFERING_DEFAULT_TIMEOUT_MS = 10000;
5454
public static final long NANOSECONDS_IN_MICROSECOND = 1000;
5555
public static final String NO_PATH_SET = "";

app/src/main/java/io/appium/settings/recorder/RecorderThread.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static io.appium.settings.recorder.RecorderConstant.NO_TIMESTAMP_SET;
4444
import static io.appium.settings.recorder.RecorderConstant.NO_TRACK_INDEX_SET;
4545
import static io.appium.settings.recorder.RecorderConstant.RECORDING_DEFAULT_VIDEO_MIME_TYPE;
46+
import static io.appium.settings.recorder.RecorderConstant.VIDEO_CODEC_DEFAULT_FRAME_RATE;
4647

4748
public class RecorderThread implements Runnable {
4849

@@ -115,14 +116,14 @@ public boolean isRecordingRunning() {
115116

116117
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
117118
private MediaFormat initVideoEncoderFormat(String videoMime, int videoWidth,
118-
int videoHeight, int videoBitrate) {
119+
int videoHeight, int videoBitrate,
120+
int videoFrameRate) {
119121
MediaFormat encoderFormat = MediaFormat.createVideoFormat(videoMime, videoWidth,
120122
videoHeight);
121123
encoderFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
122124
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
123125
encoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);
124-
encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE,
125-
RecorderConstant.VIDEO_CODEC_FRAME_RATE);
126+
encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE, videoFrameRate);
126127
encoderFormat.setInteger(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER,
127128
RecorderConstant.AUDIO_CODEC_REPEAT_PREV_FRAME_AFTER_MS);
128129
encoderFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,
@@ -240,9 +241,9 @@ private long getPresentationTimeUs() {
240241
- startTimestampUs);
241242
}
242243

243-
private int calculateBitRate(int width, int height) {
244+
private int calculateBitRate(int width, int height, int frameRate) {
244245
final int bitrate = (int) (RecorderConstant.BITRATE_MULTIPLIER *
245-
RecorderConstant.VIDEO_CODEC_FRAME_RATE * width * height);
246+
frameRate * width * height);
246247
Log.i(TAG, String.format("Recording starting with bitrate=%5.2f[Mbps]",
247248
bitrate / 1024f / 1024f));
248249
return bitrate;
@@ -354,12 +355,15 @@ public void run() {
354355
.getCodecInfo().getCapabilitiesForType(RECORDING_DEFAULT_VIDEO_MIME_TYPE)
355356
.getVideoCapabilities();
356357

358+
int videoFrameRate = Math.min(VIDEO_CODEC_DEFAULT_FRAME_RATE,
359+
videoEncoderCapabilities.getSupportedFrameRates().getUpper());
360+
357361
int videoBitrate = videoEncoderCapabilities.getBitrateRange()
358-
.clamp(calculateBitRate(this.videoWidth, this.videoHeight));
362+
.clamp(calculateBitRate(this.videoWidth, this.videoHeight, videoFrameRate));
359363

360364
MediaFormat videoEncoderFormat =
361365
initVideoEncoderFormat(RECORDING_DEFAULT_VIDEO_MIME_TYPE,
362-
this.videoWidth, this.videoHeight, videoBitrate);
366+
this.videoWidth, this.videoHeight, videoBitrate, videoFrameRate);
363367

364368
videoEncoder.configure(videoEncoderFormat, null, null,
365369
MediaCodec.CONFIGURE_FLAG_ENCODE);

0 commit comments

Comments
 (0)