集成完直播后提交代码

This commit is contained in:
xuhuixiang
2026-02-06 14:55:21 +08:00
commit ea9ffa06ff
960 changed files with 75063 additions and 0 deletions

2
LiveApp/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build
/release

110
LiveApp/build.gradle Normal file
View File

@@ -0,0 +1,110 @@
import java.text.SimpleDateFormat
apply plugin: 'com.android.application'
apply from: './dependencies.gradle'
ext.MTL_buildId = getEnvValue("MUPP_BUILD_ID", 'localbuild')
ext.MTL_buildTimestamp = new SimpleDateFormat("yyMMddHHmmss").format(new Date())
//@keria:cannot make method static
String getEnvValue(key, defValue) {
def val = System.getProperty(key)
if (null != val) {
return val
}
val = System.getenv(key)
if (null != val) {
return val
}
return defValue
}
android {
lintOptions {
checkReleaseBuilds false
abortOnError false
}
signingConfigs {
release {
keyAlias 'key0'
keyPassword 'livepush'
storeFile file('livepush.jks')
storePassword 'livepush'
}
debug {
keyAlias 'key0'
keyPassword 'livepush'
storeFile file('livepush.jks')
storePassword 'livepush'
}
}
dexOptions {
javaMaxHeapSize "3g"
}
compileSdkVersion androidCompileSdkVersion
buildToolsVersion androidBuildToolsVersion
defaultConfig {
applicationId "com.alivc.live.pusher.demo"
minSdkVersion androidMinSdkVersion
targetSdkVersion androidTargetSdkVersion
versionCode 1
versionName "1.0"
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: 'live']
}
}
}
buildTypes {
release {
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
// 解决animoji和queen库so重复问题
pickFirst '**/libc++_shared.so'
pickFirst '**/libMNN.so'
pickFirst '**/libMNN_CL.so'
pickFirst '**/libalivcffmpeg.so'
}
publishNonDefault true
lintOptions {
checkReleaseBuilds false
abortOnError false
disable 'MissingTranslation'
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "${project.name}-${sdk_type.split('_').last()}-${variant.buildType.name}-${MTL_buildId}.apk"
}
}
allprojects {
repositories {
flatDir {
dirs 'src/main/libs'
}
}
}
resourcePrefix "push_"
}
dependencies {
implementation externalAndroidDesign
// 手动集成本地依赖SDK
// implementation fileTree(dir: 'src/main/libs', include: ['*.jar', '*.aar'])
}

22
LiveApp/build_lib.gradle Normal file
View File

@@ -0,0 +1,22 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion androidCompileSdkVersion
buildToolsVersion androidBuildToolsVersion
defaultConfig {
minSdkVersion androidMinSdkVersion
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME :'live' ]
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
apply from: './dependencies.gradle'

View File

@@ -0,0 +1,18 @@
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.1.0'
implementation externalAndroidMultiDex
implementation externalARouter
implementation project(':LiveBasic:live_push')
implementation project(':LiveBasic:live_pull')
implementation project(':LiveBasic:live_pull_rts')
implementation project(':LiveBasic:live_screencap')
implementation project(':LiveInteractive:live_pk')
implementation project(':LiveInteractive:live_interactive')
implementation project(':LiveInteractive:live_barestream')
annotationProcessor externalARouterCompiler
}

BIN
LiveApp/livepush.jks Normal file

Binary file not shown.

92
LiveApp/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,92 @@
# This is a configuration file for ProGuard.
# http:#proguard.sourceforge.net/index.html#manual/usage.html
# 指定代码的压缩级别
-optimizationpasses 5
#混淆时不使用大小写混合类名
-dontusemixedcaseclassnames
#不跳过library中的非public的类
-dontskipnonpubliclibraryclasses
#打印混淆的详细信息
-verbose
#忽略警告
-ignorewarnings
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
#不进行优化,建议使用此选项,理由见上
-dontoptimize
#不进行预校验预校验是作用在Java平台上的Android平台上不需要这项功能去掉之后还可以加快混淆速度
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
#保留注解参数
-keepattributes *Annotation*
#保留Google原生服务需要的类
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#2023-01-03最新混淆规则直播SDK版本>=4.4.9一体化SDK版本>=1.7.0
#SDK内部已做混淆外部全部keep即可
#混淆规则请见官网文档https://help.aliyun.com/zh/live/developer-reference/integrate-push-sdk-for-android
-keep class org.webrtc.** { *; }
-keep class com.alivc.** { *; }
-keep class com.aliyun.** { *; }
-keep class com.cicada.** { *; }
#2023-01-03最新混淆规则直播SDK版本>=4.4.9一体化SDK版本>=1.7.0
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
-keep class android.** { *;}
# For native methods, see http:#proguard.sourceforge.net/manual/examples.html#native
#保留native方法的类名和方法名
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http:#proguard.sourceforge.net/manual/examples.html#beans
#保留自定义View,"属性动画"中的set/get方法
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
#保留Activity中参数是View的方法如XML中配置android:onClick=”buttonClick属性Activity中调用的buttonClick(View view)方法
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http:#proguard.sourceforge.net/manual/examples.html#enumerations
#保留混淆枚举中的values()和valueOf()方法
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#Parcelable实现类中的CREATOR字段是绝对不能改变的,包括大小写
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
#R文件中的所有记录资源id的静态字段
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Dont warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
#忽略support包因为版本兼容产生的警告
-dontwarn android.support.**

View File

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alivc.live.pusher.demo">
<!-- Used for network features -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- To check the network connection state of the device, you'll need to add the ACCESS_NETWORK_STATE permission. -->
<!-- This permission does not require user consent at runtime, but needs to be declared in the app's AndroidManifest.xml. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- If the app needs to record audio, you need to declare the RECORD_AUDIO permission and request this permission at runtime -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- The application needs to access the device's camera -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission
android:name="android.permission.BLUETOOTH" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Needed only if your app communicates with already-paired Bluetooth devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Only used by Demo for accessing storage files -->
<!-- Storage permissions -->
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Access image files -->
<uses-permission
android:name="android.permission.READ_MEDIA_IMAGES"
android:minSdkVersion="33" />
<!-- Write audio files -->
<uses-permission
android:name="android.permission.READ_MEDIA_AUDIO"
android:minSdkVersion="33" />
<!-- Write video files -->
<uses-permission
android:name="android.permission.READ_MEDIA_VIDEO"
android:minSdkVersion="33" />
<!-- Only used by Demo for screen recording and streaming -->
<!-- Used for creating background tasks, not required by SDK -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- Requesting permission to create system overlay windows -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- Only used by Demo for muting -->
<!-- If this permission is not declared, the feature of automatically muting the stream during a phone call will not work -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:name=".LiveApplication"
android:allowBackup="false"
android:extractNativeLibs="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
android:name=".PushMainActivity"
android:exported="false"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/AVLiveAppTheme" />
<activity
android:name=".MainActivity"
android:alwaysRetainTaskState="true"
android:clearTaskOnLaunch="false"
android:configChanges="orientation"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
android:windowSoftInputMode="stateHidden|adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 请在此处填写申请到的license相关信息 -->
<!-- Demo License仅供测试和体验使用随时可能过期请勿直接使用 -->
<!-- 推流SDK License集成指南https://help.aliyun.com/zh/live/developer-reference/integrate-a-push-sdk-license -->
<meta-data
android:name="com.aliyun.alivc_license.licensekey"
android:value="MoCTfuQ391Z01mNqG8f8786e23c8a457a8ff8d5faedc1040c" />
<meta-data
android:name="com.aliyun.alivc_license.licensefile"
android:value="assets/license.crt" />
</application>
</manifest>

View File

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:986c8c9c783782fca860f9d25f113d215cff978bd301a7b944cbf6b4040de2a2
size 2116762

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

View File

