Commit 6e73e81be8cd10b7d2afe3bdf2c00c789c1be7e8

Authored by 王琳
1 parent 712a075f

修改推流demo

app/libs/libcnlivestream.jar
No preview for this file type
app/libs/libcnliveutil.jar
No preview for this file type
app/src/main/AndroidManifest.xml
... ... @@ -24,16 +24,15 @@
24 24 android:label="@string/app_name"
25 25 android:supportsRtl="true"
26 26 android:theme="@style/AppTheme">
27   - <activity android:name="com.cnlive.demo.stream.MainActivity">
  27 + <activity android:name=".MainActivity">
28 28 <intent-filter>
29 29 <action android:name="android.intent.action.MAIN" />
30 30  
31 31 <category android:name="android.intent.category.LAUNCHER" />
32 32 </intent-filter>
33 33 </activity>
34   -
35 34 <activity
36   - android:name="com.cnlive.demo.stream.StreamActivity"
  35 + android:name=".StreamActivity"
37 36 android:configChanges="orientation|keyboardHidden|screenSize"
38 37 android:launchMode="singleTop"
39 38 android:screenOrientation="portrait" />
... ...
app/src/main/java/com/cnlive/demo/stream/MainActivity.java
... ... @@ -22,21 +22,10 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
22 22  
23 23 private static final String TAG = MainActivity.class.getSimpleName();
24 24 private Button mConnectButton;
25   - private EditText mFrameRateEditText;
26   - private EditText mVideoBitRateEditText;
27   - private EditText mAudioBitRateEditText;
28   - private RadioButton mRes360Button;
29   - private RadioButton mRes480Button;
30   - private RadioButton mRes540Button;
31   - private RadioButton mRes720Button;
32 25  
33 26 private RadioButton mLandscapeButton;
34 27 private RadioButton mPortraitButton;
35 28  
36   - private RadioButton mSWButton;
37   - private RadioButton mHWButton;
38   - private RadioButton mSW1Button;
39   -
40 29 private EditText activityId;
41 30 private EditText channelId;
42 31  
... ... @@ -49,21 +38,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
49 38 mConnectButton = (Button) findViewById(R.id.connectBT);
50 39 mConnectButton.setOnClickListener(this);
51 40  
52   - mFrameRateEditText = (EditText) findViewById(R.id.frameRatePicker);
53   - mFrameRateEditText.setInputType(InputType.TYPE_CLASS_NUMBER);
54   - mVideoBitRateEditText = (EditText) findViewById(R.id.videoBitratePicker);
55   - mVideoBitRateEditText.setInputType(InputType.TYPE_CLASS_NUMBER);
56   - mAudioBitRateEditText = (EditText) findViewById(R.id.audioBitratePicker);
57   - mAudioBitRateEditText.setInputType(InputType.TYPE_CLASS_NUMBER);
58   - mRes360Button = (RadioButton) findViewById(R.id.radiobutton1);
59   - mRes480Button = (RadioButton) findViewById(R.id.radiobutton2);
60   - mRes540Button = (RadioButton) findViewById(R.id.radiobutton3);
61   - mRes720Button = (RadioButton) findViewById(R.id.radiobutton4);
62 41 mLandscapeButton = (RadioButton) findViewById(R.id.orientationbutton1);
63 42 mPortraitButton = (RadioButton) findViewById(R.id.orientationbutton2);
64   - mSWButton = (RadioButton) findViewById(R.id.encode_sw);
65   - mHWButton = (RadioButton) findViewById(R.id.encode_hw);
66   - mSW1Button = (RadioButton) findViewById(R.id.encode_sw1);
67 43  
68 44 activityId = (EditText) findViewById(R.id.activityId);
69 45 channelId = (EditText) findViewById(R.id.channelId);
... ... @@ -73,60 +49,19 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
73 49 public void onClick(View view) {
74 50 switch (view.getId()) {
75 51 case R.id.connectBT:
76   - int frameRate = 0;
77   - int videoBitRate = 0;
78   - int audioBitRate = 0;
79   - int videoResolution;
80   - int encodeMethod;
81   - boolean landscape;
82 52 String activityID = "";
83 53 String channelID = "";
  54 + boolean landscape;
84 55  
85   - if (!TextUtils.isEmpty(mFrameRateEditText.getText().toString())) {
86   - frameRate = Integer.parseInt(mFrameRateEditText.getText()
87   - .toString());
88   - }
89   -
90   - if (!TextUtils.isEmpty(mVideoBitRateEditText.getText().toString())) {
91   - videoBitRate = Integer.parseInt(mVideoBitRateEditText.getText()
92   - .toString());
93   - }
94   -
95   - if (!TextUtils.isEmpty(mAudioBitRateEditText.getText().toString())) {
96   - audioBitRate = Integer.parseInt(mAudioBitRateEditText.getText()
97   - .toString());
98   - }
99   -
100   - if (!TextUtils.isEmpty(activityId.getText().toString())){
  56 + if (!TextUtils.isEmpty(activityId.getText().toString())) {
101 57 activityID = activityId.getText().toString();
102 58 }
103 59  
104   - if (!TextUtils.isEmpty(channelId.getText().toString())){
  60 + if (!TextUtils.isEmpty(channelId.getText().toString())) {
105 61 channelID = activityId.getText().toString();
106 62 }
107   -
108   - if (mRes360Button.isChecked()) {
109   - videoResolution = VIDEO_RESOLUTION_360P;
110   - } else if (mRes480Button.isChecked()) {
111   - videoResolution = VIDEO_RESOLUTION_480P;
112   - } else if (mRes540Button.isChecked()) {
113   - videoResolution = VIDEO_RESOLUTION_540P;
114   - } else {
115   - videoResolution = VIDEO_RESOLUTION_720P;
116   - }
117   -
118   - if (mHWButton.isChecked()) {
119   - encodeMethod = ENCODE_METHOD_HARDWARE;
120   - } else if (mSWButton.isChecked()) {
121   - encodeMethod = ENCODE_METHOD_SOFTWARE;
122   - } else {
123   - encodeMethod = ENCODE_METHOD_SOFTWARE_COMPAT;
124   - }
125   -
126 63 landscape = mLandscapeButton.isChecked();
127   -
128   - StreamActivity.startActivity(getApplicationContext(), 0, frameRate, videoBitRate,
129   - audioBitRate, videoResolution, landscape, encodeMethod, activityID, channelID);
  64 + StreamActivity.startActivity(getApplicationContext(), 0, activityID, channelID, landscape);
130 65 break;
131 66 default:
132 67 break;
... ...
app/src/main/java/com/cnlive/demo/stream/StreamActivity.java
... ... @@ -15,7 +15,6 @@ import android.os.Bundle;
15 15 import android.os.Handler;
16 16 import android.os.SystemClock;
17 17 import android.support.v4.app.ActivityCompat;
18   -import android.text.TextUtils;
19 18 import android.util.Log;
20 19 import android.view.KeyEvent;
21 20 import android.view.View;
... ... @@ -32,8 +31,9 @@ import com.cnlive.libs.stream.base.IStreamer;
32 31 import com.cnlive.libs.stream.model.ActivityConfig;
33 32  
34 33 import java.util.Timer;
35   -import java.util.TimerTask;
36 34  
  35 +import static com.cnlive.libs.stream.base.IStreamer.ENCODE_METHOD_HARDWARE;
  36 +import static com.cnlive.libs.stream.base.IStreamer.VIDEO_RESOLUTION_360P;
37 37 import static com.cnlive.libs.stream.model.Filters.BEAUTY_DISABLE;
38 38 import static com.cnlive.libs.stream.model.Filters.BEAUTY_ILLUSION;
39 39 import static com.cnlive.libs.stream.model.Filters.BEAUTY_SMOOTH;
... ... @@ -67,7 +67,6 @@ public class StreamActivity extends Activity {
67 67  
68 68 private Streamer mStreamer;
69 69 private Handler mMainHandler;
70   - private Timer mTimer;
71 70  
72 71 private boolean mIsLandscape;
73 72 private boolean mRecording = false;
... ... @@ -84,35 +83,20 @@ public class StreamActivity extends Activity {
84 83 private static final String START_STRING = "开始直播";
85 84 private static final String STOP_STRING = "停止直播";
86 85  
87   - public final static String FRAME_RATE = "framerate";
88   - public final static String VIDEO_BITRATE = "video_bitrate";
89   - public final static String AUDIO_BITRATE = "audio_bitrate";
90   - public final static String VIDEO_RESOLUTION = "video_resolution";
91   - public final static String LANDSCAPE = "landscape";
92   - public final static String ENCDODE_METHOD = "encode_method";
93   - public final static String START_ATUO = "start_auto";
94   - public static final String SHOW_DEBUGINFO = "show_debuginfo";
95 86 public static final String ACTIVITYID = "activityId";
96 87 public static final String CHANNELID = "channelId";
  88 + public final static String LANDSCAPE = "landscape";
97 89  
98 90 public static void startActivity(Context context, int fromType,
99   - int frameRate,
100   - int videoBitrate, int audioBitrate,
101   - int videoResolution, boolean isLandscape,
102   - int encodeMethod,
103 91 String activityID,
104   - String channelID) {
  92 + String channelID,
  93 + boolean isLandscape) {
105 94 Intent intent = new Intent(context, StreamActivity.class);
106 95 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
107 96 intent.putExtra("type", fromType);
108   - intent.putExtra(FRAME_RATE, frameRate);
109   - intent.putExtra(VIDEO_BITRATE, videoBitrate);
110   - intent.putExtra(AUDIO_BITRATE, audioBitrate);
111   - intent.putExtra(VIDEO_RESOLUTION, videoResolution);
112   - intent.putExtra(LANDSCAPE, isLandscape);
113   - intent.putExtra(ENCDODE_METHOD, encodeMethod);
114 97 intent.putExtra(ACTIVITYID, activityID);
115 98 intent.putExtra(CHANNELID, channelID);
  99 + intent.putExtra(LANDSCAPE, isLandscape);
116 100 context.startActivity(intent);
117 101 }
118 102  
... ... @@ -126,6 +110,18 @@ public class StreamActivity extends Activity {
126 110 WindowManager.LayoutParams.FLAG_FULLSCREEN);
127 111 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
128 112  
  113 + initView();
  114 +
  115 + mMainHandler = new Handler();
  116 + Bundle bundle = getIntent().getExtras();
  117 + activityId = bundle.getString(ACTIVITYID);
  118 + channelId = bundle.getString(CHANNELID);
  119 + mIsLandscape = bundle.getBoolean(LANDSCAPE, false);
  120 + initStreamer();
  121 +
  122 + }
  123 +
  124 + private void initView() {
129 125 mCameraHintView = (CameraHintView) findViewById(R.id.camera_hint);
130 126 mCameraPreviewView = (GLSurfaceView) findViewById(R.id.camera_preview);
131 127 mChronometer = (Chronometer) findViewById(R.id.chronometer);
... ... @@ -155,55 +151,50 @@ public class StreamActivity extends Activity {
155 151 mFrontMirrorCheckBox.setOnCheckedChangeListener(mCheckBoxObserver);
156 152 mAudioOnlyCheckBox = (CheckBox) findViewById(R.id.audio_only);
157 153 mAudioOnlyCheckBox.setOnCheckedChangeListener(mCheckBoxObserver);
  154 + }
158 155  
159   - mMainHandler = new Handler();
  156 + private void initStreamer() {
160 157 mStreamer = new Streamer(this);
161   - Bundle bundle = getIntent().getExtras();
162   - if (bundle != null) {
163   - int frameRate = bundle.getInt(FRAME_RATE, 0);
164   - if (frameRate > 0) {
165   - mStreamer.setPreviewFps(frameRate);
166   - mStreamer.setTargetFps(frameRate);
167   - }
168   -
169   - int videoBitrate = bundle.getInt(VIDEO_BITRATE, 0);
170   - if (videoBitrate > 0) {
171   - mStreamer.setVideoKBitrate(videoBitrate * 3 / 4, videoBitrate, videoBitrate / 4);
172   - }
173   -
174   - int audioBitrate = bundle.getInt(AUDIO_BITRATE, 0);
175   - if (audioBitrate > 0) {
176   - mStreamer.setAudioKBitrate(audioBitrate);
177   - }
178   -
179   - int videoResolution = bundle.getInt(VIDEO_RESOLUTION, 0);
180   - mStreamer.setPreviewResolution(videoResolution);
181   - mStreamer.setTargetResolution(videoResolution);
182   -
183   - int encode_method = bundle.getInt(ENCDODE_METHOD);
184   - mStreamer.setEncodeMethod(encode_method);
185   -
186   - mIsLandscape = bundle.getBoolean(LANDSCAPE, false);
187   - mStreamer.setRotateDegrees(mIsLandscape ? 90 : 0);
188   - if (mIsLandscape) {
189   - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
190   - isHorizontalScreen = 1;
191   - } else {
192   - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
193   - isHorizontalScreen = 0;
194   - }
  158 + //设置预览编码帧率
  159 + mStreamer.setPreviewFps(15);
  160 + //设置推流编码帧率
  161 + mStreamer.setTargetFps(15);
  162 + //设置初始、最大、最小视频码率
  163 + mStreamer.setVideoKBitrate(800 * 3 / 4, 800, 800 / 4);
  164 + //设置音频编码码率
  165 + mStreamer.setAudioBitrate(48);
  166 + //分别设置预览和推流分辨率
  167 + mStreamer.setPreviewResolution(VIDEO_RESOLUTION_360P);
  168 + mStreamer.setTargetResolution(VIDEO_RESOLUTION_360P);
  169 + //设置编码模式(硬编/软编/软编兼容)
  170 + mStreamer.setEncodeMethod(ENCODE_METHOD_HARDWARE);
  171 +
  172 + //设置横竖屏方向
  173 + mStreamer.setRotateDegrees(mIsLandscape ? 90 : 0);//设置屏幕旋转角度
  174 + if (mIsLandscape) {
  175 + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
  176 + isHorizontalScreen = 1;
  177 + } else {
  178 + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
  179 + isHorizontalScreen = 0;
195 180 }
196   -
  181 + //设置预览View
197 182 mStreamer.setDisplayPreview(mCameraPreviewView);
  183 +
  184 + // 开启推流统计功能
198 185 mStreamer.setEnableStreamStatModule(true);
199   - mStreamer.enableDebugLog(true);
  186 + //设置前置摄像头镜像
200 187 mStreamer.setFrontCameraMirror(mFrontMirrorCheckBox.isChecked());
  188 + //静音
201 189 mStreamer.setMuteAudio(mMuteCheckBox.isChecked());
  190 + //耳返
202 191 mStreamer.setEnableAudioPreview(mAudioPreviewCheckBox.isChecked());
  192 + //设置Info回调,可以收到相关通知信息
203 193 mStreamer.setOnInfoListener(mOnInfoListener);
  194 + //设置错误回调,收到该回调后,一般是发生了严重错误,比如网络断开等
204 195 mStreamer.setOnErrorListener(mOnErrorListener);
205   - mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(),
206   - DENOISE.getFilter());
  196 + //设置美颜滤镜
  197 + mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(), DENOISE.getFilter());
207 198 mStreamer.setEnableImgBufBeauty(true);
208 199  
209 200 //手动变焦
... ... @@ -212,9 +203,6 @@ public class StreamActivity extends Activity {
212 203 mStreamer.setCameraHintView(mCameraHintView);
213 204 mStreamer.setEnableTouchFocus(true);
214 205 mStreamer.setEnableZoom(true);
215   -
216   - activityId = bundle.getString(ACTIVITYID);
217   - channelId = bundle.getString(CHANNELID);
218 206 }
219 207  
220 208 @Override
... ... @@ -247,9 +235,7 @@ public class StreamActivity extends Activity {
247 235 mMainHandler.removeCallbacksAndMessages(null);
248 236 mMainHandler = null;
249 237 }
250   - if (mTimer != null) {
251   - mTimer.cancel();
252   - }
  238 + mStreamer.release();
253 239 }
254 240  
255 241 @Override
... ... @@ -334,13 +320,16 @@ public class StreamActivity extends Activity {
334 320 break;
335 321 }
336 322 }
  323 +
337 324 }
338 325  
  326 + //转换摄像头
339 327 private void onSwitchCamera() {
340 328 mStreamer.switchCamera();
341 329 mCameraHintView.hideAll();
342 330 }
343 331  
  332 + //闪光灯
344 333 private void onFlashClick() {
345 334 if (isFlashOpened) {
346 335 mStreamer.toggleTorch(false);
... ... @@ -366,6 +355,7 @@ public class StreamActivity extends Activity {
366 355 public void onClick(DialogInterface arg0, int arg1) {
367 356 mChronometer.stop();
368 357 mRecording = false;
  358 + mStreamer.stopStream(activityConfig);
369 359 StreamActivity.this.finish();
370 360 }
371 361 }).show();
... ... @@ -395,6 +385,7 @@ public class StreamActivity extends Activity {
395 385 }
396 386 }
397 387  
  388 + //背景音乐
398 389 private void onBgmChecked(boolean isChecked) {
399 390 if (isChecked) {
400 391 mStreamer.startBgm(mBgmPath, true);
... ... @@ -426,22 +417,24 @@ public class StreamActivity extends Activity {
426 417 mStreamer.setAudioOnly(isChecked);
427 418 }
428 419  
  420 + //显示水印
429 421 private void showWaterMark() {
430 422 if (!mIsLandscape) {
431 423 mStreamer.showWaterMarkLogo(mLogoPath, 0.08f, 0.04f, 0.20f, 0, 0.8f);
432 424 mStreamer.showWaterMarkTime(0.03f, 0.01f, 0.35f, Color.RED, 1.0f);
433 425 } else {
434   - mStreamer.showWaterMarkLogo(mLogoPath, 0.05f, 0.09f, 0, 0.20f, 0.8f);
  426 + mStreamer.showWaterMarkLogo(mLogoPath, 0.05f, 0.09f, 0, 0.08f, 0.8f);
435 427 mStreamer.showWaterMarkTime(0.01f, 0.03f, 0.22f, Color.RED, 1.0f);
436 428 }
437 429 }
438 430  
439   - //TODO 隐藏水印
  431 + //隐藏水印
440 432 private void hideWaterMark() {
441 433 mStreamer.hideWaterMarkLogo();
442 434 mStreamer.hideWaterMarkTime();
443 435 }
444 436  
  437 + //摄像头权限检测
445 438 private void startCameraPreviewWithPermCheck() {
446 439 int cameraPerm = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
447 440 int audioPerm = ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
... ... @@ -463,6 +456,7 @@ public class StreamActivity extends Activity {
463 456 }
464 457 }
465 458  
  459 + //选择美颜滤镜
466 460 private void showChooseFilter() {
467 461 AlertDialog alertDialog;
468 462 alertDialog = new AlertDialog.Builder(this)
... ... @@ -594,17 +588,12 @@ public class StreamActivity extends Activity {
594 588 break;
595 589 default:
596 590 stopStream();
597   - mMainHandler.postDelayed(new Runnable() {
598   - @Override
599   - public void run() {
600   - startStream();
601   - }
602   - }, 3000);
603 591 break;
604 592 }
605 593 }
606 594 };
607 595  
  596 + //设置推流参数(注意:必传参数为activityId、channelId)
608 597 ActivityConfig activityConfig = new ActivityConfig() {
609 598 @Override
610 599 public String getActivityID() {
... ...
app/src/main/res/drawable-xhdpi/record_exit_disable.png deleted 100644 → 0

1.85 KB

app/src/main/res/drawable-xhdpi/record_exit_normal.png deleted 100644 → 0

1.85 KB

app/src/main/res/drawable-xhdpi/record_exitsure_normal.png deleted 100644 → 0

1.69 KB

app/src/main/res/drawable-xhdpi/record_flash_disable.png deleted 100644 → 0

797 Bytes

app/src/main/res/drawable-xhdpi/record_flash_highlighted.png deleted 100644 → 0

705 Bytes

app/src/main/res/drawable-xhdpi/record_flash_normal.png deleted 100644 → 0

775 Bytes

app/src/main/res/drawable-xhdpi/record_switch_camera_disable.png deleted 100644 → 0

3.56 KB

app/src/main/res/drawable-xhdpi/record_switch_camera_highlighted.png deleted 100644 → 0

3.12 KB

app/src/main/res/drawable-xhdpi/record_switch_camera_normal.png deleted 100644 → 0

3.15 KB

app/src/main/res/drawable-xxhdpi/icon_record_close_off.png 0 → 100644

5.67 KB

app/src/main/res/drawable-xxhdpi/icon_record_flash_off.png 0 → 100644

3.77 KB

app/src/main/res/drawable-xxhdpi/icon_record_flip_off.png 0 → 100644

4.03 KB

app/src/main/res/drawable-xxhdpi/ksy_logo.png deleted 100644 → 0

5.53 KB

app/src/main/res/drawable/recorder_delete_icon.xml deleted 100644 → 0
1   -<?xml version="1.0" encoding="utf-8"?>
2   -
3   -<selector xmlns:android="http://schemas.android.com/apk/res/android">
4   - <item android:drawable="@drawable/record_exit_disable"
5   - android:state_enabled="false"/>
6   - <item android:drawable="@drawable/record_exit_normal"
7   - android:state_pressed="true"/>
8   - <item android:drawable="@drawable/record_exitsure_normal"
9   - android:state_selected="true"/>
10   - <item android:drawable="@drawable/record_exit_normal"/>
11   -</selector>
12 0 \ No newline at end of file
app/src/main/res/drawable/recorder_flash_icon.xml deleted 100644 → 0
1   -<?xml version="1.0" encoding="utf-8"?>
2   -<selector xmlns:android="http://schemas.android.com/apk/res/android">
3   - <item android:drawable="@drawable/record_flash_disable" android:state_enabled="false" />
4   - <item android:drawable="@drawable/record_flash_highlighted" android:state_pressed="true" />
5   - <item android:drawable="@drawable/record_flash_normal" />
6   -</selector>
app/src/main/res/drawable/recorder_rotate_icon.xml deleted 100644 → 0
1   -<?xml version="1.0" encoding="utf-8"?>
2   -
3   -<selector xmlns:android="http://schemas.android.com/apk/res/android">
4   - <item android:drawable="@drawable/record_switch_camera_disable"
5   - android:state_enabled="false"/>
6   - <item android:drawable="@drawable/record_switch_camera_highlighted"
7   - android:state_pressed="true"/>
8   - <item android:drawable="@drawable/record_switch_camera_normal"/>
9   -</selector>
10 0 \ No newline at end of file
app/src/main/res/layout/activity_main.xml
1 1 <?xml version="1.0" encoding="utf-8"?>
2   -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 3 xmlns:tools="http://schemas.android.com/tools"
4 4 android:layout_width="match_parent"
5 5 android:layout_height="match_parent"
  6 + android:focusable="true"
  7 + android:focusableInTouchMode="true"
  8 + android:padding="16dp"
6 9 tools:context=".MainActivity">
7 10  
8   - <RelativeLayout
9   - android:id="@+id/main"
10   - android:layout_width="match_parent"
11   - android:layout_height="match_parent"
12   - android:focusable="true"
13   - android:focusableInTouchMode="true">
14   -
15   - <Button
16   - android:id="@+id/connectBT"
17   - android:layout_width="match_parent"
18   - android:layout_height="wrap_content"
19   - android:layout_marginTop="10dp"
20   - android:text="准备直播" />
21   -
22   - <RadioGroup
23   - android:id="@+id/resolution_group"
24   - android:layout_width="wrap_content"
25   - android:layout_height="wrap_content"
26   - android:layout_below="@id/connectBT"
27   - android:orientation="horizontal">
28   -
29   - <RadioButton
30   - android:id="@+id/radiobutton1"
31   - android:layout_width="wrap_content"
32   - android:layout_height="wrap_content"
33   - android:checked="true"
34   - android:text="360P" />
35   -
36   - <RadioButton
37   - android:id="@+id/radiobutton2"
38   - android:layout_width="wrap_content"
39   - android:layout_height="wrap_content"
40   - android:checked="false"
41   - android:text="480P" />
42   -
43   - <RadioButton
44   - android:id="@+id/radiobutton3"
45   - android:layout_width="wrap_content"
46   - android:layout_height="wrap_content"
47   - android:checked="false"
48   - android:text="540P" />
49   -
50   - <RadioButton
51   - android:id="@+id/radiobutton4"
52   - android:layout_width="wrap_content"
53   - android:layout_height="wrap_content"
54   - android:checked="false"
55   - android:text="720P" />
56   - </RadioGroup>
57   -
58   - <RadioGroup
59   - android:id="@+id/orientation_group"
60   - android:layout_width="wrap_content"
61   - android:layout_height="wrap_content"
62   - android:layout_below="@id/resolution_group"
63   - android:orientation="horizontal">
64   -
65   - <RadioButton
66   - android:id="@+id/orientationbutton1"
67   - android:layout_width="wrap_content"
68   - android:layout_height="wrap_content"
69   - android:checked="false"
70   - android:text="横屏" />
71 11  
72   - <RadioButton
73   - android:id="@+id/orientationbutton2"
74   - android:layout_width="wrap_content"
75   - android:layout_height="wrap_content"
76   - android:checked="true"
77   - android:text="竖屏" />
78   - </RadioGroup>
79   -
80   - <RadioGroup
81   - android:id="@+id/encode_group"
82   - android:layout_width="wrap_content"
83   - android:layout_height="wrap_content"
84   - android:layout_below="@id/orientation_group"
85   - android:orientation="horizontal">
86   -
87   - <RadioButton
88   - android:id="@+id/encode_hw"
89   - android:layout_width="wrap_content"
90   - android:layout_height="wrap_content"
91   - android:checked="false"
92   - android:text="硬编" />
93   -
94   - <RadioButton
95   - android:id="@+id/encode_sw"
96   - android:layout_width="wrap_content"
97   - android:layout_height="wrap_content"
98   - android:checked="true"
99   - android:text="软编" />
100   -
101   - <RadioButton
102   - android:id="@+id/encode_sw1"
103   - android:layout_width="wrap_content"
104   - android:layout_height="wrap_content"
105   - android:checked="false"
106   - android:text="软编1" />
107   - </RadioGroup>
108   -
109   - <LinearLayout
110   - android:id="@+id/init_group"
111   - android:layout_width="match_parent"
112   - android:layout_height="wrap_content"
113   - android:layout_below="@id/encode_group"
114   - android:orientation="vertical">
115   -
116   - <!--<CheckBox-->
117   - <!--android:id="@+id/autoStart"-->
118   - <!--android:layout_width="wrap_content"-->
119   - <!--android:layout_height="wrap_content"-->
120   - <!--android:checked="false"-->
121   - <!--android:text="初始化完成后启动推流" />-->
122   -
123   - </LinearLayout>
124   -
125   - <LinearLayout
126   - android:id="@+id/frameRate"
127   - android:layout_width="match_parent"
128   - android:layout_height="wrap_content"
129   - android:layout_below="@id/init_group">
130   -
131   - <TextView
132   - android:layout_width="wrap_content"
133   - android:layout_height="wrap_content"
134   - android:text="采集帧率"
135   - android:textSize="16sp" />
136   -
137   - <EditText
138   - android:id="@+id/frameRatePicker"
139   - android:layout_width="wrap_content"
140   - android:layout_height="wrap_content"
141   - android:text="15" />
142   - </LinearLayout>
  12 + <LinearLayout
  13 + android:id="@+id/stream_param"
  14 + android:layout_width="match_parent"
  15 + android:layout_height="wrap_content"
  16 + android:orientation="vertical">
143 17  
144 18 <LinearLayout
145   - android:id="@+id/videoBitrate"
146 19 android:layout_width="match_parent"
147 20 android:layout_height="wrap_content"
148   - android:layout_below="@id/frameRate"
149 21 android:orientation="horizontal">
150 22  
151 23 <TextView
152 24 android:layout_width="wrap_content"
153 25 android:layout_height="wrap_content"
154   - android:text="视频码率(Max)"
155   - android:textSize="16sp" />
  26 + android:text="ActivityId"
  27 + android:textColor="#000000"
  28 + android:textSize="18sp" />
156 29  
157 30 <EditText
158   - android:id="@+id/videoBitratePicker"
159   - android:layout_width="wrap_content"
  31 + android:id="@+id/activityId"
  32 + android:layout_width="match_parent"
160 33 android:layout_height="wrap_content"
161   - android:text="800" />
  34 + android:layout_marginLeft="10dp"
  35 + android:hint="请输入ActivityId" />
162 36 </LinearLayout>
163 37  
164 38 <LinearLayout
165   - android:id="@+id/audioBitrate"
166 39 android:layout_width="match_parent"
167 40 android:layout_height="wrap_content"
168   - android:layout_below="@id/videoBitrate"
169 41 android:orientation="horizontal">
170 42  
171 43 <TextView
172 44 android:layout_width="wrap_content"
173 45 android:layout_height="wrap_content"
174   - android:text="音频码率"
175   - android:textSize="16sp" />
  46 + android:text="ChannelId"
  47 + android:textColor="#000000"
  48 + android:textSize="18sp" />
176 49  
177 50 <EditText
178   - android:id="@+id/audioBitratePicker"
179   - android:layout_width="wrap_content"
180   - android:layout_height="wrap_content"
181   - android:text="48" />
182   - </LinearLayout>
183   -
184   - <LinearLayout
185   - android:layout_width="match_parent"
186   - android:layout_height="wrap_content"
187   - android:layout_below="@id/audioBitrate"
188   - android:orientation="vertical">
189   -
190   - <LinearLayout
  51 + android:id="@+id/channelId"
191 52 android:layout_width="match_parent"
192 53 android:layout_height="wrap_content"
193   - android:orientation="horizontal">
  54 + android:layout_marginLeft="10dp"
  55 + android:hint="请输入ChannelId" />
  56 + </LinearLayout>
194 57  
195   - <TextView
196   - android:layout_width="wrap_content"
197   - android:layout_height="wrap_content"
198   - android:text="ActivityId"
199   - android:textSize="14sp" />
  58 + </LinearLayout>
200 59  
201   - <EditText
202   - android:id="@+id/activityId"
203   - android:layout_width="match_parent"
204   - android:layout_height="wrap_content"
205   - android:hint="请输入ActivityId" />
206   - </LinearLayout>
  60 + <RadioGroup
  61 + android:id="@+id/orientation_group"
  62 + android:layout_width="wrap_content"
  63 + android:layout_height="wrap_content"
  64 + android:layout_below="@id/stream_param"
  65 + android:layout_marginTop="10dp"
  66 + android:orientation="horizontal">
207 67  
208   - <LinearLayout
209   - android:layout_width="match_parent"
210   - android:layout_height="wrap_content"
211   - android:orientation="horizontal">
212   -
213   - <TextView
214   - android:layout_width="wrap_content"
215   - android:layout_height="wrap_content"
216   - android:text="ChannelId"
217   - android:textSize="14sp" />
  68 + <RadioButton
  69 + android:id="@+id/orientationbutton1"
  70 + android:layout_width="wrap_content"
  71 + android:layout_height="wrap_content"
  72 + android:checked="false"
  73 + android:text="横屏" />
218 74  
219   - <EditText
220   - android:id="@+id/channelId"
221   - android:layout_width="match_parent"
222   - android:layout_height="wrap_content"
223   - android:hint="请输入ChannelId" />
224   - </LinearLayout>
  75 + <RadioButton
  76 + android:id="@+id/orientationbutton2"
  77 + android:layout_width="wrap_content"
  78 + android:layout_height="wrap_content"
  79 + android:checked="true"
  80 + android:text="竖屏" />
  81 + </RadioGroup>
225 82  
226   - </LinearLayout>
  83 + <Button
  84 + android:id="@+id/connectBT"
  85 + android:layout_width="match_parent"
  86 + android:layout_height="wrap_content"
  87 + android:layout_alignParentBottom="true"
  88 + android:layout_marginBottom="16dp"
  89 + android:text="准备直播" />
227 90  
228   - </RelativeLayout>
229   -</ScrollView>
230 91 \ No newline at end of file
  92 +</RelativeLayout>
231 93 \ No newline at end of file
... ...
app/src/main/res/layout/bottombar.xml
... ... @@ -23,7 +23,7 @@
23 23  
24 24 <CheckBox
25 25 android:id="@+id/watermark"
26   - android:layout_width="wrap_content"
  26 + android:layout_width="0dp"
27 27 android:layout_height="wrap_content"
28 28 android:layout_gravity="center"
29 29 android:layout_marginLeft="10dp"
... ... @@ -31,12 +31,12 @@
31 31 android:background="#11123456"
32 32 android:checked="true"
33 33 android:text="水印"
34   - android:textColor="#FF4081"
  34 + android:textColor="@android:color/white"
35 35 android:textSize="14sp"></CheckBox>
36 36  
37 37 <CheckBox
38 38 android:id="@+id/mute"
39   - android:layout_width="wrap_content"
  39 + android:layout_width="0dp"
40 40 android:layout_height="wrap_content"
41 41 android:layout_gravity="center"
42 42 android:layout_marginLeft="10dp"
... ... @@ -44,12 +44,12 @@
44 44 android:background="#11123456"
45 45 android:checked="false"
46 46 android:text="静音"
47   - android:textColor="#FF4081"
  47 + android:textColor="@android:color/white"
48 48 android:textSize="14sp"></CheckBox>
49 49  
50 50 <CheckBox
51 51 android:id="@+id/bgm"
52   - android:layout_width="wrap_content"
  52 + android:layout_width="0dp"
53 53 android:layout_height="wrap_content"
54 54 android:layout_gravity="center"
55 55 android:layout_marginLeft="10dp"
... ... @@ -57,20 +57,20 @@
57 57 android:background="#11123456"
58 58 android:checked="false"
59 59 android:text="bgm"
60   - android:textColor="#FF4081"
  60 + android:textColor="@android:color/white"
61 61 android:textSize="14sp"></CheckBox>
62 62  
63 63 <CheckBox
64 64 android:id="@+id/ear_mirror"
65   - android:layout_width="wrap_content"
  65 + android:layout_width="0dp"
66 66 android:layout_height="wrap_content"
67 67 android:layout_gravity="center"
68 68 android:layout_marginLeft="10dp"
69 69 android:layout_weight="1"
70 70 android:background="#11123456"
71 71 android:checked="false"
72   - android:text="耳反"
73   - android:textColor="#FF4081"
  72 + android:text="耳返"
  73 + android:textColor="@android:color/white"
74 74 android:textSize="14sp"></CheckBox>
75 75 </LinearLayout>
76 76  
... ... @@ -80,28 +80,20 @@
80 80 android:layout_marginBottom="10dp"
81 81 android:orientation="horizontal">
82 82  
83   - <ImageView
84   - android:id="@+id/backoff"
85   - android:layout_width="wrap_content"
86   - android:layout_height="wrap_content"
87   - android:layout_gravity="center_vertical"
88   - android:layout_marginRight="10dp"
89   - android:background="@drawable/recorder_delete_icon" />
90   -
91   - <TextView
  83 + <Button
92 84 android:id="@+id/click_to_shoot"
93   - android:layout_width="wrap_content"
  85 + android:layout_width="0dp"
94 86 android:layout_height="wrap_content"
95 87 android:layout_gravity="center"
  88 + android:layout_marginLeft="10dp"
96 89 android:layout_weight="1"
97   - android:background="#11123456"
98 90 android:text="开始直播"
99   - android:textColor="#FF4081"
100   - android:textSize="14sp"></TextView>
  91 + android:textColor="@color/colorAccent"
  92 + android:textSize="14sp"></Button>
101 93  
102 94 <CheckBox
103 95 android:id="@+id/audio_only"
104   - android:layout_width="wrap_content"
  96 + android:layout_width="0dp"
105 97 android:layout_height="wrap_content"
106 98 android:layout_gravity="center"
107 99 android:layout_marginLeft="10dp"
... ... @@ -109,12 +101,12 @@
109 101 android:background="#11123456"
110 102 android:checked="false"
111 103 android:text="音频推流"
112   - android:textColor="#FF4081"
  104 + android:textColor="@android:color/white"
113 105 android:textSize="14sp"></CheckBox>
114 106  
115 107 <CheckBox
116 108 android:id="@+id/front_camera_mirror"
117   - android:layout_width="wrap_content"
  109 + android:layout_width="0dp"
118 110 android:layout_height="wrap_content"
119 111 android:layout_gravity="center"
120 112 android:layout_marginLeft="10dp"
... ... @@ -122,12 +114,12 @@
122 114 android:background="#11123456"
123 115 android:checked="true"
124 116 android:text="前置镜像"
125   - android:textColor="#FF4081"
  117 + android:textColor="@android:color/white"
126 118 android:textSize="14sp"></CheckBox>
127 119  
128 120 <CheckBox
129 121 android:id="@+id/click_to_switch_beauty"
130   - android:layout_width="wrap_content"
  122 + android:layout_width="0dp"
131 123 android:layout_height="wrap_content"
132 124 android:layout_gravity="center"
133 125 android:layout_marginLeft="10dp"
... ... @@ -135,7 +127,7 @@
135 127 android:background="#11123456"
136 128 android:checked="true"
137 129 android:text="美颜"
138   - android:textColor="#FF4081"
  130 + android:textColor="@android:color/white"
139 131 android:textSize="14sp"></CheckBox>
140 132  
141 133 </LinearLayout>
... ...
app/src/main/res/layout/titlebar.xml
... ... @@ -2,7 +2,7 @@
2 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 3 android:layout_width="fill_parent"
4 4 android:layout_height="46dip"
5   - android:orientation="horizontal" >
  5 + android:orientation="horizontal">
6 6  
7 7 <Chronometer
8 8 android:id="@+id/chronometer"
... ... @@ -13,25 +13,40 @@
13 13 android:layout_gravity="center"
14 14 android:format="%s"
15 15 android:gravity="center"
16   - android:textColor="#FF4081"
  16 + android:textColor="#FFFFFF"
17 17 android:textSize="19sp" />
18 18  
19 19 <ImageView
  20 + android:id="@+id/flash"
  21 + android:layout_width="wrap_content"
  22 + android:layout_height="wrap_content"
  23 + android:layout_gravity="center_vertical"
  24 + android:layout_marginRight="12dp"
  25 + android:layout_marginTop="8dp"
  26 + android:layout_toLeftOf="@+id/switch_cam"
  27 + android:background="@drawable/icon_record_flash_off"></ImageView>
  28 +
  29 + <ImageView
20 30 android:id="@+id/switch_cam"
21 31 android:layout_width="wrap_content"
22 32 android:layout_height="wrap_content"
23   - android:layout_alignParentRight="true"
  33 + android:layout_alignParentTop="true"
24 34 android:layout_gravity="center_vertical"
25   - android:layout_marginRight="10dp"
26   - android:background="@drawable/recorder_rotate_icon" />
  35 + android:layout_marginRight="12dp"
  36 + android:layout_marginTop="8dp"
  37 + android:layout_toLeftOf="@+id/backoff"
  38 + android:background="@drawable/icon_record_flip_off" />
27 39  
28 40 <ImageView
29   - android:id="@+id/flash"
  41 + android:id="@+id/backoff"
30 42 android:layout_width="wrap_content"
31 43 android:layout_height="wrap_content"
  44 + android:layout_alignParentEnd="true"
  45 + android:layout_alignParentRight="true"
  46 + android:layout_alignParentTop="true"
32 47 android:layout_gravity="center_vertical"
33   - android:layout_toLeftOf="@id/switch_cam"
34   - android:background="@drawable/recorder_flash_icon" >
35   - </ImageView>
  48 + android:layout_marginRight="2dp"
  49 + android:layout_marginTop="8dp"
  50 + android:background="@drawable/icon_record_close_off" />
36 51  
37 52 </RelativeLayout>
38 53 \ No newline at end of file
... ...