From 339d460c0faabdf0475df9d4523c63d0f91e6246 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Tue, 27 Dec 2022 13:52:01 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=AE=A4=E8=BF=98=E6=98=AF=E4=BC=9A=E5=8D=A1?= =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E8=87=AA=E5=8A=A8=E6=BB=9A=E5=8A=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yunbao/live/adapter/LiveChatAdapter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java index 73127c6e0..7cff740ac 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java @@ -129,7 +129,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (isBottom && dy >= 0) return; - // Log.i(TAG, "onScrolled: " + dy); + // Log.i(TAG, "onScrolled: " + dy); mRecyclerViewScrolledDy = dy; isBottom = false; } @@ -138,11 +138,11 @@ public class LiveChatAdapter extends RecyclerView.Adapter { public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == 0 && isSlideToBottom(recyclerView)) { - // Log.i(TAG, "onScrollStateChanged: 到底部了"); + // Log.i(TAG, "onScrollStateChanged: 到底部了"); mRecyclerViewScrolledDy = 0; isBottom = true; } else if (newState == 0) { - // Log.i(TAG, "onScrollStateChanged: 不是底部"); + // Log.i(TAG, "onScrollStateChanged: 不是底部"); isBottom = false; } } @@ -398,7 +398,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { if (bean == null) { return; } - // Log.i(TAG, "insertItem: " + bean.getContent()); + // Log.i(TAG, "insertItem: " + bean.getContent()+" size = "+(mList.size()+1)); int size = mList.size(); //设置最大展示99条消息 if (size == 100) { From 137dbc72d8e4c23a0f3fbdb326fe5ecc6fb316d7 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Wed, 28 Dec 2022 17:51:35 +0800 Subject: [PATCH 02/13] update --- config.gradle | 4 +- live/build.gradle | 2 +- .../live/views/LivePlayKsyViewHolder.java | 2 +- .../live/views/LivePlayRyViewHolder.java | 210 ++++++++++++++---- .../live/views/LivePlayTxViewHolder.java | 2 +- .../views/LivePlayTxViewHolder_backup.java | 2 +- .../live/views/LiveRoomPlayViewHolder.java | 9 +- .../yunbao/live/views/LiveRoomViewHolder.java | 7 +- .../live/views/PortraitLiveManager.java | 9 +- .../main/res/layout/view_live_play_ksy.xml | 2 +- 10 files changed, 194 insertions(+), 55 deletions(-) diff --git a/config.gradle b/config.gradle index 6f21be570..ac60b7e57 100644 --- a/config.gradle +++ b/config.gradle @@ -10,9 +10,9 @@ ext { manifestPlaceholders = [ //正式 - serverHost : "https://napi.yaoulive.com", +// serverHost : "https://napi.yaoulive.com", // 測試 -// serverHost : "https://ceshi.yaoulive.com", + serverHost : "https://ceshi.yaoulive.com", //腾讯地图 txMapAppKey : "EOZBZ-ASLCU-4XPV3-BDCHZ-4E3Q7-H4BWB", diff --git a/live/build.gradle b/live/build.gradle index f8dddcdbd..0329c0beb 100644 --- a/live/build.gradle +++ b/live/build.gradle @@ -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" } \ No newline at end of file +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' } \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java index 374978a99..b50a38d80 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java @@ -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) { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 8d979b241..00994d59d 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -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,18 @@ 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.ExoPlayer; +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.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.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; @@ -56,7 +54,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 +86,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,15 +98,16 @@ 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=横屏 + int videoLandscape = -1; // 视频方向,1=竖屏,2=横屏 static int vHeight;//视频高 private TextView debugView; + private ExoPlayer mPlayer, mPlayer2; + private boolean isPlayer = true; //0未申请1申请中2连麦中 @@ -141,7 +139,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { 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 +152,14 @@ 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 ExoPlayer.Builder(mContext) + .build(); + mPlayer2 = new ExoPlayer.Builder(mContext).build(); + mPlayer.setVideoSurfaceView(mVideoView); + mPlayer2.setVideoSurfaceView(mVideoView); + mPlayer.addListener(new ExoPlayerListener(true)); + mPlayer2.addListener(new ExoPlayerListener(false)); debugView = new TextView(mContext); debugView.setBackgroundColor(Color.WHITE); @@ -247,13 +250,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 +266,14 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { * @param url 流地址 */ @Override - public void play(String url) { + public void play(String url, int 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,16 +284,10 @@ 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); - } + /*mPlayer.setObserver(new V2TXLivePlayerObserver() { + + @Override public void onWarning(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) { @@ -388,21 +391,55 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { public void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, byte[] data) { super.onReceiveSeiMessage(player, payloadType, data); } - }); - + });*/ + MediaItem item = createMediaItem(url); + if (mPlayer.isPlaying()) { + ToastUtil.show("set 2"); + mPlayer2.setMediaItem(item); + mPlayer2.setVideoSurfaceView(mVideoView); + mPlayer2.prepare(); + mPlayer2.play(); + } else { + ToastUtil.show("set 1"); + mPlayer.setMediaItem(item); + mPlayer.setVideoSurfaceView(mVideoView); + mPlayer.prepare(); + mPlayer.play(); + } + /* if (mPlayer.isPlaying()) { + MediaSource nextSource = new ProgressiveMediaSource.Factory(new DefaultHttpDataSource.Factory()) + .createMediaSource(createMediaItem(url)); + MediaSource oldSource = new ProgressiveMediaSource.Factory(new DefaultHttpDataSource.Factory()) + .createMediaSource(mPlayer.getCurrentMediaItem()); + ClippingMediaSource clippingMediaSource = new ClippingMediaSource(oldSource, 0, 3000, false, true, true); + ConcatenatingMediaSource source = new ConcatenatingMediaSource(clippingMediaSource, nextSource); + mPlayer.addMediaSource(source); + mPlayer.prepare(); + mPlayer.setPlayWhenReady(true); + } else { + MediaItem item = createMediaItem(url); + mPlayer.setMediaItem(item); + mPlayer.prepare(); + mPlayer.play(); + }*/ purl = url; - int V2TXLiveCode = mPlayer.startPlay(url); onPrepared(); } + private MediaItem createMediaItem(String url) { + MediaItem mediaItem = MediaItem.fromUri(url); + return mediaItem; + } + @Override public void release() { mEnd = true; mStarted = false; if (mPlayer != null) { - mPlayer.stopPlay(); + mPlayer.stop(); + mPlayer.release(); } L.e(TAG, "release------->"); } @@ -416,7 +453,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } } if (mPlayer != null) { - mPlayer.stopPlay(); + mPlayer.stop(); } stopPlay2(); } @@ -629,7 +666,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 +676,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 +740,13 @@ 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()) { + MediaItem item = createMediaItem(purl); + mPlayer.setMediaItem(item); + mPlayer.prepare(); + mPlayer.play(); } ry_view.removeAllViews(); ry_view.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; @@ -783,7 +823,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { for (RCRTCInputStream stream : data.getLiveStreams()) { if (stream.getMediaType() == RCRTCMediaType.VIDEO) { //暂停播放 - mPlayer.stopPlay(); + mPlayer.stop(); //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 //如果远端用户发布的是视频流,创建显示视图RCRTCVideoView,并添加到布局中显示 @@ -1020,4 +1060,86 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } }); } + + protected void startPlay() { + if (mPlayer.isPlaying()) { + mPlayer.stop(); + mPlayer2.play(); + } else { + mPlayer2.stop(); + mPlayer.play(); + } + } + + private class ExoPlayerListener implements Player.Listener { + String TAG = "播放流"; + boolean isPlayer1; + + public ExoPlayerListener(boolean isPlayer1) { + this.isPlayer1 = isPlayer1; + } + + @Override + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + if (playbackState == Player.STATE_READY) { + if (isPlayer1) { + mPlayer2.stop(); + Log.i(TAG, "onPlaybackStateChanged1: " + mPlayer.getCurrentMediaItem().localConfiguration.uri); + mPlayer.setVideoSurfaceView(mVideoView); + mPlayer.play(); + } else { + mPlayer.stop(); + Log.i(TAG, "onPlaybackStateChanged2: " + mPlayer2.getCurrentMediaItem().localConfiguration.uri); + mPlayer2.setVideoSurfaceView(mVideoView); + mPlayer2.play(); + } + + }else if (playbackState==Player.STATE_IDLE){ + if(!isPlayer1){ + mPlayer.stop(); + mPlayer2.prepare(); + }else{ + /* mPlayer2.stop(); + mPlayer.prepare();*/ + } + } + Log.i(TAG, "onPlaybackStateChanged: " + playbackState + " play = " + isPlayer1 + " p1 = " + mPlayer.isPlaying() + " p2 = " + mPlayer2.isPlaying()); + isPlayer = !isPlayer; + } + + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + Player.Listener.super.onMediaItemTransition(mediaItem, reason); + Log.i(TAG, "onMediaItemTransition: " + reason); + } + + @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); + if (videoSize.height > videoSize.width) { + videoLandscape = VIDEO_VERTICAL; + } else { + videoLandscape = VIDEO_HORIZONTAL; + } + } + + @Override + public void onTimelineChanged(Timeline timeline, int reason) { + Player.Listener.super.onTimelineChanged(timeline, reason); + Log.i(TAG, "onTimelineChanged: " + reason); + } + + @Override + public void onTracksChanged(Tracks tracks) { + Player.Listener.super.onTracksChanged(tracks); + Log.i(TAG, "onTracksChanged: " + tracks.getGroups().size()); + } + } } diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java index 9aef30b33..be84ebfa8 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java @@ -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); diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java index 2aaa2705e..9548eda7b 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java @@ -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; } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index 32ad18a89..5ea00b74f 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -13,14 +13,21 @@ 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 final String[] videoRatioHorizontal = new String[]{"_640_480", "_960_720", "_1920_1080","_180_180"}; + public static final String[] videoRatioVertical = new String[]{"_480_640", "_720_960", "_1080_1920","_180_180"}; + public static final String[] videoFps = new String[]{"_24", "_30"}; OnMicCallback onMicCallback;//连麦回调 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 stopPlay(); diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index 6fa9eaa4a..13075c098 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -837,7 +837,12 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mLiveUserAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(UserBean bean, int position) { - showUserDialog(bean.getId()); + if (position < 4) { + ToastUtil.show("切换:" + LiveRoomPlayViewHolder.videoRatioVertical[position]); + PortraitLiveManager.portraitLiveManager.test(position); + } else { + showUserDialog(bean.getId()); + } } }); mUserRecyclerView.setAdapter(mLiveUserAdapter); diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index 5fd7b77ae..b36d84d29 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -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() { @@ -326,7 +329,9 @@ 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() { diff --git a/live/src/main/res/layout/view_live_play_ksy.xml b/live/src/main/res/layout/view_live_play_ksy.xml index b136c4bc5..6dc70080c 100644 --- a/live/src/main/res/layout/view_live_play_ksy.xml +++ b/live/src/main/res/layout/view_live_play_ksy.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent"> - From 181bb5b4451ae574f50107809ab6d888be93966e Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 11:01:23 +0800 Subject: [PATCH 03/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/common/utils/DialogUitl.java | 8 +- .../live/utils/LiveExoPlayerManager.java | 170 ++++++++++++++++++ .../live/views/LivePlayRyViewHolder.java | 119 +++++------- .../live/views/LiveRoomPlayViewHolder.java | 17 +- 4 files changed, 227 insertions(+), 87 deletions(-) create mode 100644 live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java diff --git a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java index 9ddea94c3..b53f0258b 100644 --- a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java +++ b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java @@ -494,8 +494,12 @@ public class DialogUitl { } } }; - btnConfirm.setOnClickListener(listener); - btnCancel.setOnClickListener(listener); + if(btnConfirm!=null) { + btnConfirm.setOnClickListener(listener); + } + if(btnCancel!=null) { + btnCancel.setOnClickListener(listener); + } dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java new file mode 100644 index 000000000..2ccc0d15e --- /dev/null +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -0,0 +1,170 @@ +package com.yunbao.live.utils; + +import android.content.Context; +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.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 = "播放"; + + public LiveExoPlayerManager(Context mContext) { + this.mContext = mContext; + player1 = new ExoPlayer.Builder(mContext).build(); + player2 = new ExoPlayer.Builder(mContext).build(); + 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"); + } else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY1 && !isSwitchUrl) { + if (listener != null) { + listener.onPlaybackStateChanged(playbackState); + } + } + } + + @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()); + } else if (playbackState == Player.STATE_BUFFERING && status == MODEL_PLAY2 && !isSwitchUrl) { + if (listener != null) { + listener.onPlaybackStateChanged(playbackState); + } + } + } + + @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); + } + }); + } + + public void setListener(Player.Listener listener) { + this.listener = listener; + } + + public void setMainView(SurfaceView mainView) { + this.mainView = mainView; + } + + public void startUrl(String url) { + isSwitchUrl = true; + getNowPlayer().setVideoSurfaceView(mainView); + getNowPlayer().setMediaItem(createMediaItem(url)); + getNowPlayer().prepare(); + getNowPlayer().play(); + } + + public void switchUrl(String url) { + 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(); + } +} diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 00994d59d..4e2e01176 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -24,7 +24,6 @@ import android.widget.TextView; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -44,6 +43,7 @@ import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveAudienceActivity; +import com.yunbao.live.utils.LiveExoPlayerManager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -106,13 +106,11 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { static int vHeight;//视频高 private TextView debugView; - private ExoPlayer mPlayer, mPlayer2; - private boolean isPlayer = true; - + private LiveExoPlayerManager mPlayer; //0未申请1申请中2连麦中 RCRTCRoom rcrtcRoom; - String purl; + String purl, srcUrl; public int getLandscape() { return landscape; @@ -153,13 +151,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { params.height = vHeight; mPkContainer.requestLayout(); - mPlayer = new ExoPlayer.Builder(mContext) - .build(); - mPlayer2 = new ExoPlayer.Builder(mContext).build(); - mPlayer.setVideoSurfaceView(mVideoView); - mPlayer2.setVideoSurfaceView(mVideoView); - mPlayer.addListener(new ExoPlayerListener(true)); - mPlayer2.addListener(new ExoPlayerListener(false)); + mPlayer = new LiveExoPlayerManager(mContext); + mPlayer.setMainView(mVideoView); + mPlayer.setListener(new ExoPlayerListener()); debugView = new TextView(mContext); debugView.setBackgroundColor(Color.WHITE); @@ -267,6 +261,8 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { */ @Override 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"); @@ -395,16 +391,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { MediaItem item = createMediaItem(url); if (mPlayer.isPlaying()) { ToastUtil.show("set 2"); - mPlayer2.setMediaItem(item); - mPlayer2.setVideoSurfaceView(mVideoView); - mPlayer2.prepare(); - mPlayer2.play(); + mPlayer.switchUrl(url); } else { ToastUtil.show("set 1"); - mPlayer.setMediaItem(item); - mPlayer.setVideoSurfaceView(mVideoView); - mPlayer.prepare(); - mPlayer.play(); + mPlayer.startUrl(url); } /* if (mPlayer.isPlaying()) { MediaSource nextSource = new ProgressiveMediaSource.Factory(new DefaultHttpDataSource.Factory()) @@ -743,10 +733,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { mPlayer.play(); Log.e("ry", mPlayer.isPlaying() + "purl" + purl); if (!mPlayer.isPlaying()) { - MediaItem item = createMediaItem(purl); - mPlayer.setMediaItem(item); - mPlayer.prepare(); - mPlayer.play(); + mPlayer.switchUrl(purl); } ry_view.removeAllViews(); ry_view.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; @@ -1061,58 +1048,31 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { }); } - protected void startPlay() { - if (mPlayer.isPlaying()) { - mPlayer.stop(); - mPlayer2.play(); - } else { - mPlayer2.stop(); - mPlayer.play(); + 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 = "播放流"; - boolean isPlayer1; - - public ExoPlayerListener(boolean isPlayer1) { - this.isPlayer1 = isPlayer1; - } - - @Override - public void onPlaybackStateChanged(int playbackState) { - Player.Listener.super.onPlaybackStateChanged(playbackState); - if (playbackState == Player.STATE_READY) { - if (isPlayer1) { - mPlayer2.stop(); - Log.i(TAG, "onPlaybackStateChanged1: " + mPlayer.getCurrentMediaItem().localConfiguration.uri); - mPlayer.setVideoSurfaceView(mVideoView); - mPlayer.play(); - } else { - mPlayer.stop(); - Log.i(TAG, "onPlaybackStateChanged2: " + mPlayer2.getCurrentMediaItem().localConfiguration.uri); - mPlayer2.setVideoSurfaceView(mVideoView); - mPlayer2.play(); - } - - }else if (playbackState==Player.STATE_IDLE){ - if(!isPlayer1){ - mPlayer.stop(); - mPlayer2.prepare(); - }else{ - /* mPlayer2.stop(); - mPlayer.prepare();*/ - } - } - Log.i(TAG, "onPlaybackStateChanged: " + playbackState + " play = " + isPlayer1 + " p1 = " + mPlayer.isPlaying() + " p2 = " + mPlayer2.isPlaying()); - isPlayer = !isPlayer; - } - - @Override - public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { - Player.Listener.super.onMediaItemTransition(mediaItem, reason); - Log.i(TAG, "onMediaItemTransition: " + reason); - } @Override public void onPlayerError(PlaybackException error) { @@ -1123,6 +1083,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public void onVideoSizeChanged(VideoSize videoSize) { Player.Listener.super.onVideoSizeChanged(videoSize); + Log.i(TAG, "onVideoSizeChanged: width = " + videoSize.width + " height = " + videoSize.height); if (videoSize.height > videoSize.width) { videoLandscape = VIDEO_VERTICAL; } else { @@ -1131,15 +1092,19 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } @Override - public void onTimelineChanged(Timeline timeline, int reason) { - Player.Listener.super.onTimelineChanged(timeline, reason); - Log.i(TAG, "onTimelineChanged: " + reason); + public void onPlaybackStateChanged(int playbackState) { + Player.Listener.super.onPlaybackStateChanged(playbackState); + if (playbackState == Player.STATE_BUFFERING) { + showLoadingDialog(); + } } @Override - public void onTracksChanged(Tracks tracks) { - Player.Listener.super.onTracksChanged(tracks); - Log.i(TAG, "onTracksChanged: " + tracks.getGroups().size()); + public void onIsPlayingChanged(boolean isPlaying) { + Player.Listener.super.onIsPlayingChanged(isPlaying); + if (isPlaying) { + hideCover(); + } } } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index 5ea00b74f..b9ee9a46c 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -13,13 +13,14 @@ 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 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", "_960_720", "_1920_1080","_180_180"}; - public static final String[] videoRatioVertical = new String[]{"_480_640", "_720_960", "_1080_1920","_180_180"}; + public static final String[] videoRatioHorizontal = new String[]{"_640_480", "_1280_720", "_1920_1080", "_180_180"}; + public static final String[] videoRatioVertical = new String[]{"_480_640", "_1280_960", "_1080_1920", "_180_180"}; public static final String[] videoFps = new String[]{"_24", "_30"}; OnMicCallback onMicCallback;//连麦回调 @@ -27,7 +28,7 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL super(context, parentView); } - public abstract void play(String url,int playModel); + public abstract void play(String url, int playModel); public abstract void stopPlay(); @@ -66,7 +67,7 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL } - public interface OnMicCallback{ + public interface OnMicCallback { void onMikUpdate(); } From 5db84c1e61ce5ff6ee0764a3ec592a9d2870f17c Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 13:13:05 +0800 Subject: [PATCH 04/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/views/CustomDrawerPopupView.java | 6 +- .../common/views/LiveClarityCustomPopup.java | 18 +++++ .../live/activity/LiveAudienceActivity.java | 2 +- .../yunbao/live/event/LiveAudienceEvent.java | 3 +- .../live/utils/LiveExoPlayerManager.java | 1 + .../live/views/LivePlayRyViewHolder.java | 71 ++++++++++++++++++- .../live/views/LiveRoomPlayViewHolder.java | 2 +- 7 files changed, 96 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java index ab2199dbd..c5c23580c 100644 --- a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java +++ b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java @@ -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(); + } } diff --git a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java index 13ec97ca9..edf5ec993 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java @@ -12,16 +12,28 @@ import com.yunbao.common.R; 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 int banSelect; public int getSelectClarity() { return selectClarity; } + public LiveClarityCustomPopup(@NonNull Context context, int selectClarity, int banSelect) { + super(context); + this.selectClarity = selectClarity; + this.banSelect = banSelect; + } + public LiveClarityCustomPopup(@NonNull Context context, int selectClarity) { super(context); + if (selectClarity == -1) { + selectClarity = 0; + } this.selectClarity = selectClarity; } @@ -75,6 +87,12 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl selectClarity(selectClarity); dismiss(); }); + if (banSelect == BAN_720) { + lineFhd.setEnabled(false); + lineHd.setEnabled(false); + } else if (banSelect == BAN_1080) { + lineFhd.setEnabled(false); + } } /** diff --git a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java index 135739ce7..d817ab129 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java @@ -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 diff --git a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java index 8e5daccd3..204abebf2 100644 --- a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java +++ b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java @@ -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; diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java index 2ccc0d15e..9e0bf571b 100644 --- a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -134,6 +134,7 @@ public class LiveExoPlayerManager { } public void switchUrl(String url) { + Log.i(TAG, "switchUrl: "+url); isSwitchUrl = true; getNextPlayer().setMediaItem(createMediaItem(url)); getNextPlayer().prepare(); diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 4e2e01176..253d33e02 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -30,9 +30,13 @@ 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.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.L; @@ -40,9 +44,11 @@ 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; @@ -132,6 +138,7 @@ 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); @@ -390,10 +397,10 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { });*/ MediaItem item = createMediaItem(url); if (mPlayer.isPlaying()) { - ToastUtil.show("set 2"); + ToastUtil.show("set 2 画质="+playModel); mPlayer.switchUrl(url); } else { - ToastUtil.show("set 1"); + ToastUtil.show("set 1 画质="+playModel); mPlayer.startUrl(url); } /* if (mPlayer.isPlaying()) { @@ -431,6 +438,8 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { mPlayer.stop(); mPlayer.release(); } + Bus.getOff(this); + EventBus.getDefault().unregister(this); L.e(TAG, "release------->"); } @@ -782,6 +791,64 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onOpenDrawer(LiveAudienceEvent event) { + if (event.getType() == LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO) { + int ban = PLAY_MODEL == PLAY_MODEL_720 ? LiveClarityCustomPopup.BAN_1080 : PLAY_MODEL == PLAY_MODEL_480 ? LiveClarityCustomPopup.BAN_720 : 0; + LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, PLAY_MODEL); + 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(); + play(srcUrl, selectClarity); + } + + @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(); + } + } + /** * 把观众转换成主播 */ diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index b9ee9a46c..ffb150b0b 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -20,7 +20,7 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL 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", "_1280_960", "_1080_1920", "_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;//连麦回调 From 956bef4b9030739f8b3b34fa663be2d4b1dd067f Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 15:59:03 +0800 Subject: [PATCH 05/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunbao/common/bean/EnterRoomNewModel.java | 10 +++ .../com/yunbao/common/utils/DialogUitl.java | 16 ++++ .../common/views/LiveClarityCustomPopup.java | 24 ++++- .../main/res/layout/dialog_live_clarity.xml | 3 + common/src/main/res/layout/dialog_toast.xml | 18 ++++ .../live/adapter/FreePkRecyclerAdapter.java | 2 +- .../live/utils/LiveExoPlayerManager.java | 84 ++++++++++++++--- .../live/views/LivePlayKsyViewHolder.java | 5 ++ .../live/views/LivePlayRyViewHolder.java | 90 ++++++++++++------- .../live/views/LivePlayTxViewHolder.java | 5 ++ .../views/LivePlayTxViewHolder_backup.java | 5 ++ .../live/views/LiveRoomPlayViewHolder.java | 8 ++ .../live/views/PortraitLiveManager.java | 6 +- 13 files changed, 229 insertions(+), 47 deletions(-) create mode 100644 common/src/main/res/layout/dialog_toast.xml diff --git a/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java b/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java index b8245fe3f..66daf307c 100644 --- a/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java +++ b/common/src/main/java/com/yunbao/common/bean/EnterRoomNewModel.java @@ -28,6 +28,8 @@ public class EnterRoomNewModel extends BaseModel { private String isUseHotCard = "";//是否使用热度卡 @SerializedName("liveRoomActivity") private List liveRoomActivityModels = new ArrayList<>();//活动列表 + @SerializedName("clarityType") + private int clarityType; public List 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; + } } diff --git a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java index b53f0258b..d75105daf 100644 --- a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java +++ b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java @@ -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) { diff --git a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java index edf5ec993..b22df8f9c 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java @@ -2,13 +2,17 @@ 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 { @@ -17,6 +21,8 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl 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() { @@ -25,8 +31,12 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl public LiveClarityCustomPopup(@NonNull Context context, int selectClarity, int banSelect) { super(context); - this.selectClarity = selectClarity; this.banSelect = banSelect; + if (selectClarity == -1) { + selectClarity = 0; + } + this.selectClarity = selectClarity; + ToastUtil.show("ban "+banSelect); } public LiveClarityCustomPopup(@NonNull Context context, int selectClarity) { @@ -67,6 +77,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, () -> { @@ -90,8 +106,14 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl 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); } } diff --git a/common/src/main/res/layout/dialog_live_clarity.xml b/common/src/main/res/layout/dialog_live_clarity.xml index 35fd83425..04d3d5a58 100644 --- a/common/src/main/res/layout/dialog_live_clarity.xml +++ b/common/src/main/res/layout/dialog_live_clarity.xml @@ -41,6 +41,7 @@ android:src="@mipmap/icon_sd" /> + + + + + \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java index 93a0c7762..57b0f377b 100644 --- a/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/FreePkRecyclerAdapter.java @@ -115,7 +115,7 @@ public class FreePkRecyclerAdapter extends RefreshAdapter { } 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() { diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java index 9e0bf571b..e0da52982 100644 --- a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -1,12 +1,17 @@ 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 { @@ -19,11 +24,66 @@ public class LiveExoPlayerManager { 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 + "]"); + } + }); + + } + + 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) { @@ -34,9 +94,13 @@ public class LiveExoPlayerManager { 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) { - listener.onPlaybackStateChanged(playbackState); + if (playBufferIndex++ == 0) { + handler.postDelayed(buffRunnable, 1000); + } } } } @@ -80,9 +144,13 @@ public class LiveExoPlayerManager { 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) { - listener.onPlaybackStateChanged(playbackState); + if (playBufferIndex++ == 0) { + handler.postDelayed(buffRunnable, 1000); + } } } } @@ -117,16 +185,9 @@ public class LiveExoPlayerManager { }); } - public void setListener(Player.Listener listener) { - this.listener = listener; - } - - public void setMainView(SurfaceView mainView) { - this.mainView = mainView; - } - public void startUrl(String url) { isSwitchUrl = true; + playBufferIndex = 0; getNowPlayer().setVideoSurfaceView(mainView); getNowPlayer().setMediaItem(createMediaItem(url)); getNowPlayer().prepare(); @@ -134,7 +195,8 @@ public class LiveExoPlayerManager { } public void switchUrl(String url) { - Log.i(TAG, "switchUrl: "+url); + Log.i(TAG, "switchUrl: " + url); + playBufferIndex = 0; isSwitchUrl = true; getNextPlayer().setMediaItem(createMediaItem(url)); getNextPlayer().prepare(); diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java index b50a38d80..4dc373b50 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayKsyViewHolder.java @@ -142,6 +142,11 @@ public class LivePlayKsyViewHolder extends LiveRoomPlayViewHolder { } + @Override + public void switchStream(String url, int playModel) { + + } + @Override public void release() { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 253d33e02..e61d64f3f 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -106,9 +106,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { public static Context contexts; public static FrameLayout ry_view; - private static final int VIDEO_VERTICAL = 1; - private static final int VIDEO_HORIZONTAL = 2; - int videoLandscape = -1; // 视频方向,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; @@ -197,6 +197,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(); @@ -395,40 +396,38 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { super.onReceiveSeiMessage(player, payloadType, data); } });*/ - MediaItem item = createMediaItem(url); if (mPlayer.isPlaying()) { - ToastUtil.show("set 2 画质="+playModel); - mPlayer.switchUrl(url); - } else { - ToastUtil.show("set 1 画质="+playModel); - mPlayer.startUrl(url); + mPlayer.stop(); } - /* if (mPlayer.isPlaying()) { - MediaSource nextSource = new ProgressiveMediaSource.Factory(new DefaultHttpDataSource.Factory()) - .createMediaSource(createMediaItem(url)); - MediaSource oldSource = new ProgressiveMediaSource.Factory(new DefaultHttpDataSource.Factory()) - .createMediaSource(mPlayer.getCurrentMediaItem()); - ClippingMediaSource clippingMediaSource = new ClippingMediaSource(oldSource, 0, 3000, false, true, true); - ConcatenatingMediaSource source = new ConcatenatingMediaSource(clippingMediaSource, nextSource); - mPlayer.addMediaSource(source); - mPlayer.prepare(); - mPlayer.setPlayWhenReady(true); - } else { - MediaItem item = createMediaItem(url); - mPlayer.setMediaItem(item); - mPlayer.prepare(); - mPlayer.play(); - }*/ + mPlayer.startUrl(url); purl = url; onPrepared(); - } - private MediaItem createMediaItem(String url) { - MediaItem mediaItem = MediaItem.fromUri(url); - return mediaItem; - } + @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) { + return; + } + + + if (TextUtils.isEmpty(url) || mVideoView == null) { + return; + } + mPlayer.switchUrl(url); + purl = url; + } @Override public void release() { @@ -445,6 +444,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public void stopPlay() { + Log.i(TAG, "stopPlay: "); if (mCover != null) { mCover.setAlpha(1f); if (mCover.getVisibility() != View.VISIBLE) { @@ -794,8 +794,8 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Subscribe(threadMode = ThreadMode.MAIN) public void onOpenDrawer(LiveAudienceEvent event) { if (event.getType() == LiveAudienceEvent.LiveAudienceType.LIVE_VIDEO) { - int ban = PLAY_MODEL == PLAY_MODEL_720 ? LiveClarityCustomPopup.BAN_1080 : PLAY_MODEL == PLAY_MODEL_480 ? LiveClarityCustomPopup.BAN_720 : 0; - LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, PLAY_MODEL); + 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 @@ -816,7 +816,30 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { @Override public void onDismiss(BasePopupView popupView) { int selectClarity = liveClarityCustomPopup.getSelectClarity(); - play(srcUrl, selectClarity); + 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 @@ -1151,6 +1174,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { 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 { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java index be84ebfa8..5acc92c24 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder.java @@ -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; diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java index 9548eda7b..1227a9324 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayTxViewHolder_backup.java @@ -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; diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index ffb150b0b..aa28c3378 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -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; @@ -23,12 +24,14 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL 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, int playModel); + public abstract void switchStream(String url, int playModel); public abstract void stopPlay(); @@ -66,6 +69,11 @@ 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 { void onMikUpdate(); diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index b36d84d29..f91dcd5db 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -198,7 +198,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe this.mContext = context; this.mIntent = intent; liveImDeletUtil = new LiveImDeletUtil(); - portraitLiveManager=this; + portraitLiveManager = this; ininView(); } @@ -329,9 +329,11 @@ 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() { @@ -357,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); From 660853d5be46bad2160ccacde422f584759a7ad7 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 15:59:32 +0800 Subject: [PATCH 06/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yunbao/common/views/LiveClarityCustomPopup.java | 1 - 1 file changed, 1 deletion(-) diff --git a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java index b22df8f9c..57e701de3 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java @@ -36,7 +36,6 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl selectClarity = 0; } this.selectClarity = selectClarity; - ToastUtil.show("ban "+banSelect); } public LiveClarityCustomPopup(@NonNull Context context, int selectClarity) { From 7555510d9424279294df76b012dc698b92046fc9 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 16:16:08 +0800 Subject: [PATCH 07/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/utils/LiveExoPlayerManager.java | 45 ++++++- .../live/views/LivePlayRyViewHolder.java | 112 +----------------- 2 files changed, 43 insertions(+), 114 deletions(-) diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java index e0da52982..ac2d8a8d7 100644 --- a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -14,17 +14,21 @@ 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 final int MODEL_PLAY1 = 0;//当前主播放器 + private final int MODEL_PLAY2 = 1;//当前子播放器 private Context mContext; private ExoPlayer player1, player2; - private SurfaceView mainView; + private SurfaceView mainView;//渲染视图 private int status = MODEL_PLAY1; private Player.Listener listener; - private boolean isSwitchUrl = false; + private boolean isSwitchUrl = false;//是否为主动切换播放器 private String TAG = "播放"; - private int playBufferIndex = 0; + private int playBufferIndex = 0;//卡顿计数器 private Handler handler; public LiveExoPlayerManager(Context mContext) { @@ -75,6 +79,9 @@ public class LiveExoPlayerManager { } + /** + * 延迟1秒还未恢复播放则认为卡顿了,可以切分辨率了 + */ private Runnable buffRunnable = new Runnable() { @Override public void run() { @@ -185,6 +192,11 @@ public class LiveExoPlayerManager { }); } + /** + * 开始播放 + * + * @param url 地址 + */ public void startUrl(String url) { isSwitchUrl = true; playBufferIndex = 0; @@ -194,6 +206,11 @@ public class LiveExoPlayerManager { getNowPlayer().play(); } + /** + * 无缝切换 + * + * @param url 地址 + */ public void switchUrl(String url) { Log.i(TAG, "switchUrl: " + url); playBufferIndex = 0; @@ -206,26 +223,44 @@ public class LiveExoPlayerManager { 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(); diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index e61d64f3f..d3209358a 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -34,6 +34,7 @@ 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.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; import com.yunbao.common.utils.Bus; @@ -284,118 +285,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { return; } - if (TextUtils.isEmpty(url) || mVideoView == null) { return; } - - /*mPlayer.setObserver(new V2TXLivePlayerObserver() { - - - - @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 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); - } - });*/ if (mPlayer.isPlaying()) { mPlayer.stop(); } @@ -1187,6 +1079,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Player.Listener.super.onPlaybackStateChanged(playbackState); if (playbackState == Player.STATE_BUFFERING) { showLoadingDialog(); + OkDownload.getInstance().pauseAll(); } } @@ -1195,6 +1088,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Player.Listener.super.onIsPlayingChanged(isPlaying); if (isPlaying) { hideCover(); + OkDownload.getInstance().startAll(); } } } From 0c053a028e9f10e72ee713d6536f8f678ba2255b Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 16:20:39 +0800 Subject: [PATCH 08/13] =?UTF-8?q?update=20=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yunbao/live/views/LivePlayRyViewHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index d3209358a..62d157f9e 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -1066,7 +1066,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { 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); + // ToastUtil.show("分辨率: width = " + videoSize.width + " height = " + videoSize.height); if (videoSize.height > videoSize.width) { videoLandscape = VIDEO_VERTICAL; } else { From 87e3dddac52b528e3840ebc1d7fd7e89dd10cfa7 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 16:34:35 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E6=92=AD?= =?UTF-8?q?=E5=90=8E=E9=9A=8F=E5=8D=B3PK=E6=B2=A1=E6=9C=89=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8F=96=E6=B6=88=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/manager/RandomPkManager.java | 56 ++++++++++++++----- .../live/activity/LiveRyAnchorActivity.java | 1 + 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java index a48203591..cd4a847b5 100644 --- a/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java +++ b/common/src/main/java/com/yunbao/common/manager/RandomPkManager.java @@ -37,6 +37,8 @@ public class RandomPkManager { private String pkUid;//对方房间ID public static String debugUid; private RankPkInfoBean rankPkInfoBean;//排位赛信息 + private int exitTimer;//退出倒计时 + private TimerTask exitTask = null;//退出任务 Handler handler = new Handler(Looper.getMainLooper()); private RandomPkManager() { @@ -118,6 +120,8 @@ public class RandomPkManager { return String.format(Locale.CHINA, "%02d:%02d", min, sec); } + private Runnable pkRunnable = this::next; + /** * 对方拒绝,开始下一轮匹配 */ @@ -125,11 +129,11 @@ public class RandomPkManager { if (status != PK_STATUS_DEFAULT && status != PK_STATUS_REFUSE) { return; } - new Handler(Looper.getMainLooper()).postDelayed(this::next, 5000); + handler.postDelayed(pkRunnable, 5000); } private void next() { - if (task==null) { + if (task == null) { return; } status = PK_STATUS_REQUEST; @@ -243,19 +247,9 @@ public class RandomPkManager { } } - private int exitTimer; - /** - * 退出匹配 - */ - public void exitPk() { - if (status == PK_STATUS_EXIT_ING) { - return; - } - callEndPkStart(); - status = PK_STATUS_EXIT_ING; - exitTimer = 11; - new Timer().schedule(new TimerTask() { + private TimerTask createExitTask() { + return new TimerTask() { Handler handler = new Handler(Looper.getMainLooper()); @@ -269,10 +263,25 @@ public class RandomPkManager { end(); callEndPkSuccess(); cancel(); + exitTask = null; } }); } - }, 0, 1000); + }; + } + + /** + * 退出匹配 + */ + public void exitPk() { + if (status == PK_STATUS_EXIT_ING) { + return; + } + callEndPkStart(); + status = PK_STATUS_EXIT_ING; + exitTimer = 11; + exitTask = createExitTask(); + new Timer().schedule(exitTask, 0, 1000); } /** @@ -387,6 +396,23 @@ public class RandomPkManager { return exitTimer + ""; } + /** + * 清空状态,下播时调用 + */ + public void release() { + status = PK_STATUS_REQUEST; + if (task != null) { + task.cancel(); + } + if (exitTask != null) { + exitTask.cancel(); + } + randomPkTimer.clear(); + rankPkInfoBean = null; + pkUid = null; + handler.removeCallbacks(pkRunnable); + } + public static abstract class OnRandomPkTimer { /** diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index 8a1dc02df..f4f8b8178 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -843,6 +843,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl PKing = false; isDRPK = 0; endLive(); + RandomPkManager.getInstance().release(); } }); } From d81e6b9f049a21592c520bb0df23e9e499760f68 Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Thu, 29 Dec 2022 17:04:23 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E9=96=8B=E6=92=AD=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=96=8B=E6=92=AD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E8=BE=A8=E7=8E=87=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=E5=8F=83=E6=95=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunbao/common}/bean/LiveRoomTypeBean.java | 4 +- .../common/http/live/LiveNetManager.java | 29 +++ .../common/views/LiveOpenCustomPopup.java | 178 +++++++++++++ .../views/LiveRobotSettingCustomPopup.java | 7 +- .../res/drawable/backgroud_live_open_lfet.xml | 8 + .../drawable/backgroud_live_open_right.xml | 5 + common/src/main/res/layout/view_live_open.xml | 245 ++++++++++++++++++ .../icon_live_type_normal_1.png | Bin .../icon_live_type_normal_2.png | Bin .../mipmap-xxhdpi}/icon_live_type_pay_1.png | Bin .../mipmap-xxhdpi}/icon_live_type_pay_2.png | Bin .../mipmap-xxhdpi}/icon_live_type_pwd_1.png | Bin .../mipmap-xxhdpi}/icon_live_type_pwd_2.png | Bin .../mipmap-xxhdpi}/icon_live_type_time_1.png | Bin .../mipmap-xxhdpi}/icon_live_type_time_2.png | Bin .../main/res/mipmap-xxhdpi/icon_more_open.png | Bin 0 -> 632 bytes common/src/main/res/values/strings.xml | 9 + .../live/activity/LiveTRTCAnchorActivity.java | 4 +- .../live/adapter/LiveRoomTypeAdapter.java | 2 +- .../LiveNewRoomClassDialogFragment.java | 1 - .../dialog/LiveNewRoomTypeDialogFragment.java | 2 +- .../dialog/LiveRoomTypeDialogFragment.java | 2 +- .../com/yunbao/live/http/LiveHttpUtil.java | 15 +- .../live/views/LiveNewReadyRyViewHolder.java | 186 ++++++++++++- .../live/views/LivePushRyViewHolder.java | 4 +- .../live/views/LiveReadyRyViewHolder.java | 4 +- .../live/views/LiveReadyViewHolder.java | 21 +- 27 files changed, 691 insertions(+), 35 deletions(-) rename {live/src/main/java/com/yunbao/live => common/src/main/java/com/yunbao/common}/bean/LiveRoomTypeBean.java (97%) create mode 100644 common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java create mode 100644 common/src/main/res/drawable/backgroud_live_open_lfet.xml create mode 100644 common/src/main/res/drawable/backgroud_live_open_right.xml create mode 100644 common/src/main/res/layout/view_live_open.xml rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_normal_1.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_normal_2.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_pay_1.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_pay_2.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_pwd_1.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_pwd_2.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_time_1.png (100%) rename {live/src/main/res/mipmap-mdpi => common/src/main/res/mipmap-xxhdpi}/icon_live_type_time_2.png (100%) create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_more_open.png diff --git a/live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java b/common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java similarity index 97% rename from live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java rename to common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java index ab4370e58..8151367e3 100644 --- a/live/src/main/java/com/yunbao/live/bean/LiveRoomTypeBean.java +++ b/common/src/main/java/com/yunbao/common/bean/LiveRoomTypeBean.java @@ -1,7 +1,7 @@ -package com.yunbao.live.bean; +package com.yunbao.common.bean; import com.yunbao.common.Constants; -import com.yunbao.live.R; +import com.yunbao.common.R; import java.util.ArrayList; import java.util.List; diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index d83668492..fee7cbbc5 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -17,6 +17,7 @@ import com.yunbao.common.bean.LinkMicUserBeanV2; import com.yunbao.common.bean.LiveAiRobotBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; +import com.yunbao.common.bean.LiveStetUpStatusModel; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; @@ -1034,6 +1035,34 @@ public class LiveNetManager { }).isDisposed(); } + /** + * 开播设置数据获取 + * + * @param liveUid + * @param callback + */ + public void getLiveStetUpStatus(String liveUid, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getLiveStetUpStatus(liveUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel liveStetUpStatusModelResponseModel) throws Exception { + if (callback != null) { + callback.onSuccess(liveStetUpStatusModelResponseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java new file mode 100644 index 000000000..784fd7004 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveOpenCustomPopup.java @@ -0,0 +1,178 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.R; +import com.yunbao.common.bean.LiveClassBean; +import com.yunbao.common.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveStetUpStatusModel; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class LiveOpenCustomPopup extends CenterPopupView { + //清晰度 + private int selectClarity; + //直播类型 + private LiveClassBean classBean; + //房间类型 + private LiveRoomTypeBean liveRoomTypeBean; + + private TextView textClarity, textLiveRoomType, textLiveClass, textLiveWishlist, textRobot; + + public LiveOpenCustomPopup setClassBean(LiveClassBean classBean) { + this.classBean = classBean; + textLiveClass.setText(classBean.getName()); + return this; + } + + public LiveOpenCustomPopup setLiveRoomTypeBean(LiveRoomTypeBean liveRoomTypeBean) { + this.liveRoomTypeBean = liveRoomTypeBean; + textLiveRoomType.setText(liveRoomTypeBean.getName()); + return this; + } + + public LiveOpenCustomPopup(@NonNull Context context, int selectClarity, LiveClassBean classBean, LiveRoomTypeBean liveRoomTypeBean) { + super(context); + this.selectClarity = selectClarity; + this.classBean = classBean; + this.liveRoomTypeBean = liveRoomTypeBean; + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.view_live_open; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initDate(); + } + + private void initView() { + textClarity = findViewById(R.id.text_clarity); + textLiveRoomType = findViewById(R.id.text_live_room_type); + textLiveClass = findViewById(R.id.text_live_class); + textLiveWishlist = findViewById(R.id.text_live_wishlist); + textRobot = findViewById(R.id.text_robot); + if (classBean != null) { + textLiveClass.setText(classBean.getName()); + } + if (liveRoomTypeBean != null) { + textLiveRoomType.setText(liveRoomTypeBean.getName()); + } + setSelectClarity(selectClarity); + //關閉彈窗 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_cancel), () -> dismiss()); + //開播 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_ok), () -> { + if (callBack != null) { + callBack.startLive(liveRoomTypeBean, classBean); + } + dismiss(); + }); + //設置直播類型 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_class), () -> { + if (callBack != null) { + callBack.openLiveClass(classBean); + } + }); + //設置清晰度 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_clarity), () -> { + if (callBack != null) { + callBack.selectClarity(selectClarity); + } + }); + //設置房間類型 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_room_type), () -> { + if (callBack != null) { + callBack.openLiveRoomType(liveRoomTypeBean); + } + }); + //打開心願單 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_live_wishlist), () -> { + if (callBack != null) { + callBack.openWishlist(); + } + }); + //設置機器人 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.line_robot), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (callBack != null) { + callBack.openRobot(); + } + } + }); + } + + public void setSelectClarity(int selectClarity) { + switch (selectClarity) { + case 0: + textClarity.setText(R.string.standard_clear); + break; + case 1: + textClarity.setText(R.string.high_definition); + break; + case 2: + textClarity.setText(R.string.ultra_hd); + break; + } + } + + public void initDate() { + LiveNetManager.get(getContext()) + .getLiveStetUpStatus(String.valueOf(IMLoginManager.get(getContext()).getUserInfo().getId()), + new HttpCallback() { + @Override + public void onSuccess(LiveStetUpStatusModel data) { + textLiveWishlist.setText(data.getWishListState() ? R.string.do_set : R.string.not_set); + textRobot.setText(data.getAiStateState() ? R.string.robot_yes : R.string.robot_no); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + + } + + private LiveOpenCallBack callBack; + + public LiveOpenCustomPopup setCallBack(LiveOpenCallBack callBack) { + this.callBack = callBack; + return this; + } + + public interface LiveOpenCallBack { + //開播 + void startLive(LiveRoomTypeBean liveRoomTypeBean, LiveClassBean classBean); + + //選擇清晰度 + void selectClarity(int selectClarity); + + //打開機器人 + void openRobot(); + + //打開直播間類型 + void openLiveRoomType(LiveRoomTypeBean liveRoomTypeBean); + + //打開直播類型 + void openLiveClass(LiveClassBean classBean); + + //打開心願單 + void openWishlist(); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java index f954a8ce7..e8e195c49 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java @@ -1,7 +1,6 @@ package com.yunbao.common.views; import android.content.Context; -import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; @@ -24,8 +23,6 @@ import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.utils.ToastUtil; -import java.util.List; - public class LiveRobotSettingCustomPopup extends BottomPopupView implements View.OnClickListener { private static String TAG = "AI机器人"; private EditText robotNameSetting; @@ -36,6 +33,10 @@ public class LiveRobotSettingCustomPopup extends BottomPopupView implements View private int robotStateInt = 1; + public int getRobotStateInt() { + return robotStateInt; + } + public LiveRobotSettingCustomPopup(@NonNull Context context) { super(context); } diff --git a/common/src/main/res/drawable/backgroud_live_open_lfet.xml b/common/src/main/res/drawable/backgroud_live_open_lfet.xml new file mode 100644 index 000000000..d35f34c4c --- /dev/null +++ b/common/src/main/res/drawable/backgroud_live_open_lfet.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/backgroud_live_open_right.xml b/common/src/main/res/drawable/backgroud_live_open_right.xml new file mode 100644 index 000000000..314b5166d --- /dev/null +++ b/common/src/main/res/drawable/backgroud_live_open_right.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_open.xml b/common/src/main/res/layout/view_live_open.xml new file mode 100644 index 000000000..d40b58280 --- /dev/null +++ b/common/src/main/res/layout/view_live_open.xml @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_normal_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_normal_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_normal_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_normal_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_normal_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pay_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pay_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pay_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pay_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pay_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pwd_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pwd_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_pwd_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_pwd_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_pwd_2.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_time_1.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_time_1.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_time_1.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_time_1.png diff --git a/live/src/main/res/mipmap-mdpi/icon_live_type_time_2.png b/common/src/main/res/mipmap-xxhdpi/icon_live_type_time_2.png similarity index 100% rename from live/src/main/res/mipmap-mdpi/icon_live_type_time_2.png rename to common/src/main/res/mipmap-xxhdpi/icon_live_type_time_2.png diff --git a/common/src/main/res/mipmap-xxhdpi/icon_more_open.png b/common/src/main/res/mipmap-xxhdpi/icon_more_open.png new file mode 100644 index 0000000000000000000000000000000000000000..36f5f84f322ad836b7b5b95eb6787de9d8a5aced GIT binary patch literal 632 zcmV-;0*C#HP)Px%GD$>1R7gw3*H1_kVHgJR=b3h;s4O8uf)IBsFbd5icZML$2s%eb5J3lzMMk$S z9lTbQojTMZIz$u^1mP{R{Z^6wK^NVbI;T-awX4{?;b==b-#Rn$MSK1B{qYR*?)Sb+ zd24UQPq_o&00cu=SKr6IZ@yxcABt+e4?%CWo*c#&>o9keW>#ZTRBjp~^~;JM!0}Iz zl(Z2jA6*}I<^q|W1L*#0W!n1Tg+)RT~LH{; z$;*Kb)q;y?A0)V?Pr~bT{qw27MRWiXT+*WC1v>t<fDFF1!5k`Lje|h>qIZ zF&7j8Y||w5v35{V2Fn(?E-ls$fjW)KJ{^^Oy%R!WF?)nmCo4a6*jsT-W z%IFxC*X^58nJyR^^hQ?^nC+h>+cy??QA8eWNwFYSi^R{REafH>d! SN902Q0000流暢 超高清 確定清晰度開播後,需要重新開播才能更改 + 開播設置確認 + 清晰度 + 直播頻道 + 開播 + 機器人 + 已設置 + 未設置 + + diff --git a/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java index 4694aa2bc..205fd0032 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveTRTCAnchorActivity.java @@ -31,7 +31,7 @@ import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveBeautyDialogFragment; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.http.LiveHttpUtil; @@ -213,7 +213,7 @@ public class LiveTRTCAnchorActivity extends TRTCBaseActivity { return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, null, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, null,0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java index 431ea0971..61dc2da23 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveRoomTypeAdapter.java @@ -15,7 +15,7 @@ import com.yunbao.common.CommonAppConfig; import com.yunbao.common.bean.ConfigBean; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.Arrays; diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java index 6bf49ae81..f2ba058b5 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomClassDialogFragment.java @@ -18,7 +18,6 @@ import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.live.R; import com.yunbao.live.adapter.LiveReadyClassAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.List; diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java index 7f853b10e..946af6304 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewRoomTypeDialogFragment.java @@ -19,7 +19,7 @@ import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.R; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import java.util.ArrayList; import java.util.Arrays; diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java index be42aaecf..933dd3339 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveRoomTypeDialogFragment.java @@ -14,7 +14,7 @@ import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.DpUtil; import com.yunbao.live.R; import com.yunbao.live.adapter.LiveRoomTypeAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; /** * Created by cxf on 2018/10/8. diff --git a/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java b/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java index 864ec1fe6..39b9b26d5 100644 --- a/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java +++ b/live/src/main/java/com/yunbao/live/http/LiveHttpUtil.java @@ -47,10 +47,11 @@ public class LiveHttpUtil { /** * 获取直播用户日榜/周榜 - * @param liveUid 主播uid + * + * @param liveUid 主播uid * @param callback 回调 */ - public static void getUserRankList(String liveUid,HttpCallback callback){ + public static void getUserRankList(String liveUid, HttpCallback callback) { HttpClient.getInstance().get("Contribute.index", LiveHttpConsts.GET_USER_LIST) .params("uid", liveUid) .execute(callback); @@ -685,7 +686,7 @@ public class LiveHttpUtil { * @param file 封面图片文件 * @param callback */ - public static void newcreateRoom(String title, int liveClassId, int type, int typeVal, File file, HttpCallback callback) { + public static void newcreateRoom(String title, int liveClassId, int type, int typeVal, File file, int clarityType, HttpCallback callback) { PostRequest request = HttpClient.getInstance().post("Live.createRoom2", LiveHttpConsts.CREATE_ROOM) .params("title", title) @@ -693,7 +694,8 @@ public class LiveHttpUtil { .params("type", type) .params("landscape", "2") .params("class_type", "0") - .params("type_val", typeVal); + .params("type_val", typeVal) + .params("clarityType ", clarityType); if (file != null) { request.params("file", file); } @@ -902,16 +904,17 @@ public class LiveHttpUtil { /** * 获取用户贵族喇叭的数量 */ - public static void nobleUseTrumpet(String trumpet_msg,String anchor_id,HttpCallback callback) { + public static void nobleUseTrumpet(String trumpet_msg, String anchor_id, HttpCallback callback) { HttpClient.getInstance().get("Noble.nobleUseTrumpet", "nobleUseTrumpet") .params("", trumpet_msg) .params("", anchor_id) .execute(callback); } + /** * 获取用户贵族喇叭的数量 */ - public static void getStarChallengeStatus(String liveUid,HttpCallback callback) { + public static void getStarChallengeStatus(String liveUid, HttpCallback callback) { HttpClient.getInstance().get("StarChallenge.getStarChallengeStatus", "StarChallengeStatus") .params("liveUid", liveUid) .execute(callback); diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 019a85805..202f538fe 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -1,5 +1,7 @@ package com.yunbao.live.views; +import static com.yunbao.live.event.LiveAudienceEvent.LiveAudienceType.WISH_LIST_UPDATE; + import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; @@ -23,6 +25,7 @@ import com.lxj.xpopup.interfaces.XPopupCallback; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.bean.LiveClassBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.common.bean.UserBean; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; @@ -37,21 +40,25 @@ import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.common.views.AbsViewHolder; import com.yunbao.common.views.LiveClarityCustomPopup; +import com.yunbao.common.views.LiveOpenCustomPopup; import com.yunbao.common.views.LiveRobotSettingCustomPopup; import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.faceunity.FaceManager; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; -import com.yunbao.live.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveFaceUnityDialogFragment; import com.yunbao.live.dialog.LiveNewRoomClassDialogFragment; import com.yunbao.live.dialog.LiveNewRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveNewWishListDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; +import com.yunbao.live.event.LiveAudienceEvent; import com.yunbao.live.http.LiveHttpConsts; import com.yunbao.live.http.LiveHttpUtil; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + import java.io.File; import cn.rongcloud.rtc.api.RCRTCEngine; @@ -78,6 +85,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private TextView faceTextView;//提示人脸未检测到的TextView private ImageView imgClarity; private int selectClarity = 1; + private LiveOpenCustomPopup liveOpenCustomPopup; public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) { super(context, parentView, liveSdk); @@ -269,6 +277,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl liveClarity.setText(R.string.ultra_hd); break; } + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setSelectClarity(selectClarity); + } } public void setManager(FaceManager manager) { @@ -299,8 +310,156 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } else if (i == R.id.btn_room_type) { chooseLiveType(); } else if (i == R.id.btn_start_live) { - startLive(); +// startLive(); + liveOpenCustomPopup = new LiveOpenCustomPopup(mContext, selectClarity, classBean, liveRoomTypeBean) + .setCallBack(new LiveOpenCustomPopup.LiveOpenCallBack() { + @Override + public void startLive(LiveRoomTypeBean liveRoomTypeModel, LiveClassBean classModel) { + if (classModel != null) { + classBean = classModel; + mLiveClassID = classBean.getId(); + } + liveRoomTypeBean = liveRoomTypeModel; + mLiveType = liveRoomTypeModel.getId(); + startLiveInit(); + liveOpenCustomPopup = null; + } + @Override + public void selectClarity(int selectClarity) { + LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, selectClarity); + 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) { + setSelectClarity(liveClarityCustomPopup.getSelectClarity()); + } + + @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(); + } + + @Override + public void openRobot() { + LiveRobotSettingCustomPopup liveRobotSettingCustomPopup = new LiveRobotSettingCustomPopup(mContext); + 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) { + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.initDate(); + } + } + + @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(liveRobotSettingCustomPopup) + .show(); + } + + @Override + public void openLiveRoomType(LiveRoomTypeBean liveRoomTypeModel) { + liveRoomTypeBean = liveRoomTypeModel; + mLiveType = liveRoomTypeModel.getId(); + chooseLiveType(); + } + + @Override + public void openLiveClass(LiveClassBean classModel) { + if (classModel != null) { + classBean = classModel; + mLiveClassID = classBean.getId(); + } + chooseLiveClass(); + } + + @Override + public void openWishlist() { + //点击心愿单 + openWishListWindow(); + } + }); + new XPopup.Builder(mContext) + .asCustom(liveOpenCustomPopup) + .show(); } else if (i == R.id.btn_locaiton) { switchLocation(); } else if (i == R.id.btn_horizontally) { @@ -337,6 +496,16 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl if (mContext instanceof LiveRyAnchorActivity) { fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "RY"); + + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void updateStart(LiveAudienceEvent event) { + if (event.getType() == WISH_LIST_UPDATE) { + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.initDate(); + } } } @@ -424,6 +593,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl classBean = bean; mLiveClassID = classBean.getId(); mLiveClass.setText(bean.getName()); + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setClassBean(classBean); + } } }); fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "LiveRoomTypeDialogFragment"); @@ -443,6 +615,8 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl /** * 选择直播类型 */ + private LiveRoomTypeBean liveRoomTypeBean = new LiveRoomTypeBean(0, WordUtil.getString(R.string.live_room_public)); + private void chooseLiveType() { Bundle bundle = new Bundle(); bundle.putInt(Constants.CHECKED_ID, mLiveType); @@ -451,6 +625,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl fragment.setCallback(new CommonCallback() { @Override public void callback(LiveRoomTypeBean bean) { + liveRoomTypeBean = bean; switch (bean.getId()) { case Constants.LIVE_TYPE_NORMAL: onLiveTypeNormal(bean); @@ -465,6 +640,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl onLiveTypeTime(bean); break; } + if (liveOpenCustomPopup != null) { + liveOpenCustomPopup.setLiveRoomTypeBean(liveRoomTypeBean); + } } }); fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "LiveRoomTypeDialogFragment"); @@ -560,7 +738,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl /** * 点击开始直播按钮 */ - private void startLive() { + private void startLiveInit() { boolean startPreview = ((LiveRyAnchorActivity) mContext).isStartPreview(); // if (!startPreview) { // ToastUtil.show(R.string.please_wait); @@ -586,7 +764,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, selectClarity + 1, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { diff --git a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java index a3c663c54..6d0da307f 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -565,7 +565,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX //设置分辨率 .setVideoResolution(RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_640) //设置帧率 - .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_30) + .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_24) //设置最小码率,480P下推荐200 .setMinRate(250) //设置最大码率,480P下推荐900 @@ -732,7 +732,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX int height = 1280; normal.setWidth(width); //视频宽 normal.setHeight(height); //视频高 - normal.setFps(fps); //视频帧率 + normal.setFps(25); //视频帧率 //2. 合流画布设置 //(请参照画布和声音配置示例代码) diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java index 33eb8b29c..6575c81cb 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveReadyRyViewHolder.java @@ -36,7 +36,7 @@ import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveChooseClassActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.adapter.LiveReadyShareAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; import com.yunbao.live.dialog.LiveWishListDialogFragment; @@ -471,7 +471,7 @@ public class LiveReadyRyViewHolder extends AbsViewHolder implements View.OnClick return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile,0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { diff --git a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java index 1918953a4..4da9ea036 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveReadyViewHolder.java @@ -1,12 +1,13 @@ package com.yunbao.live.views; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_DISABLE; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; +import static com.yunbao.live.views.LivePushTxViewHolder.mTRTCCloud; + import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -17,12 +18,17 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.lzy.okgo.model.Response; import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSendCallback; import com.tencent.trtc.TRTCCloudDef; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; +import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.common.bean.UserBean; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; @@ -42,7 +48,6 @@ import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveAnchorActivity; import com.yunbao.live.activity.LiveChooseClassActivity; import com.yunbao.live.adapter.LiveReadyShareAdapter; -import com.yunbao.live.bean.LiveRoomTypeBean; import com.yunbao.live.dialog.LiveRoomTypeDialogFragment; import com.yunbao.live.dialog.LiveTimeDialogFragment; import com.yunbao.live.dialog.LiveWishListDialogFragment; @@ -51,10 +56,6 @@ import com.yunbao.live.http.LiveHttpUtil; import java.io.File; -import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_DISABLE; -import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; -import static com.yunbao.live.views.LivePushTxViewHolder.mTRTCCloud; - /** * Created by cxf on 2018/10/7. * 开播前准备 @@ -491,7 +492,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi return; } String title = mEditTitle.getText().toString().trim(); - LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, new HttpCallback() { + LiveHttpUtil.newcreateRoom(title, mLiveClassID, mLiveType, mLiveTypeVal, mAvatarFile, 0, new HttpCallback() { @Override public void onSuccess(int code, String msg, final String[] info) { if (code == 0 && info.length > 0) { @@ -535,7 +536,7 @@ public class LiveReadyViewHolder extends AbsViewHolder implements View.OnClickLi @Override public void onError(Response response) { super.onError(response); - System.out.println("tx 开播失败 = "+response); + System.out.println("tx 开播失败 = " + response); } }); } From 0b5598346ec68e70ae9c46d06d15c2235811c590 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 17:55:41 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=BD=91=E9=80=9F=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/common/utils/DeviceUtils.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java index 40f76b35d..b80cfd3cb 100644 --- a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java @@ -6,10 +6,15 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Point; +import android.net.TrafficStats; import android.text.format.Formatter; import android.util.DisplayMetrics; import android.view.WindowManager; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; + /** * 设备通用类 */ @@ -97,10 +102,38 @@ public class DeviceUtils { return mi.lowMemory; } - public static String getMemory(Context context) { + /** + * 获取可用内存 格式化 + */ + public static String getMemoryToFormat(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); am.getMemoryInfo(mi); return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化 } + + /** + * 获取可用内存 + */ + public static String getMemory(Context context) { + ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); + am.getMemoryInfo(mi); + return mi.availMem + ""; + } + + private static long lastTotalRxBytes = 0; + private static long lastTimeStamp = 0; + + /** + * 获取上传网速 + */ + public static long getNetSpeed(Context context) { + long nowTotalRxBytes = TrafficStats.getUidTxBytes(context.getApplicationInfo().uid) == TrafficStats.UNSUPPORTED ? 0 : (TrafficStats.getTotalTxBytes() / 1024); + long nowTimeStamp = System.currentTimeMillis(); + long speed = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));//毫秒转换 + lastTimeStamp = nowTimeStamp; + lastTotalRxBytes = nowTotalRxBytes; + return speed; + } } \ No newline at end of file From 06b5f999300968c495030bf26279e3ddfc6d37c2 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 29 Dec 2022 18:27:24 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=88=86=E8=BE=A8?= =?UTF-8?q?=E7=8E=87=E5=8F=82=E6=95=B0=20=E7=A7=BB=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yunbao/live/views/LiveRoomPlayViewHolder.java | 5 +++-- .../java/com/yunbao/live/views/LiveRoomViewHolder.java | 7 +------ .../java/com/yunbao/live/views/PortraitLiveManager.java | 3 --- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java index aa28c3378..78df9fb2f 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomPlayViewHolder.java @@ -20,8 +20,8 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL 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[] videoRatioHorizontal = new String[]{"_848_480", "_1280_720", "_1920_1080"}; + public static final String[] videoRatioVertical = new String[]{"_480_848", "_720_1280", "_1080_1920"}; public static final String[] videoFps = new String[]{"_24", "_30"}; OnMicCallback onMicCallback;//连麦回调 public EnterRoomNewModel roomModel; @@ -31,6 +31,7 @@ public abstract class LiveRoomPlayViewHolder extends AbsViewHolder implements IL } public abstract void play(String url, int playModel); + public abstract void switchStream(String url, int playModel); public abstract void stopPlay(); diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index 13075c098..6fa9eaa4a 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -837,12 +837,7 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mLiveUserAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(UserBean bean, int position) { - if (position < 4) { - ToastUtil.show("切换:" + LiveRoomPlayViewHolder.videoRatioVertical[position]); - PortraitLiveManager.portraitLiveManager.test(position); - } else { - showUserDialog(bean.getId()); - } + showUserDialog(bean.getId()); } }); mUserRecyclerView.setAdapter(mLiveUserAdapter); diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index f91dcd5db..6f9d9d03a 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -330,9 +330,6 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe } - public void test(int model) { - mLivePlayViewHolder.play(mLiveBean.getPull(), model); - } private Runnable sendFIm = new Runnable() { @Override From 8b357233c2de9ea04bc192959e252749d039c3e9 Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Fri, 30 Dec 2022 14:47:25 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E9=96=8B=E6=92=AD=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=96=8B=E6=92=AD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=86=E8=BE=A8=E7=8E=87=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=E5=8F=83=E6=95=B8,=E7=B6=B2=E7=B5=A1=E5=85=A7=E5=AD=98?= =?UTF-8?q?=E6=AA=A2=E6=B8=AC=E5=92=8C=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yunbao/common/utils/DeviceUtils.java | 2 + .../yunbao/common/views/HintCustomPopup.java | 70 +++++++++++ .../common/views/LiveClarityCustomPopup.java | 88 ++++++++++++-- .../src/main/res/layout/hint_custom_popup.xml | 71 +++++++++++ .../main/res/layout/input_custom_popup.xml | 4 +- common/src/main/res/values-en/strings.xml | 60 ++++++++++ common/src/main/res/values/strings.xml | 89 +++++++------- .../live/activity/LiveRyAnchorActivity.java | 25 ++++ .../live/views/LiveNewReadyRyViewHolder.java | 47 +++++++- .../live/views/LivePushRyViewHolder.java | 111 ++++++++++++------ 10 files changed, 477 insertions(+), 90 deletions(-) create mode 100644 common/src/main/java/com/yunbao/common/views/HintCustomPopup.java create mode 100644 common/src/main/res/layout/hint_custom_popup.xml diff --git a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java index b80cfd3cb..d298abdac 100644 --- a/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/DeviceUtils.java @@ -136,4 +136,6 @@ public class DeviceUtils { lastTotalRxBytes = nowTotalRxBytes; return speed; } + + } \ No newline at end of file diff --git a/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java b/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java new file mode 100644 index 000000000..874c3d1db --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/HintCustomPopup.java @@ -0,0 +1,70 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.text.TextUtils; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.R; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class HintCustomPopup extends CenterPopupView { + private String title, contest; + + public HintCustomPopup(@NonNull Context context, String title, String contest) { + super(context); + this.title = title; + this.contest = contest; + } + + public HintCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.hint_custom_popup; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + TextView titleText = findViewById(R.id.title); + TextView contestText = findViewById(R.id.contest); + if (!TextUtils.isEmpty(title)) { + titleText.setText(title); + } + if (!TextUtils.isEmpty(contest)) { + contestText.setText(contest); + } + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_ok), () -> { + if (callBack != null) { + callBack.onSure(); + } + dismiss(); + }); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.live_open_cancel), () -> { + if (callBack != null) { + callBack.onCancel(); + } + dismiss(); + }); + } + + private HintCustomCallBack callBack; + + public HintCustomPopup setCallBack(HintCustomCallBack callBack) { + this.callBack = callBack; + return this; + } + + public interface HintCustomCallBack { + void onSure(); + + void onCancel(); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java index 57e701de3..66c537258 100644 --- a/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java +++ b/common/src/main/java/com/yunbao/common/views/LiveClarityCustomPopup.java @@ -1,20 +1,27 @@ package com.yunbao.common.views; import android.content.Context; +import android.os.Handler; +import android.text.format.Formatter; +import android.util.Log; 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.XPopup; import com.lxj.xpopup.core.BottomPopupView; import com.yunbao.common.R; -import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.DeviceUtils; import com.yunbao.common.views.weight.ViewClicksAntiShake; +import java.util.ArrayList; +import java.util.Collections; +import java.util.DoubleSummaryStatistics; +import java.util.List; + public class LiveClarityCustomPopup extends BottomPopupView implements View.OnClickListener { public static final int BAN_720 = 1; public static final int BAN_1080 = 2; @@ -91,16 +98,51 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl }); //高清 ViewClicksAntiShake.clicksAntiShake(lineHd, () -> { - selectClarity = 1; - selectClarity(selectClarity); - dismiss(); + String memorg = formateFileSize(Long.parseLong(DeviceUtils.getMemory(getContext()))); + if (Double.parseDouble(memorg) > 7 && netAverage > 100) { + selectClarity = 1; + selectClarity(selectClarity); + dismiss(); + } else { + new XPopup.Builder(getContext()) + .asCustom(new HintCustomPopup(getContext(), getContext().getString(R.string.net_hint), getContext().getString(R.string.net_hint2)).setCallBack(new HintCustomPopup.HintCustomCallBack() { + @Override + public void onSure() { + selectClarity = 1; + selectClarity(selectClarity); + dismiss(); + } + + @Override + public void onCancel() { + + } + })) + .show(); + } + }); //超高清 ViewClicksAntiShake.clicksAntiShake(lineFhd, () -> { - selectClarity = 2; - selectClarity(selectClarity); - dismiss(); + + new XPopup.Builder(getContext()) + .asCustom(new HintCustomPopup(getContext()).setCallBack(new HintCustomPopup.HintCustomCallBack() { + @Override + public void onSure() { + selectClarity = 2; + selectClarity(selectClarity); + dismiss(); + } + + @Override + public void onCancel() { + + } + })) + .show(); + + }); if (banSelect == BAN_720) { lineFhd.setEnabled(false); @@ -116,6 +158,12 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl } } + //调用系统函数,字符串转换 long -String KB/MB + private String formateFileSize(long size) { + String fileSize = Formatter.formatFileSize(getContext(), size); + return fileSize.substring(0, fileSize.length() - 3); + } + /** * 状态选择 * @@ -150,6 +198,28 @@ public class LiveClarityCustomPopup extends BottomPopupView implements View.OnCl } } + private Handler netHandler = new Handler(); + private Runnable netRunnable = new Runnable() { + @Override + public void run() { + if (netSpeeds.size() < 11) { + netSpeeds.add(DeviceUtils.getNetSpeed(getContext())); + netHandler.postDelayed(netRunnable, 100); + } else { + long min = Collections.min(netSpeeds); + long max = Collections.max(netSpeeds); + + DoubleSummaryStatistics statistics = netSpeeds.stream().mapToDouble(Number::doubleValue).summaryStatistics(); + netAverage = statistics.getAverage(); + Log.e("网络速度", "最大值:" + max + " 最小值:" + min + " 平均值:" + netAverage); + } + + } + }; + private List netSpeeds = new ArrayList<>(); + private double netAverage = 0; + private void initDate() { + netHandler.postDelayed(netRunnable, 100); } } diff --git a/common/src/main/res/layout/hint_custom_popup.xml b/common/src/main/res/layout/hint_custom_popup.xml new file mode 100644 index 000000000..8b7059e50 --- /dev/null +++ b/common/src/main/res/layout/hint_custom_popup.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/input_custom_popup.xml b/common/src/main/res/layout/input_custom_popup.xml index a7d7aeabb..82ed67cb9 100644 --- a/common/src/main/res/layout/input_custom_popup.xml +++ b/common/src/main/res/layout/input_custom_popup.xml @@ -46,10 +46,10 @@ android:layout_width="87dp" android:layout_height="33dp" android:layout_marginRight="7dp" - android:background="@mipmap/tipbox_btn_gray" + android:background="@drawable/backgroud_live_open_lfet" android:gravity="center" android:text="@string/cancel" - android:textColor="#B1B1B1" + android:textColor="#FFC621" android:textSize="14sp" /> diff --git a/common/src/main/res/values-en/strings.xml b/common/src/main/res/values-en/strings.xml index 6dda75eff..be4a81f99 100644 --- a/common/src/main/res/values-en/strings.xml +++ b/common/src/main/res/values-en/strings.xml @@ -934,4 +934,64 @@ Limited ride And limited avatar frame Blocking gift effects Blocking seat effects If you want to Minimize Play,\nYou can go to set the license. + + + In a batch + Chat + Congratulations %s have won %s in the Lucky Angel! The next lucky angel will be you! + Guardian group %s people + receive + 去完成 + 已領取 + 畫質選擇 + 更多設置 + 查看更多 + 礼物正在获取中... + 開始PK + 剩餘次數:%s + 是否確認進行多人PK(確認後扣除1點次數)當日剩餘次數: %s + 邀請\n主播 + 結束\nPK + 時間 %s + + 接受 + 拒绝 + 坚持拒绝 + 随机PK提示 + + 自動發言機器人設置 + 機器人開關 + 機器人名字設置 + 字數限制2-8個字 + 自動打招呼設置 + 已配置條數 + 自動發消息設置 + 前往設置 + 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 + 添加內容 + 每隔一段時間,機器人自動隨機以下一句話發出。 + 填寫內容推薦,如:求送心願單、加粉絲團等 + 自動發言間隔時間(分鐘) + 最少間隔5分鐘1次 + 當有用戶進入直播間時,機器人會@該用戶並自動 + 隨機以下一句話。最少設置1條,最多20條。 + 機器人設置 + 高清 + 流暢 + 超高清 + 確定清晰度開播後,需要重新開播才能更改 + 開播設置確認 + 清晰度 + 直播頻道 + 開播 + 機器人 + 已設置 + 未設置 + + + 超高清提示 + 在網速不穩定的情況下,選擇超高清將會有可能導致直播間畫面卡頓,是否確認選擇? + 堅持選擇 + 網絡提示 + 系統監測到您的網絡不穩定,設備內存不足將會影響到您的直播流暢度,因此建議您選擇流暢清晰度。 diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index baa28ab81..01237fa89 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -723,7 +723,7 @@ 心願單 娛樂整蠱 多人PK - 随机PK + 随机PK 語音連麥 周星榜 暫時離開 @@ -958,13 +958,13 @@ 換一批 聊聊天 想在其他APP上方也顯示小窗,\n可前往設置進行授權。 - 恭喜 %s 在幸運天使中抽中 %s!下一個幸運天使就是你哦! - 守護團%s人 - 領取 - 去完成 - 已領取 - 畫質選擇 - 更多設置 + 恭喜 %s 在幸運天使中抽中 %s!下一個幸運天使就是你哦! + 守護團%s人 + 領取 + 去完成 + 已領取 + 畫質選擇 + 更多設置 查看更多 礼物正在获取中... 開始PK @@ -974,39 +974,44 @@ 結束\nPK 時間 %s - 接受 - 拒绝 - 坚持拒绝 - 随机PK提示 + 接受 + 拒绝 + 坚持拒绝 + 随机PK提示 - 自動發言機器人設置 - 機器人開關 - 機器人名字設置 - 字數限制2-8個字 - 自動打招呼設置 - 已配置條數 - 自動發消息設置 - 前往設置 - 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 - 添加內容 - 每隔一段時間,機器人自動隨機以下一句話發出。 - 填寫內容推薦,如:求送心願單、加粉絲團等 - 自動發言間隔時間(分鐘) - 最少間隔5分鐘1次 - 當有用戶進入直播間時,機器人會@該用戶並自動 - 隨機以下一句話。最少設置1條,最多20條。 - 機器人設置 - 高清 - 流暢 - 超高清 - 確定清晰度開播後,需要重新開播才能更改 - 開播設置確認 - 清晰度 - 直播頻道 - 開播 - 機器人 - 已設置 - 未設置 - - + 自動發言機器人設置 + 機器人開關 + 機器人名字設置 + 字數限制2-8個字 + 自動打招呼設置 + 已配置條數 + 自動發消息設置 + 前往設置 + 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 + 添加內容 + 每隔一段時間,機器人自動隨機以下一句話發出。 + 填寫內容推薦,如:求送心願單、加粉絲團等 + 自動發言間隔時間(分鐘) + 最少間隔5分鐘1次 + 當有用戶進入直播間時,機器人會@該用戶並自動 + 隨機以下一句話。最少設置1條,最多20條。 + 機器人設置 + 高清 + 流暢 + 超高清 + 確定清晰度開播後,需要重新開播才能更改 + 開播設置確認 + 清晰度 + 直播頻道 + 開播 + 機器人 + 已設置 + 未設置 + + + 超高清提示 + 在網速不穩定的情況下,選擇超高清將會有可能導致直播間畫面卡頓,是否確認選擇? + 堅持選擇 + 網絡提示 + 系統監測到您的網絡不穩定,設備內存不足將會影響到您的直播流暢度,因此建議您選擇流暢清晰度。 diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index f4f8b8178..782aa7d2e 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -112,10 +112,14 @@ import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.util.List; +import java.util.Map; import java.util.Random; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; +import cn.rongcloud.rtc.api.callback.IRCRTCStatusReportListener; +import cn.rongcloud.rtc.api.report.StatusBean; +import cn.rongcloud.rtc.api.report.StatusReport; import cn.rongcloud.rtc.base.RCRTCRect; import cn.rongcloud.rtc.base.RTCErrorCode; import io.rong.imlib.IRongCallback; @@ -208,6 +212,27 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl Bus.getOn(this); Intent intent = getIntent(); initFaceManager(); +// RCRTCEngine.getInstance().registerStatusReportListener(new IRCRTCStatusReportListener() { +// +// @Override +// public void onConnectionStats(StatusReport statusReport) { +// //视频发送信息 +// for (Map.Entry entry : statusReport.statusVideoSends.entrySet()) { +// StatusBean statusBean = entry.getValue(); +// //获取userID +// String userId = statusBean.uid; +// //获取视频 宽x高@帧率 +// String resolution = statusBean.frameWidth + "x" + statusBean.frameHeight + "@" + statusBean.frameRate; +// //获取码率 +// long bitRate = statusBean.bitRate; +// //丢包率 +// long lossRate = statusBean.packetLostRate; +// //带宽 +// String googAvailableSendBandwidth = statusReport.googAvailableSendBandwidth; +// Log.e("网速和内存", "码率:" +bitRate+ " 丢包率:" + lossRate+" 带宽:"+googAvailableSendBandwidth); +// } +// } +// }); leave_img = findViewById(R.id.leave_img); mLiveSDK = intent.getIntExtra(Constants.LIVE_SDK, Constants.LIVE_SDK_KSY); mLiveKsyConfigBean = intent.getParcelableExtra(Constants.LIVE_KSY_CONFIG); diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 202f538fe..f1b802e43 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -9,6 +9,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; +import android.text.format.Formatter; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; @@ -32,6 +34,7 @@ import com.yunbao.common.http.HttpCallback; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.ImageResultCallback; import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.DeviceUtils; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.L; import com.yunbao.common.utils.ProcessImageUtil; @@ -60,9 +63,15 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; +import java.util.Map; import cn.rongcloud.rtc.api.RCRTCEngine; +import cn.rongcloud.rtc.api.callback.IRCRTCStatusReportListener; +import cn.rongcloud.rtc.api.report.StatusBean; +import cn.rongcloud.rtc.api.report.StatusReport; import cn.rongcloud.rtc.api.stream.RCRTCCameraOutputStream; +import cn.rongcloud.rtc.api.stream.RCRTCVideoStreamConfig; +import cn.rongcloud.rtc.base.RCRTCParamsType; public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnClickListener { @@ -202,12 +211,16 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } //设置清晰度 +// DeviceUtils.getMemory(mContext); //获取可用内存 +// DeviceUtils.getNetSpeed(mContext);//获取当前上传网速 +// Log.e("网速和内存", "内存:" + + " 网速:" + DeviceUtils.getNetSpeed(mContext)); + selectClarity = IMLoginManager.get(mContext).getSelectClarity(); setSelectClarity(selectClarity); ViewClicksAntiShake .clicksAntiShake( findViewById(R.id.btn_live_clarity), () -> { - LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, selectClarity); + LiveClarityCustomPopup liveClarityCustomPopup = new LiveClarityCustomPopup(mContext, IMLoginManager.get(mContext).getSelectClarity()); new XPopup.Builder(mContext) .setPopupCallback(new XPopupCallback() { @Override @@ -261,6 +274,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } private void setSelectClarity(int selectClarity) { + this.selectClarity = selectClarity; IMLoginManager.get(mContext).setSelectClarity(selectClarity); switch (selectClarity) { @@ -280,12 +294,43 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl if (liveOpenCustomPopup != null) { liveOpenCustomPopup.setSelectClarity(selectClarity); } + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (selectClarity) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + minRate = 200; + maxRate = 900; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + minRate = 250; + maxRate = 2200; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + minRate = 400; + maxRate = 4000; + break; + } + RCRTCVideoStreamConfig config = + RCRTCVideoStreamConfig.Builder.create() + .setMinRate(minRate) + .setMaxRate(maxRate) + .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_15) + .setVideoResolution(rcrtcVideoResolution) + .build(); + RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(config); } public void setManager(FaceManager manager) { this.manager = manager; } + + @Override public void onClick(View v) { if (!canClick()) { diff --git a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java index 6d0da307f..b7fc7d1cb 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -25,7 +25,6 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.alibaba.fastjson.JSONObject; -import com.makeramen.roundedimageview.RoundedImageView; import com.tencent.liteav.device.TXDeviceManager; import com.tencent.rtmp.ITXLivePushListener; import com.tencent.rtmp.TXLiveConstants; @@ -35,11 +34,11 @@ import com.yunbao.common.Constants; import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.UserBean; import com.yunbao.common.event.AnchorInfoEvent; -import com.yunbao.common.event.FollowEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; import com.yunbao.common.utils.DialogUitl; @@ -72,12 +71,14 @@ import cn.rongcloud.rtc.api.RCRTCRoomConfig; import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; import cn.rongcloud.rtc.api.callback.IRCRTCResultDataCallback; import cn.rongcloud.rtc.api.callback.IRCRTCRoomEventsListener; +import cn.rongcloud.rtc.api.callback.IRCRTCVideoOutputFrameListener; import cn.rongcloud.rtc.api.stream.RCRTCInputStream; import cn.rongcloud.rtc.api.stream.RCRTCLiveInfo; import cn.rongcloud.rtc.api.stream.RCRTCVideoStreamConfig; import cn.rongcloud.rtc.api.stream.RCRTCVideoView; import cn.rongcloud.rtc.base.RCRTCParamsType; import cn.rongcloud.rtc.base.RCRTCRoomType; +import cn.rongcloud.rtc.base.RCRTCVideoFrame; import cn.rongcloud.rtc.base.RTCErrorCode; import cn.rongcloud.rtc.core.CameraVideoCapturer; import cn.rongcloud.rtc.core.RendererCommon; @@ -114,11 +115,11 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Subscribe(threadMode = ThreadMode.MAIN) public void onUPAnchorInfo(AnchorInfoEvent e) { if (e != null) { - if(e.isClear()==false) { + if (e.isClear() == false) { tv_avatarOther_name.setText(e.getUserNiceName()); ImgLoader.displayAvatar(mContext, e.getAvatar(), avatarOther); goto_room_view.setVisibility(View.VISIBLE); - }else{ + } else { goto_room_view.setVisibility(View.GONE); } @@ -417,7 +418,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX @Override public void onConfirmClick(Dialog dialog, String content) { //断开连麦 - LiveRyAnchorActivity.isDRPK=0; + LiveRyAnchorActivity.isDRPK = 0; HttpClient.getInstance().post("livepk.setliveuserout", "livepk.setliveuserout") .execute(new HttpCallback() { @Override @@ -560,16 +561,37 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX RCRTCEngine.getInstance().init(contexts, config); RCRTCEngine.getInstance().getDefaultAudioStream().setAudioQuality(RCRTCParamsType.AudioQuality.MUSIC_HIGH, RCRTCParamsType.AudioScenario.MUSIC_CHATROOM); + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (IMLoginManager.get(mContext).getSelectClarity()) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + minRate = 200; + maxRate = 900; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + minRate = 250; + maxRate = 2200; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + minRate = 400; + maxRate = 4000; + break; + } RCRTCVideoStreamConfig videoConfigBuilder = RCRTCVideoStreamConfig.Builder.create() //设置分辨率 - .setVideoResolution(RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_640) + .setVideoResolution(rcrtcVideoResolution) //设置帧率 .setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_24) //设置最小码率,480P下推荐200 - .setMinRate(250) + .setMinRate(minRate) //设置最大码率,480P下推荐900 - .setMaxRate(5000) + .setMaxRate(maxRate) .build(); // 创建本地视频显示视图 @@ -595,7 +617,6 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX mPreView.addView(rongRTCVideoView); tencentTRTCBeautyManager = new TencentTRTCBeautyManager(mContext); - //加入房间成功后可以通过 RCRTCLocalUser 对象发布本地默认音视频流,包括:麦克风采集的音频和摄像头采集的视频。 RCRTCEngine.getInstance().getDefaultVideoStream().setEncoderMirror(true); if (rtcRoom == null || rtcRoom.getLocalUser() == null) { @@ -615,20 +636,13 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX room.registerRoomListener(roomEventsListener); //美颜 - new Handler(Looper.getMainLooper()).post(new Runnable() { - public void run() { - //旧美颜不需要了 - /*RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(new IRCRTCVideoOutputFrameListener() { - @Override - public RCRTCVideoFrame processVideoFrame(RCRTCVideoFrame rtcVideoFrame) { - // 使用数据进行美颜/录像等处理后,需要把数据再返回给 SDK 做发送。 - rtcVideoFrame.setTextureId(tencentTRTCBeautyManager.renderWithTexture(rtcVideoFrame.getTextureId(), rtcVideoFrame.getWidth(), rtcVideoFrame.getHeight(), false)); - return rtcVideoFrame; - } - });*/ - - } - }); +// new Handler(Looper.getMainLooper()).post(new Runnable() { +// public void run() { +// //旧美颜不需要了 +// +// +// } +// }); } @Override @@ -716,24 +730,38 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX RCRTCMixConfig config = new RCRTCMixConfig(); RCRTCMixConfig.MediaConfig mediaConfig = new RCRTCMixConfig.MediaConfig(); config.setMediaConfig(mediaConfig); -//视频输出配置 + //视频输出配置 RCRTCMixConfig.MediaConfig.VideoConfig videoConfig = new RCRTCMixConfig.MediaConfig.VideoConfig(); mediaConfig.setVideoConfig(videoConfig); -//大流视频的输出参数 + //大流视频的输出参数 RCRTCMixConfig.MediaConfig.VideoConfig.VideoLayout normal = new RCRTCMixConfig.MediaConfig.VideoConfig.VideoLayout(); - videoConfig.setVideoLayout(normal); -//推荐宽、高、帧率参数值可以通过默认视频流的配置获取,也可以根据实际需求来自定义设置 -//如不设置宽高值则服务端将使用默认宽高 360 * 640 -//例:发布的视频分辨率为720 * 1280,如果不设置则观众端看到的视频分辨率为 360 * 640, -//所以如果想让观众端看到的视频分辨率和发布视频分辨率一致,则应从发布的视频流中获取分辨率配置并设置到 mediaConfig 中 - RCRTCVideoStreamConfig defaultVideoConfig = RCRTCEngine.getInstance().getDefaultVideoStream().getVideoConfig(); - int fps = defaultVideoConfig.getVideoFps().getFps(); - int width = 720; - int height = 1280; + + //推荐宽、高、帧率参数值可以通过默认视频流的配置获取,也可以根据实际需求来自定义设置 + //如不设置宽高值则服务端将使用默认宽高 360 * 640 + //例:发布的视频分辨率为720 * 1280,如果不设置则观众端看到的视频分辨率为 360 * 640, + //所以如果想让观众端看到的视频分辨率和发布视频分辨率一致,则应从发布的视频流中获取分辨率配置并设置到 mediaConfig 中 + //設置開播分辨率 + //設置開播分辨率 + RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + int minRate = 200; + int maxRate = 900; + switch (IMLoginManager.get(mContext).getSelectClarity()) { + case 0: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; + break; + case 1: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280; + break; + case 2: + rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_1080_1920; + break; + } + int width = rcrtcVideoResolution.getWidth(); + int height = rcrtcVideoResolution.getHeight(); normal.setWidth(width); //视频宽 normal.setHeight(height); //视频高 - normal.setFps(25); //视频帧率 - + normal.setFps(15); //视频帧率 + videoConfig.setVideoLayout(normal); //2. 合流画布设置 //(请参照画布和声音配置示例代码) //3. 假设以画布设置的宽高为 300 * 300为例(应以真实设置的宽高为准),设置每个视频流小窗口的坐标及宽高 @@ -747,6 +775,16 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX videoLayout1.setY(0); //Y 坐标 videoLayout1.setWidth(720); // 视频窗口的宽 videoLayout1.setHeight(1280); // 视频窗口的高 + RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(new IRCRTCVideoOutputFrameListener() { + @Override + public RCRTCVideoFrame processVideoFrame(RCRTCVideoFrame rtcVideoFrame) { + // 使用数据进行美颜/录像等处理后,需要把数据再返回给 SDK 做发送。 +// rtcVideoFrame.setTextureId(tencentTRTCBeautyManager.renderWithTexture(rtcVideoFrame.getTextureId(), rtcVideoFrame.getWidth(), rtcVideoFrame.getHeight(), false)); + Log.e("视频流", "Width---------------------" + rtcVideoFrame.getWidth()); + Log.e("视频流", "Height---------------------" + rtcVideoFrame.getHeight()); + return rtcVideoFrame; + } + }); //2. 合流画布设置 rcrtcLiveInfo.setMixConfig(config, new IRCRTCResultCallback() { @Override @@ -762,6 +800,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX }); } + } @Override