@@ -0,0 +1,97 @@
{
"pid": 2,
"fid": 2,
"du": 2.04,
"type": 2,
"x": 320.0,
"y": 320.0,
"w": 350.0,
"h": 580.0,
"a": 0.0,
"fx": 0.0,
"fy": 0.0,
"fw": 0.0,
"fh": 0.0,
"n": "qizi",
"c": 68.0,
"kerneframe": 51,
"pExtend": 1,
"extendSection":0,
"frameArry": [
{"time":0,"pic":0},
{"time":0.03,"pic":1},
{"time":0.06,"pic":2},
{"time":0.09,"pic":3},
{"time":0.12,"pic":4},
{"time":0.15,"pic":5},
{"time":0.18,"pic":6},
{"time":0.21,"pic":7},
{"time":0.24,"pic":8},
{"time":0.27,"pic":9},
{"time":0.3,"pic":10},
{"time":0.33,"pic":11},
{"time":0.36,"pic":12},
{"time":0.39,"pic":13},
{"time":0.42,"pic":14},
{"time":0.45,"pic":15},
{"time":0.48,"pic":16},
{"time":0.51,"pic":17},
{"time":0.54,"pic":18},
{"time":0.57,"pic":19},
{"time":0.6,"pic":20},
{"time":0.63,"pic":21},
{"time":0.66,"pic":22},
{"time":0.69,"pic":23},
{"time":0.72,"pic":24},
{"time":0.75,"pic":25},
{"time":0.78,"pic":26},
{"time":0.81,"pic":27},
{"time":0.84,"pic":28},
{"time":0.87,"pic":29},
{"time":0.9,"pic":30},
{"time":0.93,"pic":31},
{"time":0.96,"pic":32},
{"time":0.99,"pic":33},
{"time":1.02,"pic":34},
{"time":1.05,"pic":35},
{"time":1.08,"pic":36},
{"time":1.11,"pic":37},
{"time":1.14,"pic":38},
{"time":1.17,"pic":39},
{"time":1.2,"pic":40},
{"time":1.23,"pic":41},
{"time":1.26,"pic":42},
{"time":1.29,"pic":43},
{"time":1.32,"pic":44},
{"time":1.35,"pic":45},
{"time":1.38,"pic":46},
{"time":1.41,"pic":47},
{"time":1.44,"pic":48},
{"time":1.47,"pic":49},
{"time":1.5,"pic":50},
{"time":1.53,"pic":51},
{"time":1.56,"pic":52},
{"time":1.59,"pic":53},
{"time":1.62,"pic":54},
{"time":1.65,"pic":55},
{"time":1.68,"pic":56},
{"time":1.71,"pic":57},
{"time":1.74,"pic":58},
{"time":1.77,"pic":59},
{"time":1.8,"pic":60},
{"time":1.83,"pic":61},
{"time":1.86,"pic":62},
{"time":1.89,"pic":63},
{"time":1.92,"pic":64},
{"time":1.95,"pic":65},
{"time":1.98,"pic":66},
{"time":2.01,"pic":67}
],
"timeArry": [
{"beginTime": 0.0,"endTime":2.04, "shrink":1, "minTime":1.02, "maxTime": 0.0}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,28 @@
package com.alivc.live.pusher.demo;
import android.app.Application;
import android.content.Context;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import com.alibaba.android.arouter.launcher.ARouter;
import com.alivc.live.baselive_push.ui.LivePushActivity;
import com.alivc.live.commonutils.ContextUtils;
public class LiveApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
@Override
public void onCreate() {
super.onCreate();
ContextUtils.setContext(this);
ARouter.init(this);
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new LivePushActivity.ConnectivityChangedReceiver(), filter);
PushLaunchManager.launch4All(this);
}
}

View File

