Merge branch 'dev_play_model_exo'
This commit is contained in:
commit
55f3ac577b
@ -28,6 +28,8 @@ public class EnterRoomNewModel extends BaseModel {
|
||||
private String isUseHotCard = "";//是否使用热度卡
|
||||
@SerializedName("liveRoomActivity")
|
||||
private List<LiveRoomActivityModel> liveRoomActivityModels = new ArrayList<>();//活动列表
|
||||
@SerializedName("clarityType")
|
||||
private int clarityType;
|
||||
|
||||
public List<LiveRoomActivityModel> getLiveRoomActivityModels() {
|
||||
return liveRoomActivityModels;
|
||||
@ -109,4 +111,12 @@ public class EnterRoomNewModel extends BaseModel {
|
||||
this.isUseHotCard = isUseHotCard;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getClarityType() {
|
||||
return clarityType;
|
||||
}
|
||||
|
||||
public void setClarityType(int clarityType) {
|
||||
this.clarityType = clarityType;
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.text.Spanned;
|
||||
@ -68,6 +70,20 @@ public class DialogUitl {
|
||||
}
|
||||
return dialog;
|
||||
}
|
||||
public static void showToast(Context context,String content,long delayMillis){
|
||||
Dialog dialog = new Dialog(context, R.style.dialog);
|
||||
dialog.setContentView(R.layout.dialog_toast);
|
||||
dialog.setCancelable(false);
|
||||
dialog.setCanceledOnTouchOutside(false);
|
||||
if (!TextUtils.isEmpty(content)) {
|
||||
TextView titleView = (TextView) dialog.findViewById(R.id.text);
|
||||
if (titleView != null) {
|
||||
titleView.setText(content);
|
||||
}
|
||||
}
|
||||
dialog.show();
|
||||
new Handler(Looper.getMainLooper()).postDelayed(dialog::dismiss,delayMillis);
|
||||
}
|
||||
|
||||
|
||||
public static Dialog loadingDialog(Context context) {
|
||||
@ -494,8 +510,12 @@ public class DialogUitl {
|
||||
}
|
||||
}
|
||||
};
|
||||
if(btnConfirm!=null) {
|
||||
btnConfirm.setOnClickListener(listener);
|
||||
}
|
||||
if(btnCancel!=null) {
|
||||
btnCancel.setOnClickListener(listener);
|
||||
}
|
||||
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
||||
@Override
|
||||
public void onShow(DialogInterface dialogInterface) {
|
||||
|
@ -127,8 +127,10 @@ public class CustomDrawerPopupView extends DrawerPopupView {
|
||||
ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.system_notice), new ViewClicksAntiShake.ViewClicksCallBack() {
|
||||
@Override
|
||||
public void onViewClicks() {
|
||||
// dismiss();
|
||||
|
||||
dismiss();
|
||||
if (callBack != null) {
|
||||
callBack.systemNotice();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -2,26 +2,47 @@ package com.yunbao.common.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.lxj.xpopup.core.BottomPopupView;
|
||||
import com.yunbao.common.R;
|
||||
import com.yunbao.common.utils.ToastUtil;
|
||||
import com.yunbao.common.views.weight.ViewClicksAntiShake;
|
||||
|
||||
public class LiveClarityCustomPopup extends BottomPopupView implements View.OnClickListener {
|
||||
public static final int BAN_720 = 1;
|
||||
public static final int BAN_1080 = 2;
|
||||
private int selectClarity = 1;
|
||||
private RelativeLayout lineSd, lineHd, lineFhd;
|
||||
private ImageView iconSd, iconHd, iconFhd;
|
||||
private ImageView titleSDImg, titleHDImg, titleFHDImg;
|
||||
private TextView titleSDText, titleHDText, titleFHDText;
|
||||
private int banSelect;
|
||||
|
||||
public int getSelectClarity() {
|
||||
return selectClarity;
|
||||
}
|
||||
|
||||
public LiveClarityCustomPopup(@NonNull Context context, int selectClarity, int banSelect) {
|
||||
super(context);
|
||||
this.banSelect = banSelect;
|
||||
if (selectClarity == -1) {
|
||||
selectClarity = 0;
|
||||
}
|
||||
this.selectClarity = selectClarity;
|
||||
}
|
||||
|
||||
public LiveClarityCustomPopup(@NonNull Context context, int selectClarity) {
|
||||
super(context);
|
||||
if (selectClarity == -1) {
|
||||
selectClarity = 0;
|
||||
}
|
||||
this.selectClarity = selectClarity;
|
||||
}
|
||||
|
||||
@ -55,6 +76,12 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl
|
||||
iconSd = findViewById(R.id.icon_sd);
|
||||
iconHd = findViewById(R.id.icon_hd);
|
||||
iconFhd = findViewById(R.id.icon_fhd);
|
||||
titleSDImg = findViewById(R.id.sd);
|
||||
titleHDImg = findViewById(R.id.hd);
|
||||
titleFHDImg = findViewById(R.id.fhd);
|
||||
titleSDText = findViewById(R.id.sd_text);
|
||||
titleHDText = findViewById(R.id.hd_text);
|
||||
titleFHDText = findViewById(R.id.fhd_text);
|
||||
selectClarity(selectClarity);
|
||||
//流畅
|
||||
ViewClicksAntiShake.clicksAntiShake(lineSd, () -> {
|
||||
@ -75,6 +102,18 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl
|
||||
selectClarity(selectClarity);
|
||||
dismiss();
|
||||
});
|
||||
if (banSelect == BAN_720) {
|
||||
lineFhd.setEnabled(false);
|
||||
lineHd.setEnabled(false);
|
||||
titleHDImg.setImageAlpha(40);
|
||||
titleFHDImg.setImageAlpha(40);
|
||||
titleHDText.setAlpha(0.2f);
|
||||
titleFHDText.setAlpha(0.2f);
|
||||
} else if (banSelect == BAN_1080) {
|
||||
lineFhd.setEnabled(false);
|
||||
titleFHDText.setAlpha(0.2f);
|
||||
titleFHDImg.setImageAlpha(20);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,6 +41,7 @@
|
||||
android:src="@mipmap/icon_sd" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sd_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/sd"
|
||||
@ -79,6 +80,7 @@
|
||||
android:src="@mipmap/icon_hd" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hd_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/hd"
|
||||
@ -116,6 +118,7 @@
|
||||
android:src="@mipmap/icon_fhd" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/fhd_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/fhd"
|
||||
|
18
common/src/main/res/layout/dialog_toast.xml
Normal file
18
common/src/main/res/layout/dialog_toast.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_loading_dialog"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:text="@string/loading"
|
||||
android:textColor="@color/white"
|
||||
android:layout_margin="15dp"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
@ -1 +1 @@
|
||||
apply plugin: 'com.android.library'
apply plugin: 'img-optimizer'
apply plugin: 'kotlin-android'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
packagingOptions {
pickFirst "lib/armeabi/libyuvutils.so"
pickFirst "lib/arm64-v8a/libyuvutils.so"
pickFirst "lib/armeabi-v7a/libyuvutils.so"
pickFirst "lib/armeabi/libyuvtools.so"
pickFirst "lib/arm64-v8a/libyuvtools.so"
pickFirst "lib/armeabi-v7a/libyuvtools.so"
exclude "lib/arm64-v8a/libmmcv_api_handgesture.so"
exclude "lib/arm64-v8a/libmmcv_api_express.so"
exclude "lib/arm64-v8a/libMediaEncoder.so"
exclude "lib/arm64-v8a/libarcore_sdk_c.so"
exclude "lib/arm64-v8a/libmediadecoder.so"
exclude "lib/arm64-v8a/libMediaMuxer.so"
exclude "lib/arm64-v8a/libarcore_sdk_jni.so"
exclude "lib/arm64-v8a/libMediaUtils.so"
exclude "lib/arm64-v8a/libcosmosffmpeg.so"
}
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
manifestPlaceholders = rootProject.ext.manifestPlaceholders
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
kotlinOptions {
allWarningsAsErrors = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
flatDir {
dirs 'libs', '../libs'
}
mavenCentral()
}
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation (name:'../libs/beautysdk-202202241203',ext:'aar')
implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar')
//socket.io
implementation('io.socket:socket.io-client:1.0.0') {
exclude group: 'org.json', module: 'json'
}
//common
api project(path: ':common')
api project(path:':FaceUnity')//新娱美颜
annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
//工具
api rootProject.ext.dependencies["blank-utilcode"]
implementation 'com.eightbitlab:blurview:1.6.6'
implementation 'com.google.code.gson:gson:2.8.6'
implementation "com.getkeepsafe.relinker:relinker:1.4.4"
}
|
||||
apply plugin: 'com.android.library'
apply plugin: 'img-optimizer'
apply plugin: 'kotlin-android'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
packagingOptions {
pickFirst "lib/armeabi/libyuvutils.so"
pickFirst "lib/arm64-v8a/libyuvutils.so"
pickFirst "lib/armeabi-v7a/libyuvutils.so"
pickFirst "lib/armeabi/libyuvtools.so"
pickFirst "lib/arm64-v8a/libyuvtools.so"
pickFirst "lib/armeabi-v7a/libyuvtools.so"
exclude "lib/arm64-v8a/libmmcv_api_handgesture.so"
exclude "lib/arm64-v8a/libmmcv_api_express.so"
exclude "lib/arm64-v8a/libMediaEncoder.so"
exclude "lib/arm64-v8a/libarcore_sdk_c.so"
exclude "lib/arm64-v8a/libmediadecoder.so"
exclude "lib/arm64-v8a/libMediaMuxer.so"
exclude "lib/arm64-v8a/libarcore_sdk_jni.so"
exclude "lib/arm64-v8a/libMediaUtils.so"
exclude "lib/arm64-v8a/libcosmosffmpeg.so"
}
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
manifestPlaceholders = rootProject.ext.manifestPlaceholders
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
kotlinOptions {
allWarningsAsErrors = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
flatDir {
dirs 'libs', '../libs'
}
mavenCentral()
}
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation (name:'../libs/beautysdk-202202241203',ext:'aar')
implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar')
//socket.io
implementation('io.socket:socket.io-client:1.0.0') {
exclude group: 'org.json', module: 'json'
}
//common
api project(path: ':common')
api project(path:':FaceUnity')//新娱美颜
annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
//工具
api rootProject.ext.dependencies["blank-utilcode"]
implementation 'com.eightbitlab:blurview:1.6.6'
implementation 'com.google.code.gson:gson:2.8.6'
implementation "com.getkeepsafe.relinker:relinker:1.4.4"
//ExoPlayer,腾讯的播放器不支持无缝切换
implementation 'com.google.android.exoplayer:exoplayer:2.18.2'
implementation 'com.google.android.exoplayer:exoplayer-core:2.18.2@aar'
}
|
@ -864,7 +864,7 @@ public class LiveAudienceActivity extends LiveActivity {
|
||||
public void systemNotice() {
|
||||
Bus.get().post(new LiveAudienceEvent()
|
||||
.setBean(mLiveBean)
|
||||
.setType(LiveAudienceEvent.LiveAudienceType.NOTICE));
|
||||
.setType(LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -115,7 +115,7 @@ public class FreePkRecyclerAdapter extends RefreshAdapter<RandomPkUserBean> {
|
||||
}
|
||||
if (freePkNum == 0 && mDrPkNum == -1) {
|
||||
ToastUtil.show(R.string.free_pk_num_null);
|
||||
return;
|
||||
// return;
|
||||
}
|
||||
|
||||
LiveHttpUtil.getMicList(LiveRyAnchorActivity.mLiveUid, 0, new com.yunbao.common.http.HttpCallback() {
|
||||
|
@ -256,7 +256,8 @@ public class LiveAudienceEvent extends BaseModel {
|
||||
UP_PK_TWO(51, "PK头像信息"),
|
||||
CUSTOM_FULL_SERVICE_NOTIFY(51, "全服通知"),
|
||||
CHANGE_VIEW(52, "更改连胜位置"),
|
||||
UPDATA_ROBOT(53, "更新机器人消息");
|
||||
UPDATA_ROBOT(53, "更新机器人消息"),
|
||||
LIVE_VIDEO(54, "画质选择");
|
||||
|
||||
private int type;
|
||||
private String name;
|
||||
|
@ -0,0 +1,268 @@
|
||||
package com.yunbao.live.utils;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.view.SurfaceView;
|
||||
|
||||
import com.google.android.exoplayer2.ExoPlayer;
|
||||
import com.google.android.exoplayer2.MediaItem;
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.analytics.AnalyticsListener;
|
||||
import com.google.android.exoplayer2.analytics.PlaybackStats;
|
||||
import com.google.android.exoplayer2.analytics.PlaybackStatsListener;
|
||||
import com.google.android.exoplayer2.video.VideoSize;
|
||||
|
||||
/**
|
||||
* 直播间播放器管理器
|
||||
* 通过预加载子播放器来实现无缝切换分辨率功能
|
||||
*/
|
||||
public class LiveExoPlayerManager {
|
||||
private final int MODEL_PLAY1 = 0;//当前主播放器
|
||||
private final int MODEL_PLAY2 = 1;//当前子播放器
|
||||
private Context mContext;
|
||||
private ExoPlayer player1, player2;
|
||||
private SurfaceView mainView;//渲染视图
|
||||
private int status = MODEL_PLAY1;
|
||||
private Player.Listener listener;
|
||||
private boolean isSwitchUrl = false;//是否为主动切换播放器
|
||||
private String TAG = "播放";
|
||||
private int playBufferIndex = 0;//卡顿计数器
|
||||
private Handler handler;
|
||||
|
||||
public LiveExoPlayerManager(Context mContext) {
|
||||
this.mContext = mContext;
|
||||
player1 = new ExoPlayer.Builder(mContext).build();
|
||||
player2 = new ExoPlayer.Builder(mContext).build();
|
||||
handler = new Handler(Looper.getMainLooper());
|
||||
setListener();
|
||||
setAnalyticsListener();
|
||||
}
|
||||
|
||||
public void setListener(Player.Listener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public void setMainView(SurfaceView mainView) {
|
||||
this.mainView = mainView;
|
||||
}
|
||||
|
||||
private void setAnalyticsListener() {
|
||||
player1.addAnalyticsListener(new AnalyticsListener() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(
|
||||
EventTime eventTime, int state) {
|
||||
Log.d(TAG, "onPlaybackStateChanged(1) called with: eventTime = [" + eventTime + "], state = [" + state + "]");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDroppedVideoFrames(
|
||||
EventTime eventTime, int droppedFrames, long elapsedMs) {
|
||||
Log.d(TAG, "onDroppedVideoFrames(1) called with: eventTime = [" + eventTime + "], droppedFrames = [" + droppedFrames + "], elapsedMs = [" + elapsedMs + "]");
|
||||
}
|
||||
});
|
||||
|
||||
player2.addAnalyticsListener(new AnalyticsListener() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(
|
||||
EventTime eventTime, int state) {
|
||||
Log.d(TAG, "onPlaybackStateChanged(2) called with: eventTime = [" + eventTime.totalBufferedDurationMs + "], state = [" + state + "]");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDroppedVideoFrames(
|
||||
EventTime eventTime, int droppedFrames, long elapsedMs) {
|
||||
Log.d(TAG, "onDroppedVideoFrames(2) called with: eventTime = [" + eventTime + "], droppedFrames = [" + droppedFrames + "], elapsedMs = [" + elapsedMs + "]");
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 延迟1秒还未恢复播放则认为卡顿了,可以切分辨率了
|
||||
*/
|
||||
private Runnable buffRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
playBufferIndex = 0;
|
||||
listener.onPlaybackStateChanged(Player.STATE_BUFFERING);
|
||||
}
|
||||
};
|
||||
|
||||
private void setListener() {
|
||||
player1.addListener(new Player.Listener() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(int playbackState) {
|
||||
Player.Listener.super.onPlaybackStateChanged(playbackState);
|
||||
Log.i(TAG, "onPlaybackStateChanged 1: " + playbackState);
|
||||
if (playbackState == Player.STATE_READY) {
|
||||
player2.stop();
|
||||
player2.setVideoSurface(null);
|
||||
player1.play();
|
||||
Log.i(TAG, "切换播放器1");
|
||||
handler.removeCallbacks(buffRunnable);
|
||||
playBufferIndex = 0;
|
||||
} else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY1 && !isSwitchUrl) {
|
||||
if (listener != null) {
|
||||
if (playBufferIndex++ == 0) {
|
||||
handler.postDelayed(buffRunnable, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsPlayingChanged(boolean isPlaying) {
|
||||
Player.Listener.super.onIsPlayingChanged(isPlaying);
|
||||
if (isPlaying) {
|
||||
Log.i(TAG, "onIsPlayingChanged1: 播放了");
|
||||
player1.setVideoSurfaceView(mainView);
|
||||
status = MODEL_PLAY1;
|
||||
isSwitchUrl = false;
|
||||
if (listener != null) {
|
||||
listener.onIsPlayingChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(VideoSize videoSize) {
|
||||
Player.Listener.super.onVideoSizeChanged(videoSize);
|
||||
if (listener != null) {
|
||||
listener.onVideoSizeChanged(videoSize);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsLoadingChanged(boolean isLoading) {
|
||||
Player.Listener.super.onIsLoadingChanged(isLoading);
|
||||
Log.i(TAG, "onIsLoadingChanged: 1 " + isLoading);
|
||||
}
|
||||
});
|
||||
|
||||
player2.addListener(new Player.Listener() {
|
||||
@Override
|
||||
public void onPlaybackStateChanged(int playbackState) {
|
||||
Player.Listener.super.onPlaybackStateChanged(playbackState);
|
||||
Log.i(TAG, "onPlaybackStateChanged 2: " + playbackState);
|
||||
if (playbackState == Player.STATE_READY) {
|
||||
player1.stop();
|
||||
player1.setVideoSurface(null);
|
||||
player2.play();
|
||||
Log.i(TAG, "切换播放器2 " + player2.isPlaying());
|
||||
handler.removeCallbacks(buffRunnable);
|
||||
playBufferIndex = 0;
|
||||
} else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY2 && !isSwitchUrl) {
|
||||
if (listener != null) {
|
||||
if (playBufferIndex++ == 0) {
|
||||
handler.postDelayed(buffRunnable, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsPlayingChanged(boolean isPlaying) {
|
||||
Player.Listener.super.onIsPlayingChanged(isPlaying);
|
||||
if (isPlaying) {
|
||||
Log.i(TAG, "onIsPlayingChanged2: 播放了");
|
||||
player2.setVideoSurfaceView(mainView);
|
||||
status = MODEL_PLAY2;
|
||||
isSwitchUrl = false;
|
||||
if (listener != null) {
|
||||
listener.onIsPlayingChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(VideoSize videoSize) {
|
||||
Player.Listener.super.onVideoSizeChanged(videoSize);
|
||||
if (listener != null) {
|
||||
listener.onVideoSizeChanged(videoSize);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsLoadingChanged(boolean isLoading) {
|
||||
Player.Listener.super.onIsLoadingChanged(isLoading);
|
||||
Log.i(TAG, "onIsLoadingChanged: 2 " + isLoading);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始播放
|
||||
*
|
||||
* @param url 地址
|
||||
*/
|
||||
public void startUrl(String url) {
|
||||
isSwitchUrl = true;
|
||||
playBufferIndex = 0;
|
||||
getNowPlayer().setVideoSurfaceView(mainView);
|
||||
getNowPlayer().setMediaItem(createMediaItem(url));
|
||||
getNowPlayer().prepare();
|
||||
getNowPlayer().play();
|
||||
}
|
||||
|
||||
/**
|
||||
* 无缝切换
|
||||
*
|
||||
* @param url 地址
|
||||
*/
|
||||
public void switchUrl(String url) {
|
||||
Log.i(TAG, "switchUrl: " + url);
|
||||
playBufferIndex = 0;
|
||||
isSwitchUrl = true;
|
||||
getNextPlayer().setMediaItem(createMediaItem(url));
|
||||
getNextPlayer().prepare();
|
||||
}
|
||||
|
||||
private MediaItem createMediaItem(String url) {
|
||||
return MediaItem.fromUri(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前播放器
|
||||
*/
|
||||
public ExoPlayer getNowPlayer() {
|
||||
return status == MODEL_PLAY1 ? player1 : player2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取下一个播放器。
|
||||
*/
|
||||
private ExoPlayer getNextPlayer() {
|
||||
return status == MODEL_PLAY1 ? player2 : player1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否正在播放
|
||||
*/
|
||||
public boolean isPlaying() {
|
||||
return getNowPlayer().isPlaying();
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止播放
|
||||
*/
|
||||
public void stop() {
|
||||
getNowPlayer().stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始播放
|
||||
*/
|
||||
public void play() {
|
||||
getNowPlayer().play();
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放播放器
|
||||
*/
|
||||
public void release() {
|
||||
player1.release();
|
||||
player2.release();
|
||||
}
|
||||
}
|
@ -128,7 +128,7 @@ public class LivePlayKsyViewHolder extends LiveRoomPlayViewHolder {
|
||||
* @param url 流地址
|
||||
*/
|
||||
@Override
|
||||
public void play(String url) {
|
||||
public void play(String url,int playModel) {
|
||||
mPlayer = new V2TXLivePlayerImpl(mContext);
|
||||
|
||||
if (TextUtils.isEmpty(url) || mVideoView == null) {
|
||||
@ -142,6 +142,11 @@ public class LivePlayKsyViewHolder extends LiveRoomPlayViewHolder {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void switchStream(String url, int playModel) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
|
@ -6,15 +6,14 @@ import static cn.rongcloud.rtc.core.RendererCommon.ScalingType.SCALE_ASPECT_FILL
|
||||
import android.Manifest;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
@ -23,19 +22,22 @@ import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.android.exoplayer2.MediaItem;
|
||||
import com.google.android.exoplayer2.PlaybackException;
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.Timeline;
|
||||
import com.google.android.exoplayer2.Tracks;
|
||||
import com.google.android.exoplayer2.video.VideoSize;
|
||||
import com.lxj.xpopup.XPopup;
|
||||
import com.lxj.xpopup.core.BasePopupView;
|
||||
import com.lxj.xpopup.interfaces.XPopupCallback;
|
||||
import com.lzf.easyfloat.EasyFloat;
|
||||
import com.lzy.okserver.OkDownload;
|
||||
import com.lzy.okserver.download.DownloadTask;
|
||||
import com.tencent.live2.V2TXLiveDef;
|
||||
import com.tencent.live2.V2TXLivePlayer;
|
||||
import com.tencent.live2.V2TXLivePlayerObserver;
|
||||
import com.tencent.live2.impl.V2TXLivePlayerImpl;
|
||||
import com.tencent.rtmp.ui.TXCloudVideoView;
|
||||
import com.yunbao.common.bean.CrashSaveBean;
|
||||
import com.yunbao.common.http.HttpCallback;
|
||||
import com.yunbao.common.http.HttpClient;
|
||||
import com.yunbao.common.utils.DeviceUtils;
|
||||
import com.yunbao.common.utils.Bus;
|
||||
import com.yunbao.common.utils.DialogUitl;
|
||||
import com.yunbao.common.utils.DpUtil;
|
||||
import com.yunbao.common.utils.L;
|
||||
@ -43,9 +45,12 @@ import com.yunbao.common.utils.MicStatusManager;
|
||||
import com.yunbao.common.utils.ScreenDimenUtil;
|
||||
import com.yunbao.common.utils.ToastUtil;
|
||||
import com.yunbao.common.utils.WordUtil;
|
||||
import com.yunbao.common.views.LiveClarityCustomPopup;
|
||||
import com.yunbao.live.R;
|
||||
import com.yunbao.live.activity.LiveActivity;
|
||||
import com.yunbao.live.activity.LiveAudienceActivity;
|
||||
import com.yunbao.live.event.LiveAudienceEvent;
|
||||
import com.yunbao.live.utils.LiveExoPlayerManager;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
@ -56,7 +61,6 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import cn.rongcloud.rtc.api.RCRTCEngine;
|
||||
import cn.rongcloud.rtc.api.RCRTCRemoteUser;
|
||||
@ -89,7 +93,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
private ViewGroup mLeftContainer;
|
||||
private ViewGroup mRightContainer;
|
||||
private RelativeLayout mPkContainer;
|
||||
public static TXCloudVideoView mVideoView;
|
||||
public static SurfaceView mVideoView;
|
||||
|
||||
private View mLoading, mLoading2;
|
||||
private ImageView mCover;
|
||||
@ -101,20 +105,19 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
private boolean mPausedPlay;//是否被动暂停了播放
|
||||
public int landscape; //1h 2s
|
||||
public static Context contexts;
|
||||
public V2TXLivePlayer mPlayer;
|
||||
public static FrameLayout ry_view;
|
||||
|
||||
private static final int VIDEO_VERTICAL = 1;
|
||||
private static final int VIDEO_HORIZONTAL = 2;
|
||||
int videoLandscape; // 视频方向,1=竖屏,2=横屏
|
||||
private static final int VIDEO_VERTICAL = 2;
|
||||
private static final int VIDEO_HORIZONTAL = 1;
|
||||
int videoLandscape = -1; // 视频方向,2=竖屏,1=横屏
|
||||
|
||||
static int vHeight;//视频高
|
||||
private TextView debugView;
|
||||
|
||||
private LiveExoPlayerManager mPlayer;
|
||||
|
||||
//0未申请1申请中2连麦中
|
||||
RCRTCRoom rcrtcRoom;
|
||||
String purl;
|
||||
String purl, srcUrl;
|
||||
|
||||
public int getLandscape() {
|
||||
return landscape;
|
||||
@ -136,12 +139,13 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
@Override
|
||||
public void init() {
|
||||
EventBus.getDefault().register(this);
|
||||
Bus.getOn(this);
|
||||
mRoot = (ViewGroup) findViewById(R.id.root);
|
||||
mSmallContainer = (ViewGroup) findViewById(R.id.small_container);
|
||||
mLeftContainer = (ViewGroup) findViewById(R.id.left_container);
|
||||
mRightContainer = (ViewGroup) findViewById(R.id.right_container);
|
||||
mPkContainer = (RelativeLayout) findViewById(R.id.pk_container);
|
||||
mVideoView = (TXCloudVideoView) findViewById(R.id.video_view);
|
||||
mVideoView = (SurfaceView) findViewById(R.id.video_view);
|
||||
ry_view = (FrameLayout) findViewById(R.id.ry_view);
|
||||
leave = (ImageView) findViewById(R.id.leave);
|
||||
mLoading = findViewById(R.id.loading);
|
||||
@ -154,9 +158,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mPkContainer.getLayoutParams();
|
||||
params.height = vHeight;
|
||||
mPkContainer.requestLayout();
|
||||
mPlayer = new V2TXLivePlayerImpl(mContext);
|
||||
mPlayer.setRenderView(mVideoView);
|
||||
|
||||
mPlayer = new LiveExoPlayerManager(mContext);
|
||||
mPlayer.setMainView(mVideoView);
|
||||
mPlayer.setListener(new ExoPlayerListener());
|
||||
debugView = new TextView(mContext);
|
||||
debugView.setBackgroundColor(Color.WHITE);
|
||||
|
||||
@ -193,6 +198,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
@Override
|
||||
public synchronized void setLiveBeanLandscape(int landscape) {
|
||||
this.landscape = landscape;
|
||||
this.videoLandscape = landscape;
|
||||
if (landscape == 2) {
|
||||
Log.i("收到socket--->", "还原9:16");
|
||||
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams();
|
||||
@ -247,13 +253,12 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
*/
|
||||
@Override
|
||||
public void resumePlay() {
|
||||
if (mPlayer.isPlaying() != 1) {
|
||||
if (!mPlayer.isPlaying()) {
|
||||
new Handler(Looper.getMainLooper())
|
||||
.postDelayed(() -> {
|
||||
mPlayer.stopPlay();
|
||||
int val = mPlayer.startPlay(purl);
|
||||
mPlayer.stop();
|
||||
mPlayer.play();
|
||||
// ToastUtil.show("强制播放" + val);
|
||||
Log.i(TAG, "强制播放: " + val);
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
@ -264,7 +269,44 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
* @param url 流地址
|
||||
*/
|
||||
@Override
|
||||
public void play(String url) {
|
||||
public void play(String url, int playModel) {
|
||||
srcUrl = url;
|
||||
PLAY_MODEL = playModel;
|
||||
if (playModel != PLAY_MODEL_DEF) {
|
||||
if (videoLandscape == VIDEO_VERTICAL) {
|
||||
url = url.replace(".flv", videoRatioVertical[playModel] + videoFps[0] + ".flv");
|
||||
} else if (videoLandscape == VIDEO_HORIZONTAL) {
|
||||
url = url.replace(".flv", videoRatioHorizontal[playModel] + videoFps[0] + ".flv");
|
||||
}
|
||||
}
|
||||
Log.e("purl121", url);
|
||||
|
||||
if (TextUtils.isEmpty(url) || mVideoView == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(url) || mVideoView == null) {
|
||||
return;
|
||||
}
|
||||
if (mPlayer.isPlaying()) {
|
||||
mPlayer.stop();
|
||||
}
|
||||
mPlayer.startUrl(url);
|
||||
purl = url;
|
||||
onPrepared();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void switchStream(String url, int playModel) {
|
||||
srcUrl = url;
|
||||
PLAY_MODEL = playModel;
|
||||
if (playModel != PLAY_MODEL_DEF) {
|
||||
if (videoLandscape == VIDEO_VERTICAL) {
|
||||
url = url.replace(".flv", videoRatioVertical[playModel] + videoFps[0] + ".flv");
|
||||
} else if (videoLandscape == VIDEO_HORIZONTAL) {
|
||||
url = url.replace(".flv", videoRatioHorizontal[playModel] + videoFps[0] + ".flv");
|
||||
}
|
||||
}
|
||||
Log.e("purl121", url);
|
||||
|
||||
if (TextUtils.isEmpty(url) || mVideoView == null) {
|
||||
@ -275,140 +317,26 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
if (TextUtils.isEmpty(url) || mVideoView == null) {
|
||||
return;
|
||||
}
|
||||
mVideoView.clearLastFrame(true);
|
||||
mPlayer.setObserver(new V2TXLivePlayerObserver() {
|
||||
String TAG = "播放流";
|
||||
|
||||
@Override
|
||||
public void onError(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) {
|
||||
super.onError(player, code, msg, extraInfo);
|
||||
Log.i(TAG, "onError: player = " + player + ", code = " + code + ", msg = " + msg + ", extraInfo = " + extraInfo);
|
||||
debugView.setText("播放出错code=" + code + " msg=" + msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWarning(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) {
|
||||
super.onWarning(player, code, msg, extraInfo);
|
||||
Log.i(TAG, "onWarning: " + "player = " + player + ", code = " + code + ", msg = " + msg + ", extraInfo = " + extraInfo);
|
||||
if (code == 2105) {
|
||||
// mPlayer.resumeVideo();
|
||||
// mPlayer.resumeAudio();
|
||||
mPlayer.stopPlay();
|
||||
mPlayer.startPlay(purl);
|
||||
}
|
||||
debugView.setText("播放警告code=" + code + " msg=" + msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) {
|
||||
super.onVideoPlayStatusUpdate(player, status, reason, extraInfo);
|
||||
//Log.i(TAG, "onVideoPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAudioPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) {
|
||||
super.onAudioPlayStatusUpdate(player, status, reason, extraInfo);
|
||||
//Log.i(TAG, "onAudioPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayoutVolumeUpdate(V2TXLivePlayer player, int volume) {
|
||||
super.onPlayoutVolumeUpdate(player, volume);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatisticsUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayerStatistics statistics) {
|
||||
super.onStatisticsUpdate(player, statistics);
|
||||
Map<String, DownloadTask> taskMap = OkDownload.getInstance().getTaskMap();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
buffer.append("|");
|
||||
for (String key : taskMap.keySet()) {
|
||||
DownloadTask task = taskMap.get(key);
|
||||
buffer.append(task.progress.fileName).append(":");
|
||||
int status = task.progress.status;
|
||||
switch (status) {
|
||||
case 0:
|
||||
buffer.append("无状态");
|
||||
break;
|
||||
case 1:
|
||||
buffer.append("等待");
|
||||
break;
|
||||
case 2:
|
||||
buffer.append("下载中:").append(task.progress.fraction);
|
||||
break;
|
||||
case 3:
|
||||
buffer.append("暂停");
|
||||
break;
|
||||
case 4:
|
||||
buffer.append("错误");
|
||||
break;
|
||||
case 5:
|
||||
buffer.append("完成");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
buffer.append("|");
|
||||
}
|
||||
hideCover();
|
||||
String debugText = "视频码率:" + statistics.videoBitrate + "\n" +
|
||||
"音频码率:" + statistics.audioBitrate + "\n" +
|
||||
"FPS:" + statistics.fps + "\n" +
|
||||
"CPU:" + statistics.appCpu + "\n" +
|
||||
"剩余内存:" + DeviceUtils.getMemory(mContext) + "\n" +
|
||||
"分辨率:" + statistics.height + "x" + statistics.width + "\n" +
|
||||
"播放状态:" + mPlayer.isPlaying() + "\n" +
|
||||
"运行时间:" + (System.currentTimeMillis() - CrashSaveBean.getInstance().getStartTime()) / 1000 + "\n";
|
||||
debugView.setText(debugText);
|
||||
Log.i(TAG, "onStatisticsUpdate: " + JSON.toJSONString(statistics) + " |当前下载数 : " + OkDownload.getInstance().getTaskMap().size() + buffer);
|
||||
if (statistics.height > statistics.width) {
|
||||
videoLandscape = VIDEO_VERTICAL;
|
||||
} else {
|
||||
videoLandscape = VIDEO_HORIZONTAL;
|
||||
}
|
||||
if (statistics.fps == 0) {
|
||||
OkDownload.getInstance().pauseAll();
|
||||
} else {
|
||||
OkDownload.getInstance().startAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSnapshotComplete(V2TXLivePlayer player, Bitmap image) {
|
||||
super.onSnapshotComplete(player, image);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRenderVideoFrame(V2TXLivePlayer player, V2TXLiveDef.V2TXLiveVideoFrame videoFrame) {
|
||||
super.onRenderVideoFrame(player, videoFrame);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, byte[] data) {
|
||||
super.onReceiveSeiMessage(player, payloadType, data);
|
||||
}
|
||||
});
|
||||
|
||||
mPlayer.switchUrl(url);
|
||||
purl = url;
|
||||
int V2TXLiveCode = mPlayer.startPlay(url);
|
||||
onPrepared();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
mEnd = true;
|
||||
mStarted = false;
|
||||
if (mPlayer != null) {
|
||||
mPlayer.stopPlay();
|
||||
mPlayer.stop();
|
||||
mPlayer.release();
|
||||
}
|
||||
Bus.getOff(this);
|
||||
EventBus.getDefault().unregister(this);
|
||||
L.e(TAG, "release------->");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopPlay() {
|
||||
Log.i(TAG, "stopPlay: ");
|
||||
if (mCover != null) {
|
||||
mCover.setAlpha(1f);
|
||||
if (mCover.getVisibility() != View.VISIBLE) {
|
||||
@ -416,7 +344,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
}
|
||||
}
|
||||
if (mPlayer != null) {
|
||||
mPlayer.stopPlay();
|
||||
mPlayer.stop();
|
||||
}
|
||||
stopPlay2();
|
||||
}
|
||||
@ -629,7 +557,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
params.height = RelativeLayout.LayoutParams.MATCH_PARENT;
|
||||
params.topMargin = 0;
|
||||
params.addRule(RelativeLayout.ALIGN_TOP);
|
||||
mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation270);
|
||||
// mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation270);
|
||||
mVideoView.requestLayout();
|
||||
}
|
||||
|
||||
@ -639,7 +567,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mVideoView.getLayoutParams();
|
||||
params.height = vHeight;
|
||||
params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top);
|
||||
mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0);
|
||||
// mPlayer.setRenderRotation(V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0);
|
||||
params.addRule(RelativeLayout.ALIGN_TOP);
|
||||
mVideoView.requestLayout();
|
||||
}
|
||||
@ -703,10 +631,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
Log.e("ry", "退出多人房间成功");
|
||||
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
||||
public void run() {
|
||||
mPlayer.startPlay(purl);
|
||||
mPlayer.play();
|
||||
Log.e("ry", mPlayer.isPlaying() + "purl" + purl);
|
||||
if (mPlayer.isPlaying() != 1) {
|
||||
mPlayer.startPlay(purl);
|
||||
if (!mPlayer.isPlaying()) {
|
||||
mPlayer.switchUrl(purl);
|
||||
}
|
||||
ry_view.removeAllViews();
|
||||
ry_view.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
@ -755,6 +683,87 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onOpenDrawer(LiveAudienceEvent event) {
|
||||
if (event.getType() == LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO) {
|
||||
int ban = roomModel.getClarityType() - 1 == PLAY_MODEL_720 ? LiveClarityCustomPopup.BAN_1080 : roomModel.getClarityType() - 1 == PLAY_MODEL_480 ? LiveClarityCustomPopup.BAN_720 : 0;
|
||||
LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, PLAY_MODEL, ban);
|
||||
new XPopup.Builder(mContext)
|
||||
.setPopupCallback(new XPopupCallback() {
|
||||
@Override
|
||||
public void onCreated(BasePopupView popupView) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeShow(BasePopupView popupView) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onShow(BasePopupView popupView) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(BasePopupView popupView) {
|
||||
int selectClarity = liveClarityCustomPopup.getSelectClarity();
|
||||
if (selectClarity == PLAY_MODEL) return;
|
||||
if (selectClarity == 2) {
|
||||
new DialogUitl.Builder(mContext)
|
||||
.setTitle("超高清提示")
|
||||
.setContent("在網速不穩定的情況下,選擇超高清將會有可能導致直播間畫面卡頓,是否確認選擇?")
|
||||
.setConfrimString("堅持選擇")
|
||||
.setCancelString("返回")
|
||||
.setClickCallback(new DialogUitl.SimpleCallback() {
|
||||
@Override
|
||||
public void onConfirmClick(Dialog dialog, String content) {
|
||||
switchStream(srcUrl, selectClarity);
|
||||
dialog.dismiss();
|
||||
showToast();
|
||||
}
|
||||
}).build().show();
|
||||
} else {
|
||||
switchStream(srcUrl, selectClarity);
|
||||
showToast();
|
||||
}
|
||||
}
|
||||
|
||||
private void showToast() {
|
||||
DialogUitl.showToast(mContext, " 設置成功\n" +
|
||||
"正在為你轉換中", 3000);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeDismiss(BasePopupView popupView) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed(BasePopupView popupView) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyBoardStateChanged(BasePopupView popupView, int height) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClickOutside(BasePopupView popupView) {
|
||||
|
||||
}
|
||||
})
|
||||
.asCustom(liveClarityCustomPopup)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 把观众转换成主播
|
||||
*/
|
||||
@ -783,7 +792,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
for (RCRTCInputStream stream : data.getLiveStreams()) {
|
||||
if (stream.getMediaType() == RCRTCMediaType.VIDEO) {
|
||||
//暂停播放
|
||||
mPlayer.stopPlay();
|
||||
mPlayer.stop();
|
||||
//如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示
|
||||
|
||||
//如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示
|
||||
@ -1020,4 +1029,67 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void showLoadingDialog() {
|
||||
if (PLAY_MODEL == PLAY_MODEL_480) return;
|
||||
|
||||
new DialogUitl.Builder(mContext)
|
||||
.setTitle("網絡提示")
|
||||
.setContent("系統監測到您的網絡不穩定,對此將清晰度變成了流暢,您可以在側邊菜單中的「清晰度」選擇調回。")
|
||||
.setView(R.layout.dialog_simple_tip)
|
||||
.setClickCallback(new DialogUitl.SimpleCallback() {
|
||||
@Override
|
||||
public void onConfirmClick(Dialog dialog, String content) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
}).build().show();
|
||||
PLAY_MODEL = PLAY_MODEL_480;
|
||||
String url = srcUrl;
|
||||
if (videoLandscape == VIDEO_VERTICAL) {
|
||||
url = url.replace(".flv", videoRatioVertical[PLAY_MODEL_480] + videoFps[0] + ".flv");
|
||||
} else if (videoLandscape == VIDEO_HORIZONTAL) {
|
||||
url = url.replace(".flv", videoRatioHorizontal[PLAY_MODEL_480] + videoFps[0] + ".flv");
|
||||
}
|
||||
mPlayer.switchUrl(url);
|
||||
}
|
||||
|
||||
private class ExoPlayerListener implements Player.Listener {
|
||||
String TAG = "播放流";
|
||||
|
||||
@Override
|
||||
public void onPlayerError(PlaybackException error) {
|
||||
Player.Listener.super.onPlayerError(error);
|
||||
debugView.setText("播放出错code=" + error.errorCode + " msg=" + error.getErrorCodeName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(VideoSize videoSize) {
|
||||
Player.Listener.super.onVideoSizeChanged(videoSize);
|
||||
Log.i(TAG, "onVideoSizeChanged: width = " + videoSize.width + " height = " + videoSize.height);
|
||||
// ToastUtil.show("分辨率: width = " + videoSize.width + " height = " + videoSize.height);
|
||||
if (videoSize.height > videoSize.width) {
|
||||
videoLandscape = VIDEO_VERTICAL;
|
||||
} else {
|
||||
videoLandscape = VIDEO_HORIZONTAL;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlaybackStateChanged(int playbackState) {
|
||||
Player.Listener.super.onPlaybackStateChanged(playbackState);
|
||||
if (playbackState == Player.STATE_BUFFERING) {
|
||||
showLoadingDialog();
|
||||
OkDownload.getInstance().pauseAll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIsPlayingChanged(boolean isPlaying) {
|
||||
Player.Listener.super.onIsPlayingChanged(isPlaying);
|
||||
if (isPlaying) {
|
||||
hideCover();
|
||||
OkDownload.getInstance().startAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -257,7 +257,7 @@ public class LivePlayTxViewHolder extends LiveRoomPlayViewHolder implements ITXL
|
||||
* @param url 流地址
|
||||
*/
|
||||
@Override
|
||||
public void play(String url) {
|
||||
public void play(String url,int playModel) {
|
||||
url = "webrtc://5664.liveplay.myqcloud.com/live/5664_harchar1";
|
||||
|
||||
mPlayer = new V2TXLivePlayerImpl(mContext);
|
||||
@ -318,6 +318,11 @@ public class LivePlayTxViewHolder extends LiveRoomPlayViewHolder implements ITXL
|
||||
L.e(TAG, "play----url--->" + url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void switchStream(String url, int playModel) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopPlay() {
|
||||
mChangeToLeft = false;
|
||||
|
@ -251,7 +251,7 @@ public class LivePlayTxViewHolder_backup extends LiveRoomPlayViewHolder implemen
|
||||
* @param url 流地址
|
||||
*/
|
||||
@Override
|
||||
public void play(String url) {
|
||||
public void play(String url,int playModel) {
|
||||
if (TextUtils.isEmpty(url)) {
|
||||
return;
|
||||
}
|
||||
@ -280,6 +280,11 @@ public class LivePlayTxViewHolder_backup extends LiveRoomPlayViewHolder implemen
|
||||
L.e(TAG, "play----url--->" + url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void switchStream(String url, int playModel) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopPlay() {
|
||||
mChangeToLeft = false;
|
||||
|
@ -3,6 +3,7 @@ package com.yunbao.live.views;
|
||||
import android.content.Context;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.yunbao.common.bean.EnterRoomNewModel;
|
||||
import com.yunbao.common.bean.LiveBean;
|
||||
import com.yunbao.common.views.AbsViewHolder;
|
||||
import com.yunbao.live.interfaces.ILiveLinkMicViewHolder;
|
||||
@ -13,14 +14,24 @@ import com.yunbao.live.interfaces.ILiveLinkMicViewHolder;
|
||||
|
||||
public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements ILiveLinkMicViewHolder {
|
||||
protected LiveBean mLiveBean;
|
||||
public static final int PLAY_MODEL_DEF = -1;
|
||||
public static final int PLAY_MODEL_480 = 0;
|
||||
public static final int PLAY_MODEL_720 = 1;
|
||||
public static final int PLAY_MODEL_1080 = 2;
|
||||
public static int PLAY_MODEL = PLAY_MODEL_DEF;
|
||||
|
||||
public static final String[] videoRatioHorizontal = new String[]{"_640_480", "_1280_720", "_1920_1080", "_180_180"};
|
||||
public static final String[] videoRatioVertical = new String[]{"_480_640", "_720_1280", "_1080_1920", "_180_180"};
|
||||
public static final String[] videoFps = new String[]{"_24", "_30"};
|
||||
OnMicCallback onMicCallback;//连麦回调
|
||||
public EnterRoomNewModel roomModel;
|
||||
|
||||
public LiveRoomPlayViewHolder(Context context, ViewGroup parentView) {
|
||||
super(context, parentView);
|
||||
}
|
||||
|
||||
public abstract void play(String url);
|
||||
public abstract void play(String url, int playModel);
|
||||
public abstract void switchStream(String url, int playModel);
|
||||
|
||||
public abstract void stopPlay();
|
||||
|
||||
@ -58,8 +69,13 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL
|
||||
this.onMicCallback = onMicCallback;
|
||||
}
|
||||
|
||||
public void setLiveEnterRoomNewModel(EnterRoomNewModel data) {
|
||||
data.setClarityType(2);
|
||||
this.roomModel = data;
|
||||
}
|
||||
|
||||
public interface OnMicCallback{
|
||||
|
||||
public interface OnMicCallback {
|
||||
void onMikUpdate();
|
||||
|
||||
}
|
||||
|
@ -837,8 +837,13 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis
|
||||
mLiveUserAdapter.setOnItemClickListener(new OnItemClickListener<UserBean>() {
|
||||
@Override
|
||||
public void onItemClick(UserBean bean, int position) {
|
||||
if (position < 4) {
|
||||
ToastUtil.show("切换:" + LiveRoomPlayViewHolder.videoRatioVertical[position]);
|
||||
PortraitLiveManager.portraitLiveManager.test(position);
|
||||
} else {
|
||||
showUserDialog(bean.getId());
|
||||
}
|
||||
}
|
||||
});
|
||||
mUserRecyclerView.setAdapter(mLiveUserAdapter);
|
||||
//聊天栏
|
||||
|
@ -186,6 +186,8 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe
|
||||
|
||||
private int landscape;
|
||||
private String leaveStream = "", leaveGroupId = "";
|
||||
public static PortraitLiveManager portraitLiveManager;
|
||||
|
||||
|
||||
public PortraitLiveManager setQuitF(boolean quitF) {
|
||||
isQuitF = quitF;
|
||||
@ -196,6 +198,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe
|
||||
this.mContext = context;
|
||||
this.mIntent = intent;
|
||||
liveImDeletUtil = new LiveImDeletUtil();
|
||||
portraitLiveManager = this;
|
||||
ininView();
|
||||
}
|
||||
|
||||
@ -296,7 +299,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe
|
||||
mask.setVisibility(View.VISIBLE);
|
||||
mLivePlayViewHolder.setLiveBean(mLiveBean);
|
||||
mLivePlayViewHolder.setCover(mLiveBean.getAvatar());
|
||||
mLivePlayViewHolder.play(mLiveBean.getPull());
|
||||
mLivePlayViewHolder.play(mLiveBean.getPull(), LiveRoomPlayViewHolder.PLAY_MODEL_DEF);
|
||||
mLivePlayViewHolder.setOnMicCallback(new LiveRoomPlayViewHolder.OnMicCallback() {
|
||||
@Override
|
||||
public void onMikUpdate() {
|
||||
@ -327,6 +330,10 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe
|
||||
|
||||
}
|
||||
|
||||
public void test(int model) {
|
||||
mLivePlayViewHolder.play(mLiveBean.getPull(), model);
|
||||
}
|
||||
|
||||
private Runnable sendFIm = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -352,6 +359,8 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe
|
||||
}
|
||||
landscape = data.getLiveInfo().getLandscape();
|
||||
mLivePlayViewHolder.setLiveBeanLandscape(landscape);
|
||||
mLivePlayViewHolder.setLiveEnterRoomNewModel(data);
|
||||
mLivePlayViewHolder.switchStream(mLiveBean.getPull(), data.getClarityType() - 1);
|
||||
//是否热度卡加成
|
||||
liveHandler.postDelayed(() -> mLiveRoomViewHolder.getIsHot(data.getIsUseHotCard()), 700);
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
||||
<com.tencent.rtmp.ui.TXCloudVideoView
|
||||
<SurfaceView
|
||||
android:id="@+id/video_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
Loading…
Reference in New Issue
Block a user