Skip to content

Commit c87fce6

Browse files
committed
New stream preferences
1 parent 75fa77f commit c87fce6

18 files changed

+456
-162
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
</activity>
5252

5353
<service
54-
android:name=".StreamingService"
54+
android:name=".streaming.StreamingService"
5555
android:foregroundServiceType="mediaProjection" />
5656

5757
<meta-data

app/src/main/java/com/fpvout/digiview/MainActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import androidx.core.content.res.ResourcesCompat;
3737
import androidx.preference.PreferenceManager;
3838

39+
import com.fpvout.digiview.streaming.StreamingService;
3940
import com.google.android.material.floatingactionbutton.FloatingActionButton;
4041

4142
import net.ossrs.rtmp.ConnectCheckerRtmp;
@@ -187,7 +188,7 @@ protected void onCreate(Bundle savedInstanceState) {
187188
liveButton = findViewById(R.id.liveButton);
188189
liveButton.setOnClickListener(v -> {
189190
if (!StreamingService.isStreaming()) {
190-
if (sharedPreferences.getString("RtmpUrl", "").isEmpty() || sharedPreferences.getString("RtmpKey", "").isEmpty()) {
191+
if (sharedPreferences.getString("StreamRtmpUrl", "").isEmpty() || sharedPreferences.getString("StreamRtmpKey", "").isEmpty()) {
191192
Toast.makeText(this, getString(R.string.rtmp_settings_empty), Toast.LENGTH_LONG).show();
192193
Intent intent = new Intent(v.getContext(), SettingsActivity.class);
193194
v.getContext().startActivity(intent);

app/src/main/java/com/fpvout/digiview/SettingsActivity.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import androidx.preference.ListPreference;
1111
import androidx.preference.PreferenceFragmentCompat;
1212

13+
import com.fpvout.digiview.streaming.StreamAudioSource;
14+
1315
import java.util.ArrayList;
1416
import java.util.Arrays;
1517

@@ -48,13 +50,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
4850
setPreferencesFromResource(R.xml.root_preferences, rootKey);
4951

5052
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
51-
ListPreference audioSourcePreference = findPreference("AudioSource");
53+
ListPreference audioSourcePreference = findPreference("StreamAudioSource");
5254

5355
ArrayList<CharSequence> entries = new ArrayList<>(Arrays.asList(audioSourcePreference.getEntries()));
5456
ArrayList<CharSequence> entryValues = new ArrayList<>(Arrays.asList(audioSourcePreference.getEntryValues()));
5557

56-
entries.add(getString(R.string.audio_source_internal));
57-
entryValues.add("internal");
58+
entries.add(getString(R.string.stream_audio_source_performance));
59+
entryValues.add(StreamAudioSource.PERFORMANCE);
60+
61+
entries.add(getString(R.string.stream_audio_source_internal));
62+
entryValues.add(StreamAudioSource.INTERNAL);
5863

5964
audioSourcePreference.setEntries(entries.toArray(new CharSequence[0]));
6065
audioSourcePreference.setEntryValues(entryValues.toArray(new CharSequence[0]));
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
public class StreamAudioBitrate {
4+
public static final String DEFAULT = "128";
5+
6+
public static int getBitrate(String value) {
7+
return Integer.parseInt(value) * 1024;
8+
}
9+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
public class StreamAudioSampleRate {
4+
public static final String DEFAULT = "44100hz";
5+
6+
public static int getSampleRate(String value) {
7+
switch (value) {
8+
case "8khz":
9+
return 8000;
10+
case "11025hz":
11+
return 11025;
12+
case "16khz":
13+
return 16000;
14+
case "22050hz":
15+
return 22050;
16+
case "32000hz":
17+
return 32000;
18+
case DEFAULT:
19+
return 44100;
20+
case "48khz":
21+
return 48000;
22+
case "96khz":
23+
return 96000;
24+
}
25+
26+
return -1;
27+
}
28+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
import android.media.MediaRecorder;
4+
5+
public class StreamAudioSource {
6+
public static final String DEFAULT = "default";
7+
public static final String INTERNAL = "internal";
8+
public static final String PERFORMANCE = "performance";
9+
10+
public static int getAudioSource(String value) {
11+
switch (value) {
12+
case DEFAULT:
13+
return MediaRecorder.AudioSource.DEFAULT;
14+
case "mic":
15+
return MediaRecorder.AudioSource.MIC;
16+
case "cam":
17+
return MediaRecorder.AudioSource.CAMCORDER;
18+
case "communication":
19+
return MediaRecorder.AudioSource.VOICE_COMMUNICATION;
20+
case PERFORMANCE:
21+
return MediaRecorder.AudioSource.VOICE_PERFORMANCE;
22+
}
23+
24+
return -1;
25+
}
26+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
public class StreamBitrate {
4+
public static final String DEFAULT = "2500";
5+
6+
public static int getBitrate(String value) {
7+
return Integer.parseInt(value) * 1024;
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
public class StreamFramerate {
4+
public static final String DEFAULT = "60";
5+
6+
public static int getFramerate(String value) {
7+
return Integer.parseInt(value);
8+
}
9+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.fpvout.digiview.streaming;
2+
3+
public class StreamResolution {
4+
public static final String DEFAULT = "720p";
5+
private final int width;
6+
private final int height;
7+
8+
private StreamResolution(int width, int height) {
9+
this.width = width;
10+
this.height = height;
11+
}
12+
13+
public static StreamResolution getResolution(String value) {
14+
switch (value) {
15+
case "240p":
16+
return new StreamResolution(426, 240);
17+
case "360p":
18+
return new StreamResolution(640, 360);
19+
case "480p":
20+
return new StreamResolution(854, 480);
21+
case DEFAULT:
22+
return new StreamResolution(1280, 720);
23+
case "1080p":
24+
return new StreamResolution(1920, 1080);
25+
}
26+
27+
return null;
28+
}
29+
30+
public int getWidth() {
31+
return width;
32+
}
33+
34+
public int getHeight() {
35+
return height;
36+
}
37+
}

app/src/main/java/com/fpvout/digiview/StreamingService.java renamed to app/src/main/java/com/fpvout/digiview/streaming/StreamingService.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fpvout.digiview;
1+
package com.fpvout.digiview.streaming;
22

33
import android.app.Notification;
44
import android.app.NotificationChannel;
@@ -32,6 +32,7 @@ public class StreamingService extends Service {
3232
private static RtmpDisplay rtmpDisplayBase;
3333
private static int dpi;
3434
private String endpoint;
35+
3536
@Nullable
3637
@Override
3738
public IBinder onBind(Intent intent) {
@@ -54,7 +55,7 @@ public void onCreate() {
5455
@Override
5556
public int onStartCommand(Intent intent, int flags, int startId) {
5657
Log.d(TAG, "Start");
57-
endpoint = String.format("%s/%s", sharedPreferences.getString("RtmpUrl", ""), sharedPreferences.getString("RtmpKey", ""));
58+
endpoint = String.format("%s/%s", sharedPreferences.getString("StreamRtmpUrl", ""), sharedPreferences.getString("StreamRtmpKey", ""));
5859
prepareStreaming();
5960
startStreaming();
6061

@@ -64,31 +65,45 @@ public int onStartCommand(Intent intent, int flags, int startId) {
6465
private void prepareStreaming() {
6566
stopStreaming();
6667
rtmpDisplayBase = new RtmpDisplay(appContext, true, connectChecker);
67-
if (!sharedPreferences.getString("RtmpUsername", "").isEmpty() && !sharedPreferences.getString("RtmpPassword", "").isEmpty()) {
68-
rtmpDisplayBase.setAuthorization(sharedPreferences.getString("RtmpUsername", ""), sharedPreferences.getString("RtmpPassword", ""));
68+
if (!sharedPreferences.getString("StreamRtmpUsername", "").isEmpty() && !sharedPreferences.getString("StreamRtmpPassword", "").isEmpty()) {
69+
rtmpDisplayBase.setAuthorization(sharedPreferences.getString("StreamRtmpUsername", ""), sharedPreferences.getString("StreamRtmpPassword", ""));
6970
}
7071
rtmpDisplayBase.setIntentResult(mediaProjectionResultCode, mediaProjectionData);
7172
}
7273

7374
private void startStreaming() {
7475
if (!rtmpDisplayBase.isStreaming()) {
76+
StreamResolution streamResolution = StreamResolution.getResolution(sharedPreferences.getString("StreamResolution", StreamResolution.DEFAULT));
7577
if (rtmpDisplayBase.prepareVideo(
76-
Integer.parseInt(sharedPreferences.getString("OutputWidth", "1280")),
77-
Integer.parseInt(sharedPreferences.getString("OutputHeight", "720")),
78-
Integer.parseInt(sharedPreferences.getString("OutputFramerate", "60")),
79-
Integer.parseInt(sharedPreferences.getString("OutputBitrate", "1200")) * 1024,
78+
streamResolution.getWidth(),
79+
streamResolution.getHeight(),
80+
StreamFramerate.getFramerate(sharedPreferences.getString("StreamFramerate", StreamFramerate.DEFAULT)),
81+
StreamBitrate.getBitrate(sharedPreferences.getString("StreamBitrate", StreamBitrate.DEFAULT)),
8082
0,
8183
dpi
8284
)) {
8385
boolean audioInitialized;
84-
if (sharedPreferences.getString("AudioSource", "0").equals("internal") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
85-
audioInitialized = rtmpDisplayBase.prepareInternalAudio(64 * 1024, 32000, true, false, false);
86+
if (sharedPreferences.getString("StreamAudioSource", StreamAudioSource.DEFAULT).equals(StreamAudioSource.INTERNAL) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
87+
audioInitialized = rtmpDisplayBase.prepareInternalAudio(
88+
StreamAudioBitrate.getBitrate(sharedPreferences.getString("StreamAudioBitrate", StreamAudioBitrate.DEFAULT)),
89+
StreamAudioSampleRate.getSampleRate(sharedPreferences.getString("StreamAudioSampleRate", StreamAudioSampleRate.DEFAULT)),
90+
sharedPreferences.getBoolean("StreamAudioStereo", true),
91+
false,
92+
false
93+
);
8694
} else {
87-
audioInitialized = rtmpDisplayBase.prepareAudio(Integer.parseInt(sharedPreferences.getString("AudioSource", "0")), 64 * 1024, 32000, false, false, false);
95+
audioInitialized = rtmpDisplayBase.prepareAudio(
96+
StreamAudioSource.getAudioSource(sharedPreferences.getString("StreamAudioSource", StreamAudioSource.DEFAULT)),
97+
StreamAudioBitrate.getBitrate(sharedPreferences.getString("StreamAudioBitrate", StreamAudioBitrate.DEFAULT)),
98+
StreamAudioSampleRate.getSampleRate(sharedPreferences.getString("StreamAudioSampleRate", StreamAudioSampleRate.DEFAULT)),
99+
sharedPreferences.getBoolean("StreamAudioStereo", true),
100+
false,
101+
false
102+
);
88103
}
89104

90105
if (audioInitialized) {
91-
if (!sharedPreferences.getBoolean("RecordAudio", true)) {
106+
if (!sharedPreferences.getBoolean("StreamRecordAudio", true)) {
92107
rtmpDisplayBase.disableAudio();
93108
} else {
94109
rtmpDisplayBase.enableAudio();
@@ -146,8 +161,8 @@ public static void init(Context context, ConnectCheckerRtmp connectCheckerRtmp)
146161
if (rtmpDisplayBase == null) {
147162
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
148163
rtmpDisplayBase = new RtmpDisplay(appContext, true, connectChecker);
149-
if (!sharedPreferences.getString("RtmpUsername", "").isEmpty() && !sharedPreferences.getString("RtmpPassword", "").isEmpty()) {
150-
rtmpDisplayBase.setAuthorization(sharedPreferences.getString("RtmpUsername", ""), sharedPreferences.getString("RtmpPassword", ""));
164+
if (!sharedPreferences.getString("StreamRtmpUsername", "").isEmpty() && !sharedPreferences.getString("StreamRtmpPassword", "").isEmpty()) {
165+
rtmpDisplayBase.setAuthorization(sharedPreferences.getString("StreamRtmpUsername", ""), sharedPreferences.getString("StreamRtmpPassword", ""));
151166
}
152167
}
153168
}

0 commit comments

Comments
 (0)