Merge "Screen recorder video and ui polish" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
8c828d53fa
@@ -16,21 +16,20 @@
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="250dp"
|
||||
android:layout_height="48dp"
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp"
|
||||
android:layout_weight="1">
|
||||
android:padding="13dp">
|
||||
<TextView
|
||||
android:id="@+id/screen_recording_dialog_source_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="250dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textColor="?android:attr/textColorPrimary"/>
|
||||
<TextView
|
||||
android:id="@+id/screen_recording_dialog_source_description"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="250dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textColor="?android:attr/textColorSecondary"/>
|
||||
|
||||
@@ -225,8 +225,8 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis
|
||||
res.getString(R.string.screenrecord_name));
|
||||
|
||||
String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE
|
||||
? res.getString(R.string.screenrecord_ongoing_screen_and_audio)
|
||||
: res.getString(R.string.screenrecord_ongoing_screen_only);
|
||||
? res.getString(R.string.screenrecord_ongoing_screen_only)
|
||||
: res.getString(R.string.screenrecord_ongoing_screen_and_audio);
|
||||
|
||||
mRecordingNotificationBuilder = new Notification.Builder(this, CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_screenrecord)
|
||||
|
||||
@@ -38,6 +38,7 @@ import java.nio.ByteBuffer;
|
||||
public class ScreenInternalAudioRecorder {
|
||||
private static String TAG = "ScreenAudioRecorder";
|
||||
private static final int TIMEOUT = 500;
|
||||
private static final float MIC_VOLUME_SCALE = 1.4f;
|
||||
private final Context mContext;
|
||||
private AudioRecord mAudioRecord;
|
||||
private AudioRecord mAudioRecordMic;
|
||||
@@ -148,6 +149,10 @@ public class ScreenInternalAudioRecorder {
|
||||
readShortsInternal = mAudioRecord.read(bufferInternal, 0,
|
||||
bufferInternal.length);
|
||||
readShortsMic = mAudioRecordMic.read(bufferMic, 0, bufferMic.length);
|
||||
|
||||
// modify the volume
|
||||
bufferMic = scaleValues(bufferMic,
|
||||
readShortsMic, MIC_VOLUME_SCALE);
|
||||
readBytes = Math.min(readShortsInternal, readShortsMic) * 2;
|
||||
buffer = addAndConvertBuffers(bufferInternal, readShortsInternal, bufferMic,
|
||||
readShortsMic);
|
||||
@@ -168,6 +173,19 @@ public class ScreenInternalAudioRecorder {
|
||||
});
|
||||
}
|
||||
|
||||
private short[] scaleValues(short[] buff, int len, float scale) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
int oldValue = buff[i];
|
||||
int newValue = (int) (buff[i] * scale);
|
||||
if (newValue > Short.MAX_VALUE) {
|
||||
newValue = Short.MAX_VALUE;
|
||||
} else if (newValue < Short.MIN_VALUE) {
|
||||
newValue = Short.MIN_VALUE;
|
||||
}
|
||||
buff[i] = (short) (newValue);
|
||||
}
|
||||
return buff;
|
||||
}
|
||||
private byte[] addAndConvertBuffers(short[] a1, int a1Limit, short[] a2, int a2Limit) {
|
||||
int size = Math.max(a1Limit, a2Limit);
|
||||
if (size < 0) return new byte[0];
|
||||
|
||||
@@ -55,9 +55,9 @@ import java.util.Date;
|
||||
*/
|
||||
public class ScreenMediaRecorder {
|
||||
private static final int TOTAL_NUM_TRACKS = 1;
|
||||
private static final int VIDEO_BIT_RATE = 10000000;
|
||||
private static final int VIDEO_FRAME_RATE = 30;
|
||||
private static final int AUDIO_BIT_RATE = 16;
|
||||
private static final int VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO = 6;
|
||||
private static final int AUDIO_BIT_RATE = 196000;
|
||||
private static final int AUDIO_SAMPLE_RATE = 44100;
|
||||
private static final int MAX_DURATION_MS = 60 * 60 * 1000;
|
||||
private static final long MAX_FILESIZE_BYTES = 5000000000L;
|
||||
@@ -108,7 +108,7 @@ public class ScreenMediaRecorder {
|
||||
|
||||
// Set up audio source
|
||||
if (mAudioSource == MIC) {
|
||||
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
|
||||
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
|
||||
}
|
||||
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
|
||||
|
||||
@@ -121,10 +121,13 @@ public class ScreenMediaRecorder {
|
||||
wm.getDefaultDisplay().getRealMetrics(metrics);
|
||||
int screenWidth = metrics.widthPixels;
|
||||
int screenHeight = metrics.heightPixels;
|
||||
int refereshRate = (int) wm.getDefaultDisplay().getRefreshRate();
|
||||
int vidBitRate = screenHeight * screenWidth * refereshRate / VIDEO_FRAME_RATE
|
||||
* VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO;
|
||||
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
|
||||
mMediaRecorder.setVideoSize(screenWidth, screenHeight);
|
||||
mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE);
|
||||
mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE);
|
||||
mMediaRecorder.setVideoFrameRate(refereshRate);
|
||||
mMediaRecorder.setVideoEncodingBitRate(vidBitRate);
|
||||
mMediaRecorder.setMaxDuration(MAX_DURATION_MS);
|
||||
mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES);
|
||||
|
||||
|
||||
@@ -24,12 +24,9 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.NONE;
|
||||
import android.app.Activity;
|
||||
import android.app.PendingIntent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.Spinner;
|
||||
@@ -88,8 +85,8 @@ public class ScreenRecordDialog extends Activity {
|
||||
});
|
||||
|
||||
mModes = new ArrayList<>();
|
||||
mModes.add(INTERNAL);
|
||||
mModes.add(MIC);
|
||||
mModes.add(INTERNAL);
|
||||
mModes.add(MIC_AND_INTERNAL);
|
||||
|
||||
mAudioSwitch = findViewById(R.id.screenrecord_audio_switch);
|
||||
|
||||
@@ -88,12 +88,6 @@ public class ScreenRecordingAdapter extends ArrayAdapter<ScreenRecordingAudioSou
|
||||
return layout;
|
||||
}
|
||||
|
||||
private void setDescription(LinearLayout layout, int description) {
|
||||
if (description != Resources.ID_NULL) {
|
||||
((TextView) layout.getChildAt(1)).setText(description);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getDropDownView(int position, View convertView, ViewGroup parent) {
|
||||
switch (getItem(position)) {
|
||||
|
||||
Reference in New Issue
Block a user