@@ -0,0 +1,254 @@
package com.alivc.live.pusher.demo;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.PermissionChecker;
import com.alivc.live.annotations.AlivcLiveMode;
import com.alivc.live.barestream_interactive.InteractiveInputURLActivity;
import com.alivc.live.baselive_pull.ui.PlayerActivity;
import com.alivc.live.baselive_push.ui.PushConfigActivity;
import com.alivc.live.baselive_recording.ui.VideoRecordConfigActivity;
import com.alivc.live.commonbiz.SharedPreferenceUtils;
import com.alivc.live.commonbiz.backdoor.BackDoorActivity;
import com.alivc.live.commonbiz.test.PushDemoTestConstants;
import com.alivc.live.commonui.utils.StatusBarUtil;
import com.alivc.live.commonutils.ContextUtils;
import com.alivc.live.commonutils.FastClickUtil;
import com.alivc.live.interactive_common.InteractiveAppInfoActivity;
import com.alivc.live.interactive_common.InteractiveConstants;
import com.alivc.live.interactive_common.InteractiveInputActivity;
import com.alivc.live.pusher.AlivcLiveBase;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private LinearLayout mLivePushLayout;
private LinearLayout mLivePullCommonPullLayout;
private LinearLayout mLivePullRtcLayout;
private LinearLayout mLiveInteractLayout;
private LinearLayout mPKLiveInteractLayout;
private LinearLayout mInteractiveUrlLayout;
private TextView mVersion;//推流sdk版本号
private String mPushUrl;
private TextView mAliyunSDKPrivacy;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
StatusBarUtil.translucent(this, Color.TRANSPARENT);
check();
setContentView(R.layout.push_activity_main);
initView();
if (!permissionCheck()) {
if (Build.VERSION.SDK_INT >= 23) {
ActivityCompat.requestPermissions(this, getPermissions(), PERMISSION_REQUEST_CODE);
} else {
showNoPermissionTip(getString(noPermissionTip[mNoPermissionIndex]));
finish();
}
}
Intent intent = getIntent();
mPushUrl = intent.getStringExtra("pushUrl");
mPushUrl = "rtmp://stream.bab3live.com/live/channel_230";
}
private void check() {
if (!this.isTaskRoot()) { // 当前类不是该Task的根部那么之前启动
Intent intent = getIntent();
if (intent != null) {
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) { // 当前类是从桌面启动的
finish(); // finish掉该类直接打开该Task中现存的Activity
}
}
}
}
private void initView() {
mLivePushLayout = (LinearLayout) findViewById(R.id.push_enter_layout);
mLivePushLayout.setOnClickListener(this);
mLivePullCommonPullLayout = (LinearLayout) findViewById(R.id.pull_common_enter_layout);
mLivePullCommonPullLayout.setOnClickListener(this);
mLivePullRtcLayout = (LinearLayout) findViewById(R.id.pull_enter_layout);
mLivePullRtcLayout.setOnClickListener(this);
mLiveInteractLayout = (LinearLayout) findViewById(R.id.pull_interact_layout);
mInteractiveUrlLayout = (LinearLayout) findViewById(R.id.interactive_url_layout);
mPKLiveInteractLayout = (LinearLayout) findViewById(R.id.pull_pk_layout);
mLiveInteractLayout.setOnClickListener(this);
mPKLiveInteractLayout.setOnClickListener(this);
mInteractiveUrlLayout.setOnClickListener(this);
mVersion = (TextView) findViewById(R.id.push_version);
mVersion.setText(getString(R.string.version_desc) + AlivcLiveBase.getSDKVersion());
mVersion.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
startActivity(new Intent(MainActivity.this, BackDoorActivity.class));
return false;
}
});
mAliyunSDKPrivacy = findViewById(R.id.aliyun_sdk_privacy);
mAliyunSDKPrivacy.setMovementMethod(LinkMovementMethod.getInstance());
mLiveInteractLayout.setVisibility(AlivcLiveBase.isSupportLiveMode(AlivcLiveMode.AlivcLiveInteractiveMode) ? View.VISIBLE : View.GONE);
mPKLiveInteractLayout.setVisibility(AlivcLiveBase.isSupportLiveMode(AlivcLiveMode.AlivcLiveInteractiveMode) ? View.VISIBLE : View.GONE);
mInteractiveUrlLayout.setVisibility(AlivcLiveBase.isSupportLiveMode(AlivcLiveMode.AlivcLiveInteractiveMode) ? View.VISIBLE : View.GONE);
}
private int mNoPermissionIndex = 0;
private final int PERMISSION_REQUEST_CODE = 1;
private final String[] permissionManifest = {
Manifest.permission.CAMERA,
Manifest.permission.BLUETOOTH,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.INTERNET,
Manifest.permission.BLUETOOTH_CONNECT,
};
private final String[] permissionManifest33 = {
Manifest.permission.CAMERA,
Manifest.permission.BLUETOOTH,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.INTERNET,
Manifest.permission.BLUETOOTH_CONNECT,
};
public String[] getPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
return permissionManifest;
}
return permissionManifest33;
}
private final int[] noPermissionTip = {
R.string.no_camera_permission,
R.string.no_record_bluetooth_permission,
R.string.no_record_audio_permission,
R.string.no_read_phone_state_permission,
R.string.no_write_external_storage_permission,
R.string.no_read_external_storage_permission,
R.string.no_internet_permission,
R.string.no_record_bluetooth_permission,
};
@SuppressLint("WrongConstant")
private boolean permissionCheck() {
int permissionCheck = PackageManager.PERMISSION_GRANTED;
String permission;
for (int i = 0; i < getPermissions().length; i++) {
permission = getPermissions()[i];
mNoPermissionIndex = i;
if (PermissionChecker.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
permissionCheck = PackageManager.PERMISSION_DENIED;
}
}
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
return false;
} else {
return true;
}
}
@Override
public void onClick(View v) {
Intent intent;
int id = v.getId();
if (id == R.id.push_enter_layout) {
if (FastClickUtil.isProcessing()) {
return;
}
intent = new Intent(MainActivity.this, PushConfigActivity.class);
if (!TextUtils.isEmpty(mPushUrl)) {
intent.putExtra("pushUrl", mPushUrl);
}
startActivity(intent);
} else if (id == R.id.pull_common_enter_layout) {
intent = new Intent(MainActivity.this, VideoRecordConfigActivity.class);
if (!TextUtils.isEmpty(mPushUrl)) {
intent.putExtra("pushUrl", mPushUrl);
}
startActivity(intent);
} else if (id == R.id.pull_enter_layout) {
intent = new Intent(MainActivity.this, PlayerActivity.class);
startActivity(intent);
} else if (id == R.id.pull_interact_layout) {
gotoNextActivityWithScene(InteractiveConstants.SCENE_TYPE_INTERACTIVE_LIVE);
} else if (id == R.id.pull_pk_layout) {
gotoNextActivityWithScene(InteractiveConstants.SCENE_TYPE_PK_LIVE);
} else if (id == R.id.interactive_url_layout) {
intent = new Intent(MainActivity.this, InteractiveInputURLActivity.class);
startActivity(intent);
}
}
private void gotoNextActivityWithScene(int scene) {
Intent intent;
if (checkInteractiveAPPInfoIfNeed()) {
intent = new Intent(MainActivity.this, InteractiveAppInfoActivity.class);
intent.putExtra(InteractiveConstants.DATA_TYPE_SCENE, scene);
} else {
intent = new Intent(MainActivity.this, InteractiveInputActivity.class);
intent.putExtra(InteractiveConstants.DATA_TYPE_SCENE, scene);
}
startActivity(intent);
}
private void showNoPermissionTip(String tip) {
Toast.makeText(this, tip, Toast.LENGTH_LONG).show();
}
private boolean checkInteractiveAPPInfoIfNeed() {
Context context = ContextUtils.getApplicationContext();
// 如果sp里面appInfo都有返回false不需要填写
if (!(TextUtils.isEmpty(SharedPreferenceUtils.getAppId(context))
|| TextUtils.isEmpty(SharedPreferenceUtils.getAppKey(context))
|| TextUtils.isEmpty(SharedPreferenceUtils.getPlayDomain(context)))) {
return false;
}
// 如果开发调试用的appInfo都有返回false不需要填写
String testAppID = PushDemoTestConstants.getTestInteractiveAppID();
String testAppKey = PushDemoTestConstants.getTestInteractiveAppKey();
String testPlayDomain = PushDemoTestConstants.getTestInteractivePlayDomain();
if (!(PushDemoTestConstants.checkIsPlaceholder(testAppID)
|| PushDemoTestConstants.checkIsPlaceholder(testAppKey)
|| PushDemoTestConstants.checkIsPlaceholder(testPlayDomain))) {
// 将开发调试用的appInfo写入到sp里面
SharedPreferenceUtils.setAppInfo(getApplicationContext(), testAppID, testAppKey, testPlayDomain);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,119 @@
package com.alivc.live.pusher.demo;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import androidx.annotation.NonNull;
import com.alivc.live.commonbiz.BuildConfig;
import com.alivc.live.commonutils.AssetUtil;
import com.alivc.live.commonutils.FileUtil;
import com.alivc.live.pusher.AlivcLiveBase;
import com.alivc.live.pusher.AlivcLiveBaseListener;
import com.alivc.live.pusher.AlivcLivePushConstants;
import com.alivc.live.pusher.AlivcLivePushLogLevel;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by keria on 2022/10/12.
* <p>
* 直播推流启动类
*
* @see <a href="https://www.aliyun.com/product/live">阿里云视频直播官网</a>
* <p>
* @see <a href="https://help.aliyun.com/zh/live/developer-reference/integrate-a-push-sdk-license">推流SDK License文档</a>
* @see <a href="https://help.aliyun.com/zh/live/user-guide/co-streaming/">直播连麦文档</a>
* @see <a href="https://help.aliyun.com/zh/live/developer-reference/push-sdk/">推流SDK文档</a>
*/
public class PushLaunchManager {
private static final String TAG = PushLaunchManager.class.getSimpleName();
private static final ExecutorService mWorkerThread = Executors.newSingleThreadExecutor();
private PushLaunchManager() {
}
/**
* 启动所有任务
*
* @param context android context
*/
public static void launch4All(@NonNull Context context) {
launch4LivePushDemo(context);
registerPushSDKLicense();
launch4Log(context);
}
/**
* Demo Asset加载等
*
* @param context android context
*/
private static void launch4LivePushDemo(@NonNull Context context) {
mWorkerThread.execute(() -> {
String targetPath = FileUtil.getInternalFilesFolder(context.getApplicationContext()) + File.separator + "alivc_resource";
AssetUtil.copyAssetToSdCard(context.getApplicationContext(), "alivc_resource", targetPath);
});
}
/**
* 推流SDK申请License
*
* @see <a href="https://help.aliyun.com/zh/live/developer-reference/integrate-a-push-sdk-license">推流SDK License文档</a>
*/
private static void registerPushSDKLicense() {
AlivcLiveBase.setListener(new AlivcLiveBaseListener() {
@Override
public void onLicenceCheck(AlivcLivePushConstants.AlivcLiveLicenseCheckResultCode alivcLiveLicenseCheckResultCode, String s) {
Log.e(TAG, "onLicenceCheck: " + alivcLiveLicenseCheckResultCode + ", " + s);
}
});
// 注册推流SDK
AlivcLiveBase.registerSDK();
}
/**
* 推流SDK日志配置
* <p>
* 在debug环境下使用console日志release环境下使用file日志
*
* @param context android context
* @note ADB pull file logs cmd: adb pull /sdcard/Android/data/com.alivc.live.pusher.demo/files/ ~/Downloads/live-logs
*/
private static void launch4Log(@NonNull Context context) {
AlivcLiveBase.setLogLevel(AlivcLivePushLogLevel.AlivcLivePushLogLevelInfo);
AlivcLiveBase.setConsoleEnabled(!BuildConfig.DEBUG);
String logPath = getLogFilePath(context.getApplicationContext(), "alivc_live");
// Log file size limit, total = kLogMaxFileSizeInKB * 5 (parts)
int maxPartFileSizeInKB = 100 * 1024 * 1024; // Limit to 100MB for each log part
// Set up log directory path
AlivcLiveBase.setLogDirPath(logPath, maxPartFileSizeInKB);
}
private static String getLogFilePath(@NonNull Context context, String dir) {
String logFilePath;
// Check if the external storage is mounted
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
logFilePath = context.getExternalFilesDir(dir).getAbsolutePath();
} else {
// Fallback to internal storage if external storage is not available
logFilePath = new File(context.getFilesDir(), dir).getAbsolutePath();
}
// Ensure the directory exists
File file = new File(logFilePath);
if (!file.exists() && !file.mkdirs()) {
Log.e(TAG, "Failed to create log directory: " + logFilePath);
}
Log.d(TAG, "Log file path: " + logFilePath);
return logFilePath;
}
}

View File

@@ -0,0 +1,217 @@
package com.alivc.live.pusher.demo;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.text.TextUtils;
import androidx.core.app.ActivityCompat;
import androidx.core.content.PermissionChecker;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alivc.live.annotations.AlivcLiveMode;
import com.alivc.live.commonui.activity.AUILiveBaseListActivity;
import com.alivc.live.baselive_pull.ui.PlayerActivity;
import com.alivc.live.baselive_pull_rts.InputRtsUrlActivity;
import com.alivc.live.baselive_push.ui.PushConfigActivity;
import com.alivc.live.baselive_recording.ui.VideoRecordConfigActivity;
import com.alivc.live.commonbiz.SharedPreferenceUtils;
import com.alivc.live.commonbiz.test.PushDemoTestConstants;
import com.alivc.live.commonutils.ContextUtils;
import com.alivc.live.commonutils.FastClickUtil;
import com.alivc.live.commonutils.ToastUtils;
import com.alivc.live.interactive_common.InteractiveAppInfoActivity;
import com.alivc.live.interactive_common.InteractiveConstants;
import com.alivc.live.interactive_common.InteractiveInputActivity;
import com.alivc.live.pusher.AlivcLiveBase;
import java.util.ArrayList;
import java.util.List;
@Route(path = "/live/MainActivity")
public class PushMainActivity extends AUILiveBaseListActivity {
private static final int INDEX_CAMERA_PUSH = 0;
private static final int INDEX_SCREEN_PUSH = 1;
private static final int INDEX_LOCAL_VIDEO_PUSH = 2;
private static final int INDEX_PULL = 3;
private static final int INDEX_INTERACT_LIVE = 4;
private static final int INDEX_INTERACT_PK_LIVE = 5;
private static final int INDEX_RTS_PULL = 6;
private final int PERMISSION_REQUEST_CODE = 1;
private String[] permissionManifest;
private int mObPermissionsIndex = -1;
@Override
public int getTitleResId() {
return R.string.push_title_name;
}
@Override
public boolean showBackBtn() {
return true;
}
@Override
public List<ListModel> createListData() {
List<ListModel> menu = new ArrayList<>();
menu.add(new ListModel(INDEX_CAMERA_PUSH, R.drawable.ic_live_push, getResources().getString(R.string.push_enter_name_tv), getResources().getString(R.string.push_enter_name_desc)));
menu.add(new ListModel(INDEX_SCREEN_PUSH, R.drawable.ic_live_player_luping, getResources().getString(R.string.pull_common_enter_name_tv), getResources().getString(R.string.pull_common_enter_name_desc)));
// menu.add(new ListModel(INDEX_LOCAL_VIDEO_PUSH, R.drawable.ic_live_bendi, getResources().getString(R.string.push_local_video_name_tv), "本期忽略"));
menu.add(new ListModel(INDEX_PULL, R.drawable.ic_live_player_laliu, getResources().getString(R.string.pull_rtc_enter_name_tv), getResources().getString(R.string.pull_rtc_enter_name_desc)));
if (AlivcLiveBase.isSupportLiveMode(AlivcLiveMode.AlivcLiveInteractiveMode)) {
menu.add(new ListModel(INDEX_RTS_PULL, R.drawable.ic_live_player_laliu, getResources().getString(R.string.pull_rts_enter_name), ""));
menu.add(new ListModel(INDEX_INTERACT_LIVE, R.drawable.ic_live_interact, getResources().getString(R.string.interact_live), getResources().getString(R.string.interact_live)));
menu.add(new ListModel(INDEX_INTERACT_PK_LIVE, R.drawable.ic_pk_interact, getResources().getString(R.string.pk_live), getResources().getString(R.string.pk_live)));
}
return menu;
}
@Override
public void onListItemClick(ListModel model) {
if (FastClickUtil.isProcessing()) {
return;
}
if (!permissionCheck()) {
if (mObPermissionsIndex >= 0) {
ToastUtils.show("请手动开启" + noPermissionTip[mObPermissionsIndex] + "权限");
}
if (Build.VERSION.SDK_INT >= 23) {
ActivityCompat.requestPermissions(this, permissionManifest, PERMISSION_REQUEST_CODE);
}
return;
}
switch (model.index) {
case INDEX_CAMERA_PUSH:
startActivity(new Intent(this, PushConfigActivity.class));
break;
case INDEX_SCREEN_PUSH:
startActivity(new Intent(this, VideoRecordConfigActivity.class));
break;
case INDEX_LOCAL_VIDEO_PUSH:
//0615本期不做
break;
case INDEX_PULL:
startActivity(new Intent(this, PlayerActivity.class));
break;
case INDEX_INTERACT_LIVE:
gotoNextActivityWithScene(InteractiveConstants.SCENE_TYPE_INTERACTIVE_LIVE);
break;
case INDEX_INTERACT_PK_LIVE:
gotoNextActivityWithScene(InteractiveConstants.SCENE_TYPE_PK_LIVE);
break;
case INDEX_RTS_PULL:
startActivity(new Intent(this, InputRtsUrlActivity.class));
break;
default:
break;
}
}
private void gotoNextActivityWithScene(int scene) {
Intent intent;
if (checkInteractiveAPPInfoIfNeed()) {
intent = new Intent(PushMainActivity.this, InteractiveAppInfoActivity.class);
intent.putExtra(InteractiveConstants.DATA_TYPE_SCENE, scene);
} else {
intent = new Intent(PushMainActivity.this, InteractiveInputActivity.class);
intent.putExtra(InteractiveConstants.DATA_TYPE_SCENE, scene);
}
startActivity(intent);
}
private final String[] permissionManifest23 = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH,
};
private final String[] permissionManifest31 = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH_CONNECT,
};
private final String[] permissionManifest33 = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.BLUETOOTH_CONNECT,
};
private final int[] noPermissionTip = {
R.string.no_camera_permission,
R.string.no_record_audio_permission,
R.string.no_read_phone_state_permission,
R.string.no_write_external_storage_permission,
R.string.no_read_external_storage_permission,
R.string.no_read_bluetooth_connect_permission
};
private boolean permissionCheck() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissionManifest = permissionManifest33;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
permissionManifest = permissionManifest31;
} else {
permissionManifest = permissionManifest23;
}
int permissionCheck = PermissionChecker.PERMISSION_GRANTED;
String permission;
for (int i = 0; i < permissionManifest.length; i++) {
permission = permissionManifest[i];
int state = PermissionChecker.checkSelfPermission(this, permission);
if (state == PermissionChecker.PERMISSION_DENIED) {
permissionCheck = PermissionChecker.PERMISSION_DENIED;
} else if (state == PermissionChecker.PERMISSION_DENIED_APP_OP) {
mObPermissionsIndex = i;
permissionCheck = PermissionChecker.PERMISSION_DENIED_APP_OP;
}
}
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
return false;
} else {
return true;
}
}
private boolean checkInteractiveAPPInfoIfNeed() {
Context context = ContextUtils.getApplicationContext();
// 如果sp里面appInfo都有返回false不需要填写
if (!(TextUtils.isEmpty(SharedPreferenceUtils.getAppId(context))
|| TextUtils.isEmpty(SharedPreferenceUtils.getAppKey(context))
|| TextUtils.isEmpty(SharedPreferenceUtils.getPlayDomain(context)))) {
return false;
}
// 如果开发调试用的appInfo都有返回false不需要填写
String testAppID = PushDemoTestConstants.getTestInteractiveAppID();
String testAppKey = PushDemoTestConstants.getTestInteractiveAppKey();
String testPlayDomain = PushDemoTestConstants.getTestInteractivePlayDomain();
if (!(PushDemoTestConstants.checkIsPlaceholder(testAppID)
|| PushDemoTestConstants.checkIsPlaceholder(testAppKey)
|| PushDemoTestConstants.checkIsPlaceholder(testPlayDomain))) {
// 将开发调试用的appInfo写入到sp里面
SharedPreferenceUtils.setAppInfo(getApplicationContext(), testAppID, testAppKey, testPlayDomain);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2010-2017 Alibaba Group Holding Limited.
*/
package com.alivc.live.pusher.demo;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import java.security.MessageDigest;
public class SignatureUtils {
public static String getSingInfo(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
return hexdigest(sign.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static final char[] hexDigits = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
public static String hexdigest(byte[] paramArrayOfByte) {
try {
MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
localMessageDigest.update(paramArrayOfByte);
byte[] arrayOfByte = localMessageDigest.digest();
char[] arrayOfChar = new char[32];
int i = 0;
int j = 0;
while (true) {
if (i >= 16) {
return new String(arrayOfChar);
}
int k = arrayOfByte[i];
int m = j + 1;
arrayOfChar[j] = hexDigits[(0xF & k >>> 4)];
j = m + 1;
arrayOfChar[m] = hexDigits[(k & 0xF)];
i++;
}
} catch (Exception localException) {
localException.printStackTrace();
}
return null;
}
}

View File

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/wheel_text_color_1" android:state_enabled="false"/>
<item android:color="@color/alivc_color_black" />
</selector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress" >
<clip>
<shape>
<gradient android:startColor="@android:color/black"
android:endColor="@android:color/black" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress" >
<clip>
<shape>
<gradient android:startColor="@android:color/holo_blue_light"
android:endColor="@android:color/holo_blue_light" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress" >
<clip>
<shape>
<gradient android:startColor="@android:color/holo_green_light"
android:endColor="@android:color/holo_green_light" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景色(蓝色) -->
<!--<item android:id="@android:id/background" >-->
<!--<shape>-->
<!--<corners android:radius="6dp" />-->
<!--<gradient android:startColor="#0000ff"-->
<!--android:endColor="#0000ff" />-->
<!--</shape>-->
<!--</item>-->
<!-- 设置进度条颜色(红色) -->
<item android:id="@android:id/progress" >
<clip>
<shape>
<!--<corners android:radius="6dp" />-->
<gradient android:startColor="@android:color/holo_red_light"
android:endColor="@android:color/holo_red_light" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress" >
<clip>
<shape>
<gradient android:startColor="@color/yellow"
android:endColor="@color/yellow" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="8dp"/>
<solid android:color="@color/white"/>
<stroke android:width="1dp" android:color="@color/push_btn_border_color"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false">
<solid android:color="@android:color/white" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@mipmap/camera_flash_on"/>
<item android:state_selected="false" android:drawable="@mipmap/camera_flash_on"/>
</selector>

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape android:shape="rectangle">
<corners
android:radius="5dp"
/>
<solid android:color="#8dffffff" />
<stroke
android:width="2px"
android:color="@color/wheel_text_color_2"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners
android:radius="5dp"
/>
<solid android:color="#fff" />
<stroke
android:width="2px"
android:color="@color/alivc_color_gry"/>
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/alivc_color_gry" />
<corners
android:radius="5dp"
/>
<stroke
android:width="2px"
android:color="@color/alivc_color_gry"/>
</shape>
</item>
</selector>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp"/>
<stroke android:color="#4DCFE1"
android:width="1px"/>
<solid android:color="#4DCFE1"/>
</shape>

View File

@@ -0,0 +1,238 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/view_margin_261">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/homepage_bg" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="22dp"
android:layout_marginBottom="20dp"
android:text="@string/push_main_title_name"
android:textColor="@color/color_title_text_black"
android:textSize="42sp" />
</RelativeLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="40dp">
<GridLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:columnCount="2"
android:orientation="horizontal">
<!-- 嵌套 scrollView 后, View 显示不全 -->
<View
android:layout_width="1dp"
android:layout_height="40dp"/>
<View
android:layout_width="1dp"
android:layout_height="40dp"/>
<LinearLayout
android:id="@+id/push_enter_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/player_image" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/push_enter_name_tv"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
<LinearLayout
android:id="@+id/pull_common_enter_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:layout_marginLeft="20dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/rtc_pull_image" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/pull_common_enter_name_tv"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
<LinearLayout
android:id="@+id/pull_enter_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:layout_marginTop="10dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/pull_test_image" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/pull_rtc_enter_name_tv"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
<LinearLayout
android:id="@+id/pull_interact_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/ic_interaction" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/pull_interact_name_tv"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
<LinearLayout
android:id="@+id/pull_pk_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:layout_marginTop="10dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/ic_pk" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/pk_live"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
<LinearLayout
android:id="@+id/interactive_url_layout"
android:layout_width="160dp"
android:layout_height="120dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:background="@drawable/bg_model_shape"
android:orientation="vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:background="@drawable/ic_interaction" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="19dp"
android:layout_marginTop="16dp"
android:text="@string/pull_interact_name_url"
android:textColor="@color/text_color_model_name"
android:textSize="@dimen/view_size_text_17" />
</LinearLayout>
</GridLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<TextView
android:id="@+id/aliyun_sdk_privacy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="@color/trackGradient"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="40dp"
android:text="@string/live_push_aliyun_sdk_privacy" />
<TextView
android:id="@+id/tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dp"
android:text="@string/push_main_bottom_tip"
android:textColor="@color/trackGradient"
android:textSize="11sp" />
<TextView
android:id="@+id/push_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="2dp"
android:textColor="@color/trackGradient"
android:textSize="11sp" />
</FrameLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="log_labels">
<item>CPU usage:</item>
<item>Memory usage:</item>
<item>Video capture fps:</item>
<!--<item>音频采集帧率:</item>-->
<item>Audio encoder bitrate:</item>
<item>Audio encoder fps:</item>
<item>Video render fps:</item>
<item>Video encoder model:</item>
<item>Video encoder bitrate:</item>
<item>Video encoder fps:</item>
<item>Total fps of video encoder:</item>
<item>Total time costs of video encoder:</item>
<item>Video encoder settings:</item>
<item>Audio output bitrate:</item>
<item>Video output bitrate:</item>
<item>Total Number of audio cache frames:</item>
<item>Total Number of video cache frames:</item>
<item>Video upload fps:</item>
<item>Audio upload fps:</item>
<item>PTS of current uploaded video frame:</item>
<item>PTS of current uploaded audio frame PTS:</item>
<item>PTS of the last video keyframe:</item>
<item>Final video frame in cache:</item>
<item>Final audio frame in cache</item>
<item>Total size of data uploaded:</item>
<item>Total time costs of pushing</item>
<item>Total number of video frames sent:</item>
<item>Total number of viedo frames dropped:</item>
<item>The times of video frames dropped:</item>
<item>Total times of network disconnected:</item>
<item>Total times of network reconnected:</item>
<item>Video delay duration:</item>
<item>Audio delay duration:</item>
<item>Size of current frame uploaded</item>
<!--<item>音视频pts差异</item>-->
<!--<item>两秒内上传数据总大小:</item>-->
<item>The max size of video frame in cache:</item>
<item>The max size of audio frame in cache:</item>
<item>The pts of last video frame which is waiting for sending:</item>
<item>The pts of last audio frame which is waiting for sending:</item>
<item>The pts difference of current frame:</item>
<item>The cache size of audio encoder:</item>
<item>The cache size of video encoder:</item>
<item>The cache size of render queue:</item>
<item>The average duration of per frame rendered:</item>
</string-array>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--sina web -->
<!--sms login-->
</resources>

View File

@@ -0,0 +1,312 @@
<resources>
<string name="setting_resolution_180P">180P</string>
<string name="setting_resolution_240P">240P</string>
<string name="setting_resolution_360P">360P</string>
<string name="setting_resolution_480P">480P</string>
<string name="setting_resolution_540P">540P</string>
<string name="setting_resolution_720P">720P</string>
<string name="setting_resolution_1080P">1080P</string>
<string name="setting_audio_aac_lc">LC</string>
<string name="setting_audio_aac_he">HE-AAC</string>
<string name="setting_audio_aac_hev2">HEv2-AAC</string>
<string name="setting_audio_aac_ld">AAC-LD</string>
<string name="music_mode">Music Mode</string>
<string name="app_name">AlivcLive</string>
<string name="license_declaration">License declaration</string>
<string name="license_declaration_text">© 2017 Copyright by Alibaba Cloud All rights reserved</string>
<string name="resolution_label">Resolution</string>
<string name="target_bitrate">Target bitrate</string>
<string name="target_rate_value">1200</string>
<string name="min_bitrate">Min bitrate</string>
<string name="min_rate_value">300</string>
<string name="initial_bitrate">Initial bitrate</string>
<string name="audio_bitrate">Audio bitrate</string>
<string name="initial_bit_value">1000</string>
<string name="captrue_fps">Captrue fps</string>
<string name="init_fps">20</string>
<string name="audio_sampling_rate">Audio sampling rate</string>
<string name="audio_profile">Audio profile</string>
<string name="sound_track">Sound track</string>
<string name="single_track">Single track</string>
<string name="dual_track">Dual track</string>
<string name="video_encoder">Video Encoder</string>
<string name="h264">H264</string>
<string name="h265">H265</string>
<string name="b_frames">B Frames</string>
<string name="quality_resolution_first">High quality priority</string>
<string name="quality_fluency_first">fluency priority</string>
<string name="quality_custom">custom</string>
<string name="reconnect_duration">Reconnection duration</string>
<string name="reconnect_times">Reconnection times</string>
<string name="landscape_model">Orientation</string>
<string name="portrait">Portrait</string>
<string name="homeLeft">HomeLeft</string>
<string name="homeRight">HomeRight</string>
<string name="front_camera">Front camera</string>
<string name="setting_pre_mirror">Preview mirror</string>
<string name="setting_push_mirror">Push mirror</string>
<string name="narrowband_hd">Narrowband HD</string>
<string name="display_mode">DisplayMode</string>
<string name="display_mode_full">scaleToFill</string>
<string name="display_mode_fit">aspectFit</string>
<string name="display_mode_cut">aspectFill</string>
<string name="watermark">Watermark</string>
<string name="watermark_open">Watermark</string>
<string name="watermark_setting">Setting</string>
<string name="audio_only_push_streaming">Audio only</string>
<string name="video_only_push_streaming">Video only</string>
<string name="video_push_streaming">Default</string>
<string name="bitrate_control">Bitrate Control</string>
<string name="extern_stream_main">Main Extern Stream</string>
<string name="pause_image">Pause Image</string>
<string name="network_image">NetworkPoor Image</string>
<string name="variable_resolution">Variable Resolution</string>
<string name="auto_focus">Auto focus</string>
<string name="beauty_enable">Beauty</string>
<string name="hardware_encode">Hardware encoder</string>
<string name="software_encode">Software encoder</string>
<string name="audio_hardware_encode">Audio Hardware encoder</string>
<string name="asynchronous_interface">Asynchronous interface</string>
<string name="start_button">Start pushing</string>
<string name="start_preview_button">Start preview</string>
<string name="stop_preview_button">Stop preview</string>
<string name="pause_button">Pause</string>
<string name="resume_button">Resume</string>
<string name="stop_button">Stop pushing</string>
<string name="more_setting_button">More setting</string>
<string name="repush_button">Restart pushing</string>
<string name="slide_right_view_log_char">Slide right to view log chart</string>
<string name="slide_left_view_log">Slide left to view log</string>
<string name="share_button">Share</string>
<string name="dy_add_button">DynamicAdd</string>
<string name="dy_remove_button">DynamicRemove</string>
<string name="beauty_on">Beauty on</string>
<string name="beauty_off">Beauty off</string>
<string name="beauty_white">Whitening</string>
<string name="beauty_skin_smooth">Smooth skin</string>
<string name="beauty_ruddy">Ruddy</string>
<string name="beauty_cheekpink">CheekPink</string>
<string name="beauty_thinface">SlimFace</string>
<string name="beauty_shortenface">ShortenFace</string>
<string name="beauty_bigeye">BigEye</string>
<string name="capture">Capture</string>
<string name="render">Render</string>
<string name="encode">Encode</string>
<string name="push">Push</string>
<string name="local_log">Local log</string>
<string name="mic_volume">Mic Volume</string>
<string name="audio_fps">Audio fps</string>
<string name="video_fps">Video fps</string>
<string name="bitrate">Bitrate</string>
<string name="video_encode">Video encode</string>
<string name="audio_encode">Audio encode</string>
<string name="buffer">Buffer</string>
<string name="video_renderbuffer">Video render</string>
<string name="video_encodebuffer">Video encode</string>
<string name="video_uploadbuffer">Video upload</string>
<string name="audio_encodebuffer">Audio encode</string>
<string name="audio_uploadbuffer">Audio upload</string>
<string name="start_preview">Start preview</string>
<string name="stop_preview">Stop preview</string>
<string name="start_push">Start pushing</string>
<string name="stop_push">Stop pushing</string>
<string name="pause_push">Pause</string>
<string name="resume_push">Resume</string>
<string name="GOP">Gop</string>
<string name="push_url">Push url</string>
<string name="ispushing">Pushing</string>
<string name="publisher_log">pusher log</string>
<string name="no_camera_permission">Camera usage is not permitted, please open first</string>
<string name="no_record_bluetooth_permission">Bluetooth is not permitted to record, please open first</string>
<string name="no_record_audio_permission">Audio is not permitted to record, please open first</string>
<string name="no_read_phone_state_permission">Phone state is not permitted to read, please opend first</string>
<string name="no_write_external_storage_permission">External storage is not permitted to write, please open first</string>
<string name="no_read_external_storage_permission">External storage is not permitted to read, please open first</string>
<string name="no_read_bluetooth_connect_permission">Bluetooth connect is not permitted to read, please open first</string>
<string name="no_internet_permission">Internet is not permitted to push, please open first</string>
<string name="ok">OK</string>
<string name="success">Success</string>
<string name="failed">Failed</string>
<string name="reconnect">Reconnect</string>
<string name="packet_lost">Package lost</string>
<string name="connection_lost">Connection lost</string>
<string name="network_poor">The network is unstable, please quit or try again</string>
<string name="network_recovery">The network has recovered</string>
<string name="reconnect_start">Start reconnecting</string>
<string name="reconnect_fail">Reconnection failed</string>
<string name="connect_fail">Connection failed</string>
<string name="send_message">Send Message</string>
<string name="reconnect_success">Reconnection succeed</string>
<string name="senddata_timeout">Sending data timeout</string>
<string name="restart_success">Restart successfully</string>
<string name="bgm_open_failed">BGM File open Failed</string>
<string name="system_error">System error:</string>
<string name="sdk_error">SDK error</string>
<string name="bite_error">Bitrate setting error</string>
<string name="url_empty">Please enter url</string>
<string name="min_fps">Min fps</string>
<string name="no_music">No Music</string>
<string name="pause">Pause</string>
<string name="resume">Resume</string>
<string name="stop">Stop</string>
<string name="start">Start</string>
<string name="close_loop">Close Loop</string>
<string name="open_loop">Open Loop</string>
<string name="close_mute">Close Mute</string>
<string name="open_mute">Open Mute</string>
<string name="close_ears_back">Close Ears</string>
<string name="open_ears_back">Open Ears</string>
<string name="earphone_mode">Earphone Mode</string>
<string name="close_audio_denoise">Close Denoise</string>
<string name="open_audio_denoise">Audio Denoise</string>
<string name="open_audio_intelligent_denoise">Audio Intelligent Denoise</string>
<string name="accompaniment">Accompaniment</string>
<string name="voice">Voice</string>
<string name="internet_music">Internet music</string>
//老 demo 资源
<string name="screen_tool">Screen tool</string>
<string name="back">back</string>
<string name="privacy_on">Privacy</string>
<string name="privacy_off">Privacy Off</string>
<string name="camera_on">Camera</string>
<string name="camera_off">Camera Off</string>
<string name="mix_on">Mix</string>
<string name="mix_off">Mix Off</string>
<string name="mic_on">Mic</string>
<string name="mic_off">Mic Off</string>
<string name="screen_note">You can start other applications and start live...</string>
<string name="screen_note1">The screen function has stopped.</string>
<string name="answer">Answer</string>
<string name="auth_text">Auth Time</string>
<string name="privacy_text">Privacy Key</string>
<string name="add_dynamic_failed">Add dynamic failed, id=</string>
<string name="pull_common_enter_name_tv">Screen Sharing</string>
<string name="pull_interact_name_tv">Connect Interact</string>
<string name="pull_multi_interact_name_tv">Multi Connect Interact</string>
<string name="h5_compatible_name_tv">H5 Compatible</string>
<string name="data_channel_name_tv">Data Channel</string>
<string name="sei_send_custom_message_tv">Send Custom Message</string>
<string name="external_audio_stream_tv">External Audio Stream</string>
<string name="external_video_stream_tv">External Video Stream</string>
<string name="dual_audio_stream">Push Dual Audio</string>
<string name="screen_share_stream">Push Screen Share</string>
<string name="pull_multi_pk_name">Multi PK Interact</string>
<string name="push_enter_name_tv">Camera Pushing</string>
<string name="interact_live">Interact Live</string>
<string name="pk_live">PK Interaction</string>
<string name="interact_setting">Interact Setting</string>
<string name="push_local_video_name_tv">Stream Ingest for Video</string>
<string name="pull_rtc_enter_name_tv">Live Streaming</string>
<string name="view_string_hint_pull_url">Enter the source URL.</string>
<string name="view_string_hint_push_url">Enter the ingest URL.</string>
<string name="btn_confirm">Confirm</string>
<string name="resolution_label_desc">To enable the system to automatically switch to the most suitable resolution, you must enable adaptive bitrate streaming. For more information, see the API reference.</string>
<string name="advance_config">Advanced Settings</string>
<string name="video_label_desc">You can adjust the video bitrate and frame rate only in custom mode.</string>
<string name="auto_reconnect">Auto Reconnection</string>
<string name="input_desc">Enter</string>
<string name="mirror_desc">Mirroring</string>
<string name="camera_setting">Camera Control</string>
<string name="beauty_setting">Retouching Switch</string>
<string name="image_push">Ingest Standby Stream</string>
<string name="only_audio_or_video_push">Only Audio Or Video Stream</string>
<string name="url_auth">Url Auth Setting</string>
<string name="other_func">Other Features</string>
<string name="push_args">Stream Ingest Parameters</string>
<string name="pushing">Ingesting...</string>
<string name="wating_push">Waiting for Stream Ingest...</string>
<string name="push_orientation">Ingest To</string>
<string name="data_args">Data Metrics</string>
<string name="network_detect">Network Detect</string>
<string name="music_list">Music List</string>
<string name="local_info">Statistics on Local Videos</string>
<string name="beauty_off_tips">Retouching is disabled. Enable retouching and then retry.</string>
<string name="beauty">Retouching</string>
<string name="backgroud_music">Background Music</string>
<string name="flash">Flash</string>
<string name="camera">Camera</string>
<string name="snapshot">Snapshot</string>
<string name="cancle">Cancel</string>
<string name="restart">Retry</string>
<string name="av_resolution_music_operations">Music Operations</string>
<string name="shot_pic_toast">Screenshot saved</string>
<string name="permission_float_deny_toast">The floating window permission is required. Obtain the floating window permission and try again.</string>
<string name="permission_alert_cancel_tip">Enable Later</string>
<string name="permission_alert_submit_tip">Enable Now</string>
<string name="stream_pusher_tip">Stream Ingest Features</string>
<string name="second_rate">/Times</string>
<string name="send_frame_rate">Sent Frame Rate: </string>
<string name="send_bitrate">send Bitrate: </string>
<string name="version_desc">versionv</string>
<string name="connecting_dialog_tips">pushing_wating</string>
<string name="push_title_name">Live</string>
<string name="push_mode">Push Mode</string>
<string name="interaction_mode">Interaction Mode</string>
<string name="waiting_download_video_resources">waiting for download external video resources</string>
<string name="sound_effect_title">Sound Effect</string>
<string name="sound_effect_change_voice">Change Voice</string>
<string name="sound_effect_reverb">Reverb</string>
<string name="sound_effect_changevoice_off">Off</string>
<string name="sound_effect_changevoice_oldman">Old_man</string>
<string name="sound_effect_changevoice_babyboy">Baby_Boy</string>
<string name="sound_effect_changevoice_babygirl">Baby_Girl</string>
<string name="sound_effect_changevoice_robot">Robot</string>
<string name="sound_effect_changevoice_daimo">Daimo</string>
<string name="sound_effect_changevoice_ktv">KTV</string>
<string name="sound_effect_changevoice_echo">Echo</string>
<string name="sound_effect_reverb_off">Off</string>
<string name="sound_effect_reverb_vocal1">Vocal1</string>
<string name="sound_effect_reverb_vocal2">Vocal2</string>
<string name="sound_effect_reverb_bathroom">BathRoom</string>
<string name="sound_effect_reverb_smallroom_bright">SmallRoom(bright)</string>
<string name="sound_effect_reverb_smallroom_dark">SmallRoom(Dark)</string>
<string name="sound_effect_reverb_mediumroom">MediumRoom</string>
<string name="sound_effect_reverb_largeroom">LargeRoom</string>
<string name="sound_effect_reverb_churchhall">ChurchHall</string>
<string name="push_main_title_name">Alibaba Cloud\nMobile Streaming</string>
<string name="push_main_bottom_tip">This demo is used to demonstrate the major features of
AliLive SDK.</string>
<!-- Rts -->
<string name="pull_rts_enter_name">Rts Live Streaming</string>
<string name="pull_rts_url_title">URL</string>
<string name="pull_rts_input_hint">Please enter RTS ultra-low delay playback address</string>
<string name="pull_rts_url_generate_tip">The playback address can be generated by the address generator in the live video console</string>
<string name="pull_rts_start_play">Start playing</string>
<string name="pull_rts_play">Play</string>
<string name="pull_rts_stop">Stop</string>
<string name="pull_rts_trace_id">TraceID acquisition</string>
<string name="pull_rts_problem_title">Common Problem</string>
<string name="pull_rts_problem_playback_failed">Playback Failed</string>
<string name="pull_rts_problem_playback_failed_tip">Please go to the live video console>Toolbox>Self service problem troubleshooting, and enter the URL to locate the problem of playback failure</string>
<string name="pull_rts_problem_stuck_delay">Play stuck / high delay</string>
<string name="pull_rts_problem_stuck_delay_step1_title">step1</string>
<string name="pull_rts_problem_stuck_delay_step1">Please go to Live Video Console>Stream Management>Stream Detection to analyze whether your current streaming network environment is good (whether the frame rate or timestamp is normal)</string>
<string name="pull_rts_problem_stuck_delay_step2_title">step2</string>
<string name="pull_rts_problem_stuck_delay_step2">If your streaming network is good, please click [TraceID Acquisition] to obtain relevant information and submit a work order for help</string>
<string name="pull_rts_trace_id_copy">Copy</string>
<string name="pull_rts_trace_id_info_confirm">Confirm</string>
<string name="pull_rts_trace_id_info_close">Close</string>
<string name="pull_rts_trace_id_info_error">The network connection is not successful, and the TraceID information is not currently available</string>
<string name="pull_rts_trace_id_info_success">If you encounter problems when experiencing Demo, please submit the following information to the after-sales service in the form of work order</string>
<string name="pull_rts_trace_id_info_copy_success">Information copied</string>
<string name="pull_rts_error_demote">Demote</string>
</resources>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="log_labels">
<item>当前CPU</item>
<item>当前Memory</item>
<item>视频采集帧率:</item>
<!--<item>音频采集帧率:</item>-->
<item>音频编码码率:</item>
<item>音频编码帧率:</item>
<item>视频渲染帧率:</item>
<item>视频编码模式:</item>
<item>视频编码码率:</item>
<item>视频编码帧率:</item>
<item>视频编码总帧数:</item>
<item>视频编码总耗时:</item>
<item>视频编码器设置参数:</item>
<item>音频输出码率:</item>
<item>视频输出码率:</item>
<item>缓存音频帧总数:</item>
<item>缓存视频帧总数:</item>
<item>视频上传帧率:</item>
<item>音频上传帧率:</item>
<item>当前上传视频帧PTS</item>
<item>当前上传音频帧PTS</item>
<item>上一个视频关键帧PTS</item>
<item>缓冲区中最后一帧视频:</item>
<item>缓冲区中最后一帧音频:</item>
<item>数据上传总大小:</item>
<item>视频推流总耗时:</item>
<item>当前视频流已发送总帧数:</item>
<item>视频丢帧总数:</item>
<item>视频丢帧次数:</item>
<item>总的断网次数:</item>
<item>总的重连次数:</item>
<item>视频延迟时长:</item>
<item>音频延迟时长:</item>
<item>当前上传帧大小:</item>
<!--<item>音视频pts差异</item>-->
<!--<item>两秒内上传数据总大小:</item>-->
<item>缓冲队列中曾经最大的视频帧size</item>
<item>缓冲队列中曾经最大的音频帧size</item>
<item>待发送队列中最后一个视频包的pts</item>
<item>待发送队列中最后一个音频包的pts</item>
<item>当前发送的音视频包pts diff</item>
<item>音频编码器队列中帧缓存数:</item>
<item>视频编码器队列中帧缓存数:</item>
<item>渲染队列中帧缓存数:</item>
<item>每帧平均渲染时长:</item>
</string-array>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--sina web -->
<!-- sms login -->
</resources>

View File

@@ -0,0 +1,94 @@
<resources>
<string name="app_name">阿里云直播</string>
<string name="license_declaration">版权信息</string>
<string name="license_declaration_text">阿里云 copyright@2017阿里巴巴集团</string>
<string name="resolution_label">分辨率</string>
<string name="portrait">Portrait</string>
<string name="software_encode">软编</string>
<string name="slide_right_view_log_char">右滑查看log图表</string>
<string name="slide_left_view_log">左滑查看log</string>
<string name="share_button">分享</string>
<string name="dy_add_button">加贴纸</string>
<string name="dy_remove_button">删贴纸</string>
<string name="beauty_on">开启美颜</string>
<string name="beauty_off">关闭美颜</string>
<string name="beauty_white">美白</string>
<string name="beauty_skin_smooth">磨皮</string>
<string name="beauty_ruddy">红润</string>
<string name="beauty_cheekpink">腮红</string>
<string name="beauty_thinface">瘦脸</string>
<string name="beauty_shortenface">收下巴</string>
<string name="beauty_bigeye">大眼</string>
<string name="capture">采集</string>
<string name="render">渲染</string>
<string name="encode">编码</string>
<string name="push">推流</string>
<string name="mic_volume">麦克风音量</string>
<string name="audio_fps">各模块audio fps</string>
<string name="video_fps">各模块video fps</string>
<string name="bitrate">各模块bitrate</string>
<string name="video_encode">视频编码</string>
<string name="audio_encode">音频编码</string>
<string name="buffer">各模块buffer</string>
<string name="video_renderbuffer">视频渲染</string>
<string name="video_encodebuffer">视频编码</string>
<string name="video_uploadbuffer">视频上传</string>
<string name="audio_encodebuffer">音频编码</string>
<string name="audio_uploadbuffer">音频上传</string>
<string name="push_url">推流地址</string>
<string name="ispushing">是否推流</string>
<string name="narrowband_hd">窄带高清</string>
<string name="publisher_log">推流参数log</string>
<string name="no_camera_permission">没有权限使用摄像头,请开启摄像头权限</string>
<string name="no_record_bluetooth_permission">没有权限使用蓝牙,请开启蓝牙权限</string>
<string name="no_record_audio_permission">没有权限使用录音,请开启录音权限</string>
<string name="no_read_phone_state_permission">没有读取用户数据的权限,请开启该权限</string>
<string name="no_write_external_storage_permission">没有文件写权限,请开启该权限</string>
<string name="no_read_external_storage_permission">没有文件读权限,请开启该权限</string>
<string name="no_read_bluetooth_connect_permission">没有蓝牙连接权限,请开启该权限</string>
<string name="no_internet_permission">没有网络权限,请开启该权限</string>
<string name="bite_error">码率参数设置错误!</string>
//老 demo 资源
<string name="screen_tool">录屏工具</string>
<string name="privacy_off">隐私关</string>
<string name="camera_off">摄像头关</string>
<string name="answer">答题</string>
<string name="shot_pic_toast">截图已保存</string>
<string name="second_rate">/次</string>
<string name="send_frame_rate">发送帧率: </string>
<string name="send_bitrate">发送码率: </string>
<string name="version_desc">版本为v</string>
<string name="push_title_name">直播</string>
<string name="pull_common_enter_name_tv">录屏推流</string>
<string name="push_enter_name_tv">摄像头推流</string>
<string name="pull_common_enter_name_desc">手机屏幕采集,支持参数设置</string>
<string name="push_enter_name_desc">手机摄像头/麦克风采集,支持参数设置、基础特效</string>
<string name="push_local_video_name_tv">本地视频推流</string>
<string name="only_audio_or_video_push">纯音或纯视频流</string>
<string name="push_orientation">推流方向</string>
<string name="beauty">美颜</string>
<string name="push_main_title_name">阿里云\n移动推流</string>
<string name="push_main_bottom_tip">本Demo为用于展示阿里云移动推流sdk主要功能</string>
</resources>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="log_labels">
<item>CPU usage:</item>
<item>Memory usage:</item>
<item>Video capture fps:</item>
<!--<item>音频采集帧率:</item>-->
<item>Audio encoder bitrate:</item>
<item>Audio encoder fps:</item>
<item>Video render fps:</item>
<item>Video encoder model:</item>
<item>Video encoder bitrate:</item>
<item>Video encoder fps:</item>
<item>Total fps of video encoder:</item>
<item>Total time costs of video encoder:</item>
<item>Video encoder settings:</item>
<item>Audio output bitrate:</item>
<item>Video output bitrate:</item>
<item>Total Number of audio cache frames:</item>
<item>Total Number of video cache frames:</item>
<item>Video upload fps:</item>
<item>Audio upload fps:</item>
<item>PTS of current uploaded video frame:</item>
<item>PTS of current uploaded audio frame PTS:</item>
<item>PTS of the last video keyframe:</item>
<item>Final video frame in cache:</item>
<item>Final audio frame in cache</item>
<item>Total size of data uploaded:</item>
<item>Total time costs of pushing</item>
<item>Total number of video frames sent:</item>
<item>Total number of viedo frames dropped:</item>
<item>The times of video frames dropped:</item>
<item>Total times of network disconnected:</item>
<item>Total times of network reconnected:</item>
<item>Video delay duration:</item>
<item>Audio delay duration:</item>
<item>Size of current frame uploaded</item>
<!--<item>音视频pts差异</item>-->
<!--<item>两秒内上传数据总大小:</item>-->
<item>The max size of video frame in cache:</item>
<item>The max size of audio frame in cache:</item>
<item>The pts of last video frame which is waiting for sending:</item>
<item>The pts of last audio frame which is waiting for sending:</item>
<item>The pts difference of current frame:</item>
<item>The cache size of audio encoder:</item>
<item>The cache size of video encoder:</item>
<item>The cache size of render queue:</item>
<item>The average duration of per frame rendered:</item>
</string-array>
</resources>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="WheelView">
<attr name="wheelTextColor" format="color"/>
<attr name="wheelTextSize" format="dimension"/>
<attr name="wheelShowCount" format="integer"/>
<attr name="wheelTotalOffsetX" format="dimension"/>
<attr name="wheelItemVerticalSpace" format="dimension"/>
<attr name="wheelRotationX" format="float"/>
<attr name="wheelVelocityUnits" format="integer"/>
</declare-styleable>
<declare-styleable name="WheelMaskView">
<attr name="wheelMaskLineColor" format="color"/>
</declare-styleable>
<declare-styleable name="SegmentTabLayout">
<!-- indicator -->
<attr name="tl_indicator_color" format="color"/>
<attr name="tl_indicator_height" format="dimension"/>
<attr name="tl_indicator_margin_left" format="dimension"/>
<attr name="tl_indicator_margin_top" format="dimension"/>
<attr name="tl_indicator_margin_right" format="dimension"/>
<attr name="tl_indicator_margin_bottom" format="dimension"/>
<attr name="tl_indicator_corner_radius" format="dimension"/>
<attr name="tl_indicator_anim_enable" format="boolean"/>
<attr name="tl_indicator_anim_duration" format="integer"/>
<attr name="tl_indicator_bounce_enable" format="boolean"/>
<!-- divider -->
<attr name="tl_divider_color" format="color"/>
<attr name="tl_divider_width" format="dimension"/>
<attr name="tl_divider_padding" format="dimension"/>
<!-- tab -->
<attr name="tl_tab_padding" format="dimension"/>
<attr name="tl_tab_space_equal" format="boolean"/>
<attr name="tl_tab_width" format="dimension"/>
<!-- title -->
<attr name="tl_textsize" format="dimension"/>
<attr name="tl_textSelectColor" format="color"/>
<attr name="tl_textUnselectColor" format="color"/>
<attr name="tl_textBold" format="dimension"/>
<attr name="tl_textAllCaps" format="boolean"/>
<attr name="tl_bar_color" format="color"/>
<attr name="tl_bar_stroke_color" format="color"/>
<attr name="tl_bar_stroke_width" format="dimension"/>
</declare-styleable>
<declare-styleable name="InteractLiveRadioButton">
<attr name="ilrb_text" format="string" />
</declare-styleable>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--sina web -->
<!--sms login-->
</resources>

View File

@@ -0,0 +1,86 @@
<resources>
<string name="app_name">AlivcLive</string>
<string name="license_declaration">License declaration</string>
<string name="license_declaration_text">© 2017 Copyright by Alibaba Cloud All rights reserved</string>
<string name="software_encode">Software encode</string>
<string name="slide_right_view_log_char">Slide right to view log chart</string>
<string name="slide_left_view_log">Slide left to view log</string>
<string name="share_button">Share</string>
<string name="dy_add_button">DynamicAdd</string>
<string name="dy_remove_button">DynamicRemove</string>
<string name="beauty_on">Beauty on</string>
<string name="beauty_off">Beauty off</string>
<string name="beauty_white">Whitening</string>
<string name="beauty_skin_smooth">Smooth skin</string>
<string name="beauty_ruddy">Ruddy</string>
<string name="beauty_cheekpink">CheekPink</string>
<string name="beauty_thinface">SlimFace</string>
<string name="beauty_shortenface">ShortenFace</string>
<string name="beauty_bigeye">BigEye</string>
<string name="capture">Capture</string>
<string name="render">Render</string>
<string name="encode">Encode</string>
<string name="push">Push</string>
<string name="mic_volume">Mic Volume</string>
<string name="audio_fps">Audio fps</string>
<string name="video_fps">Video fps</string>
<string name="bitrate">Bitrate</string>
<string name="video_encode">Video encode</string>
<string name="audio_encode">Audio encode</string>
<string name="buffer">Buffer</string>
<string name="video_renderbuffer">Video render</string>
<string name="video_encodebuffer">Video encode</string>
<string name="video_uploadbuffer">Video upload</string>
<string name="audio_encodebuffer">Audio encode</string>
<string name="audio_uploadbuffer">Audio upload</string>
<string name="push_url">Push url</string>
<string name="publisher_log">pusher log</string>
<string name="no_camera_permission">Camera usage is not permitted, please open first</string>
<string name="no_record_bluetooth_permission">Bluetooth is not permitted to record, please open first</string>
<string name="no_record_audio_permission">Audio is not permitted to record, please open first</string>
<string name="no_read_phone_state_permission">Phone state is not permitted to read, please opend first</string>
<string name="no_write_external_storage_permission">External storage is not permitted to write, please open first</string>
<string name="no_read_external_storage_permission">External storage is not permitted to read, please open first</string>
<string name="no_read_bluetooth_connect_permission">Bluetooth connect is not permitted to read, please open first</string>
<string name="no_internet_permission">Internet is not permitted to push, please open first</string>
<string name="bite_error">Bitrate setting error</string>
<string name="close_audio_denoise">Close Denoise</string>
//老 demo 资源
<string name="screen_tool">Screen tool</string>
<string name="privacy_off">Privacy Off</string>
<string name="camera_off">Camera Off</string>
<string name="answer">Answer</string>
<string name="pull_common_enter_name_tv">Stream Ingest for Screen Recording</string>
<string name="pull_common_enter_name_desc">Streams are collected from your screen. You can configure the parameters.</string>
<string name="push_enter_name_tv">Stream Ingest for Camera</string>
<string name="push_enter_name_desc">Streams are collected from your cameras and microphone. You can configure the parameters and basic effects.</string>
<string name="push_local_video_name_tv">Stream Ingest for Video</string>
<string name="only_audio_or_video_push">Only Audio Or Video Stream</string>
<string name="ispushing">Pushing</string>
<string name="beauty">Retouching</string>
<string name="shot_pic_toast">Screenshot saved</string>
<string name="second_rate">/Times</string>
<string name="send_frame_rate">Sent Frame Rate</string>
<string name="send_bitrate">send Bitrate</string>
<string name="version_desc">versionv</string>
<string name="push_title_name">Live</string>
<string name="push_main_title_name">阿里云\n移动推流</string>
<string name="push_main_bottom_tip">本Demo为用于展示阿里云移动推流sdk主要功能</string>
<string name="live_push_aliyun_sdk_privacy"><a href='https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112151438_20307.html?spm=a2c4g.11186623.0.0.10c739ebi5cK2M'><font color='#888888'>阿里云视频服务隐私权政策</font></a></string>
</resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" tools:ignore="ResourceName">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>