优化xor加解密逻辑适应tx云
This commit is contained in:
Binary file not shown.
@@ -117,7 +117,14 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private fun setupActions() {
|
private fun setupActions() {
|
||||||
binding.btnHomeLivePush.setOnClickListener {
|
binding.btnHomeLivePush.setOnClickListener {
|
||||||
showPushSettingsDialog { showPushProtocolSheet() }
|
showPushSettingsDialog {
|
||||||
|
val settings = settingsStore.read()
|
||||||
|
if (settings.useUrlMode) {
|
||||||
|
startActivity(LivePushActivity.createIntent(this, SellyLiveMode.RTMP))
|
||||||
|
} else {
|
||||||
|
showPushProtocolSheet()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
binding.btnHomeLivePull.setOnClickListener {
|
binding.btnHomeLivePull.setOnClickListener {
|
||||||
showPlayConfigDialog()
|
showPlayConfigDialog()
|
||||||
@@ -341,6 +348,7 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val current = settingsStore.read()
|
val current = settingsStore.read()
|
||||||
dialogBinding.etStreamId.setText(generateRandomStreamId())
|
dialogBinding.etStreamId.setText(generateRandomStreamId())
|
||||||
|
dialogBinding.etPushUrl.setText(current.pushUrl)
|
||||||
dialogBinding.etFps.setText(current.fps.toString())
|
dialogBinding.etFps.setText(current.fps.toString())
|
||||||
dialogBinding.etMaxBitrate.setText(current.maxBitrateKbps.toString())
|
dialogBinding.etMaxBitrate.setText(current.maxBitrateKbps.toString())
|
||||||
dialogBinding.etMinBitrate.setText(current.minBitrateKbps.toString())
|
dialogBinding.etMinBitrate.setText(current.minBitrateKbps.toString())
|
||||||
@@ -354,17 +362,40 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun updateModeVisibility(urlMode: Boolean) {
|
||||||
|
dialogBinding.groupUrlMode.visibility = if (urlMode) View.VISIBLE else View.GONE
|
||||||
|
dialogBinding.groupStreamIdMode.visibility = if (urlMode) View.GONE else View.VISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogBinding.rgPushMode.check(
|
||||||
|
if (current.useUrlMode) R.id.rbModeUrl else R.id.rbModeStreamId
|
||||||
|
)
|
||||||
|
updateModeVisibility(current.useUrlMode)
|
||||||
|
|
||||||
|
dialogBinding.rgPushMode.setOnCheckedChangeListener { _, checkedId ->
|
||||||
|
updateModeVisibility(checkedId == R.id.rbModeUrl)
|
||||||
|
}
|
||||||
|
|
||||||
dialogBinding.btnClose.setOnClickListener { dialog.dismiss() }
|
dialogBinding.btnClose.setOnClickListener { dialog.dismiss() }
|
||||||
dialogBinding.btnApply.setOnClickListener {
|
dialogBinding.btnApply.setOnClickListener {
|
||||||
|
val useUrlMode = dialogBinding.rgPushMode.checkedRadioButtonId == R.id.rbModeUrl
|
||||||
|
val pushUrl = dialogBinding.etPushUrl.text?.toString()?.trim().orEmpty()
|
||||||
val streamId = dialogBinding.etStreamId.text?.toString()?.trim().orEmpty()
|
val streamId = dialogBinding.etStreamId.text?.toString()?.trim().orEmpty()
|
||||||
val fps = dialogBinding.etFps.text?.toString()?.trim()?.toIntOrNull()
|
val fps = dialogBinding.etFps.text?.toString()?.trim()?.toIntOrNull()
|
||||||
val maxKbps = dialogBinding.etMaxBitrate.text?.toString()?.trim()?.toIntOrNull()
|
val maxKbps = dialogBinding.etMaxBitrate.text?.toString()?.trim()?.toIntOrNull()
|
||||||
val minKbps = dialogBinding.etMinBitrate.text?.toString()?.trim()?.toIntOrNull()
|
val minKbps = dialogBinding.etMinBitrate.text?.toString()?.trim()?.toIntOrNull()
|
||||||
|
|
||||||
|
if (useUrlMode) {
|
||||||
|
if (pushUrl.isEmpty()) {
|
||||||
|
Toast.makeText(this, "请输入推流地址", Toast.LENGTH_SHORT).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (streamId.isEmpty()) {
|
if (streamId.isEmpty()) {
|
||||||
Toast.makeText(this, "请输入 Stream ID", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "请输入 Stream ID", Toast.LENGTH_SHORT).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (fps == null || fps <= 0) {
|
if (fps == null || fps <= 0) {
|
||||||
Toast.makeText(this, "请输入正确的 FPS", Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, "请输入正确的 FPS", Toast.LENGTH_SHORT).show()
|
||||||
return@setOnClickListener
|
return@setOnClickListener
|
||||||
@@ -392,7 +423,9 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
fps = fps,
|
fps = fps,
|
||||||
maxBitrateKbps = maxKbps,
|
maxBitrateKbps = maxKbps,
|
||||||
minBitrateKbps = minKbps,
|
minBitrateKbps = minKbps,
|
||||||
xorKeyHex = xorKey
|
xorKeyHex = xorKey,
|
||||||
|
useUrlMode = useUrlMode,
|
||||||
|
pushUrl = pushUrl
|
||||||
)
|
)
|
||||||
settingsStore.write(updated)
|
settingsStore.write(updated)
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ data class AvDemoSettings(
|
|||||||
val maxBitrateKbps: Int,
|
val maxBitrateKbps: Int,
|
||||||
val minBitrateKbps: Int,
|
val minBitrateKbps: Int,
|
||||||
val xorKeyHex: String = "",
|
val xorKeyHex: String = "",
|
||||||
|
val useUrlMode: Boolean = false,
|
||||||
|
val pushUrl: String = "",
|
||||||
) {
|
) {
|
||||||
enum class Resolution { P360, P480, P540, P720 }
|
enum class Resolution { P360, P480, P540, P720 }
|
||||||
|
|
||||||
@@ -38,7 +40,9 @@ class AvDemoSettingsStore(context: Context) {
|
|||||||
fps = prefs.getInt(KEY_FPS, DEFAULT_FPS),
|
fps = prefs.getInt(KEY_FPS, DEFAULT_FPS),
|
||||||
maxBitrateKbps = prefs.getInt(KEY_MAX_KBPS, DEFAULT_MAX_KBPS),
|
maxBitrateKbps = prefs.getInt(KEY_MAX_KBPS, DEFAULT_MAX_KBPS),
|
||||||
minBitrateKbps = prefs.getInt(KEY_MIN_KBPS, DEFAULT_MIN_KBPS),
|
minBitrateKbps = prefs.getInt(KEY_MIN_KBPS, DEFAULT_MIN_KBPS),
|
||||||
xorKeyHex = prefs.getString(KEY_XOR_KEY_HEX, "").orEmpty()
|
xorKeyHex = prefs.getString(KEY_XOR_KEY_HEX, "").orEmpty(),
|
||||||
|
useUrlMode = prefs.getBoolean(KEY_USE_URL_MODE, false),
|
||||||
|
pushUrl = prefs.getString(KEY_PUSH_URL, "").orEmpty()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,6 +54,8 @@ class AvDemoSettingsStore(context: Context) {
|
|||||||
putInt(KEY_MAX_KBPS, settings.maxBitrateKbps)
|
putInt(KEY_MAX_KBPS, settings.maxBitrateKbps)
|
||||||
putInt(KEY_MIN_KBPS, settings.minBitrateKbps)
|
putInt(KEY_MIN_KBPS, settings.minBitrateKbps)
|
||||||
putString(KEY_XOR_KEY_HEX, settings.xorKeyHex)
|
putString(KEY_XOR_KEY_HEX, settings.xorKeyHex)
|
||||||
|
putBoolean(KEY_USE_URL_MODE, settings.useUrlMode)
|
||||||
|
putString(KEY_PUSH_URL, settings.pushUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,5 +72,7 @@ class AvDemoSettingsStore(context: Context) {
|
|||||||
private const val DEFAULT_MAX_KBPS = 2000
|
private const val DEFAULT_MAX_KBPS = 2000
|
||||||
private const val DEFAULT_MIN_KBPS = 500
|
private const val DEFAULT_MIN_KBPS = 500
|
||||||
private const val KEY_XOR_KEY_HEX = "xor_key_hex"
|
private const val KEY_XOR_KEY_HEX = "xor_key_hex"
|
||||||
|
private const val KEY_USE_URL_MODE = "use_url_mode"
|
||||||
|
private const val KEY_PUSH_URL = "push_url"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,6 +130,16 @@ class LivePushActivity : AppCompatActivity() {
|
|||||||
pusher.stopLive()
|
pusher.stopLive()
|
||||||
} else {
|
} else {
|
||||||
val settings = settingsStore.read()
|
val settings = settingsStore.read()
|
||||||
|
applyStreamConfig(settings)
|
||||||
|
pusher.setXorKey(settings.xorKeyHex)
|
||||||
|
if (settings.useUrlMode) {
|
||||||
|
val pushUrl = settings.pushUrl
|
||||||
|
if (pushUrl.isEmpty()) {
|
||||||
|
Toast.makeText(this, "请先在设置中输入推流地址", Toast.LENGTH_SHORT).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
pusher.startLiveWithUrl(pushUrl)
|
||||||
|
} else {
|
||||||
val env = envStore.read()
|
val env = envStore.read()
|
||||||
val streamId = settings.streamId
|
val streamId = settings.streamId
|
||||||
val authError = LiveAuthHelper.validateAuthConfig(env, streamId)
|
val authError = LiveAuthHelper.validateAuthConfig(env, streamId)
|
||||||
@@ -142,12 +152,11 @@ class LivePushActivity : AppCompatActivity() {
|
|||||||
channelId = streamId,
|
channelId = streamId,
|
||||||
type = LiveTokenSigner.TokenType.PUSH
|
type = LiveTokenSigner.TokenType.PUSH
|
||||||
)
|
)
|
||||||
applyStreamConfig(settings)
|
|
||||||
pusher.token = auth?.tokenResult?.token
|
pusher.token = auth?.tokenResult?.token
|
||||||
pusher.setXorKey(settings.xorKeyHex)
|
|
||||||
pusher.startLiveWithStreamId(streamId)
|
pusher.startLiveWithStreamId(streamId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
binding.actionFlip.setOnClickListener { switchCameraAndRemember() }
|
binding.actionFlip.setOnClickListener { switchCameraAndRemember() }
|
||||||
binding.actionMute.setOnClickListener { toggleMute() }
|
binding.actionMute.setOnClickListener { toggleMute() }
|
||||||
|
|||||||
@@ -40,6 +40,89 @@
|
|||||||
app:tint="@color/brand_primary" />
|
app:tint="@color/brand_primary" />
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<!-- Push Mode -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:text="@string/push_settings_push_mode"
|
||||||
|
android:textColor="@color/av_text_primary"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<RadioGroup
|
||||||
|
android:id="@+id/rgPushMode"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/av_field_height"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:background="@drawable/bg_av_segment_container"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:id="@+id/rbModeStreamId"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@drawable/selector_av_segment_left"
|
||||||
|
android:button="@null"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/push_mode_stream_id"
|
||||||
|
android:textColor="@color/av_segment_text"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<RadioButton
|
||||||
|
android:id="@+id/rbModeUrl"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@drawable/selector_av_segment_right"
|
||||||
|
android:button="@null"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/push_mode_url"
|
||||||
|
android:textColor="@color/av_segment_text"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
<!-- URL mode input -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/groupUrlMode"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:text="@string/push_settings_push_url"
|
||||||
|
android:textColor="@color/av_text_primary"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/etPushUrl"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/av_field_height"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:background="@drawable/bg_av_input_field"
|
||||||
|
android:hint="rtmp://host/app/stream"
|
||||||
|
android:importantForAutofill="no"
|
||||||
|
android:inputType="textUri"
|
||||||
|
android:paddingStart="12dp"
|
||||||
|
android:paddingEnd="12dp"
|
||||||
|
android:textColor="@color/av_text_primary"
|
||||||
|
android:textColorHint="@color/av_text_hint"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- StreamID mode input -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/groupStreamIdMode"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@@ -62,6 +145,7 @@
|
|||||||
android:textColor="@color/av_text_primary"
|
android:textColor="@color/av_text_primary"
|
||||||
android:textColorHint="@color/av_text_hint"
|
android:textColorHint="@color/av_text_hint"
|
||||||
android:textSize="14sp" />
|
android:textSize="14sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|||||||
@@ -76,6 +76,10 @@
|
|||||||
<string name="push_settings_apply">应用</string>
|
<string name="push_settings_apply">应用</string>
|
||||||
<string name="push_settings_stream_id">Stream ID</string>
|
<string name="push_settings_stream_id">Stream ID</string>
|
||||||
<string name="push_settings_close">关闭设置</string>
|
<string name="push_settings_close">关闭设置</string>
|
||||||
|
<string name="push_settings_push_mode">推流模式</string>
|
||||||
|
<string name="push_mode_stream_id">StreamID</string>
|
||||||
|
<string name="push_mode_url">URL</string>
|
||||||
|
<string name="push_settings_push_url">推流地址</string>
|
||||||
|
|
||||||
<string name="play_config_title">播放配置</string>
|
<string name="play_config_title">播放配置</string>
|
||||||
<string name="play_config_protocol_label">播放协议</string>
|
<string name="play_config_protocol_label">播放协议</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user