@@ -10,10 +10,7 @@ import static com.yunbao.live.views.LivePushSwViewHolder.rtcRoom;
import android.app.Dialog ;
import android.content.Context ;
import android.graphics.Bitmap ;
import android.graphics.Canvas ;
import android.graphics.Color ;
import android.graphics.Paint ;
import android.graphics.drawable.ColorDrawable ;
import android.os.Handler ;
import android.os.Looper ;
@@ -85,11 +82,7 @@ import cn.rongcloud.rtc.api.RCRTCOtherRoom;
import cn.rongcloud.rtc.api.RCRTCRemoteUser ;
import cn.rongcloud.rtc.api.callback.IRCRTCOtherRoomEventsListener ;
import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback ;
import cn.rongcloud.rtc.api.callback.IRCRTCResultDataCallback ;
import cn.rongcloud.rtc.api.stream.RCRTCInputStream ;
import cn.rongcloud.rtc.api.stream.RCRTCVideoStreamConfig ;
import cn.rongcloud.rtc.base.RCRTCMediaType ;
import cn.rongcloud.rtc.base.RCRTCRoomType ;
import cn.rongcloud.rtc.base.RTCErrorCode ;
import io.agora.beautyapi.faceunity.agora.SWManager ;
import io.rong.imlib.IRongCallback ;
@@ -150,7 +143,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
private TextView textGrade1 , textGrade2 , textGrade3 , textGrade4 ;
private ImageView imageGrade1 , imageGrade2 , imageGrade3 , imageGrade4 ;
public LivePushSwViewHolder livePushRy ViewHolder ;
public LivePushSwViewHolder livePushSw ViewHolder ;
public static List < RCRTCInputStream > inputStreamList = new ArrayList < > ( ) ;
public static List < RCRTCInputStream > inputStreamList1 = new ArrayList < > ( ) ;
@@ -253,7 +246,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
mIsAnchor = isAnchor ;
mRoot = root ;
mPkContainer = linkMicViewHolder . getPkContainer ( ) ;
livePushRy ViewHolder = linkMicViewHolder ;
livePushSw ViewHolder = linkMicViewHolder ;
mPkTimeString1 = " " ;
mPkTimeString2 = mContext . getString ( R . string . live_pk_time_2 ) ;
//从本地取数据
@@ -385,8 +378,8 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
LinearLayout . LayoutParams params = new LinearLayout . LayoutParams ( LinearLayout . LayoutParams . MATCH_PARENT , mScreenWdith * 720 / 960 ) ;
params . weight = 1 ;
params . topMargin = mContext . getResources ( ) . getDimensionPixelOffset ( R . dimen . live_top ) ;
livePushRy ViewHolder . camera . setLayoutParams ( params ) ;
livePushRy ViewHolder . mPreView1 . setLayoutParams ( params ) ;
livePushSw ViewHolder . camera . setLayoutParams ( params ) ;
livePushSw ViewHolder . mPreView1 . setLayoutParams ( params ) ;
}
Log . i ( " tts2 " , s1 ) ;
@@ -509,8 +502,8 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
public void onLinkDRMicPkApplyOk ( UserBean u ) {
L . eSw ( " onLinkDRMicPkApplyOk(UserBean u) " + u . getUserNiceName ( ) ) ;
int index = 0 ;
if ( livePushRy ViewHolder ! = null ) {
livePushRy ViewHolder . setAnDrPkRtc ( String . valueOf ( u . getId ( ) ) , - 1 ) ;
if ( livePushSw ViewHolder ! = null ) {
livePushSw ViewHolder . setAnDrPkRtc ( String . valueOf ( u . getId ( ) ) , - 1 ) ;
}
final SocketSendBean msg1 = new SocketSendBean ( ) . param ( " _method_ " , SOCKET_LIVE_DRPK )
. param ( " action " , 3 )
@@ -577,7 +570,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
RandomPkManager . getInstance ( ) . setPkStatus ( RandomPkManager . PK_STATUS_START ) ;
LivePushSwViewHolder . btn_close . setVisibility ( View . VISIBLE ) ;
LiveSwAnchorActivity . isDRPK = 1 ;
livePushRy ViewHolder . setAnPkRtc ( u ) ; //设置对方主播视图
livePushSw ViewHolder . setAnPkRtc ( u ) ; //设置对方主播视图
final SocketSendBean msg1 = new SocketSendBean ( )
. param ( " _method_ " , SOCKET_LINK_MIC_PK ) . param ( " action " , 4 )
@@ -595,9 +588,9 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
LinearLayout . LayoutParams params = new LinearLayout . LayoutParams ( LinearLayout . LayoutParams . MATCH_PARENT , mScreenWdith * 720 / 960 ) ;
params . weight = 1 ;
params . topMargin = mContext . getResources ( ) . getDimensionPixelOffset ( R . dimen . live_top ) ;
livePushRy ViewHolder . camera . setLayoutParams ( params ) ;
livePushRy ViewHolder . mPreView1 . setLayoutParams ( params ) ;
livePushRy ViewHolder . mPreView1 . setVisibility ( View . VISIBLE ) ;
livePushSw ViewHolder . camera . setLayoutParams ( params ) ;
livePushSw ViewHolder . mPreView1 . setLayoutParams ( params ) ;
livePushSw ViewHolder . mPreView1 . setVisibility ( View . VISIBLE ) ;
LivePushSwViewHolder . btn_close . setVisibility ( View . VISIBLE ) ;
LiveSwAnchorActivity . isDRPK = 1 ;
@@ -640,7 +633,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
} ) ;
// TODO: 2024/4/12 视图渲染
livePushRy ViewHolder . setAnPkRtc ( bean ) ;
livePushSw ViewHolder . setAnPkRtc ( bean ) ;
new Handler ( Looper . getMainLooper ( ) ) . post ( new Runnable ( ) {
public void run ( ) {
Bus . get ( ) . post ( new LiveAudienceEvent ( ) . setType ( LiveAudienceEvent . LiveAudienceType . UN_LEAVELIVE ) ) ;
@@ -653,71 +646,6 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
} ) ;
}
//与用户连麦
public void setUserMic ( String liveid ) {
JSONObject msg1 = new JSONObject ( ) ;
msg1 . put ( " uid " , CommonAppConfig . getInstance ( ) . getUid ( ) ) ;
msg1 . put ( " pkuid " , CommonAppConfig . getInstance ( ) . getUid ( ) ) ;
msg1 . put ( " pkhead " , CommonAppConfig . getInstance ( ) . getUserBean ( ) . getAvatarThumb ( ) ) ;
msg1 . put ( " pkname " , CommonAppConfig . getInstance ( ) . getUserBean ( ) . getUserNiceName ( ) ) ;
rtcRoom . getLocalUser ( ) . responseJoinOtherRoom ( liveid , liveid , true , true , msg1 . toString ( ) , new IRCRTCResultCallback ( ) {
@Override
public void onSuccess ( ) {
RCRTCEngine . getInstance ( ) . joinOtherRoom ( liveid , new IRCRTCResultDataCallback < RCRTCOtherRoom > ( ) {
@Override
public void onSuccess ( RCRTCOtherRoom rcrtcOtherRoom ) {
rcrtcOtherRoom . registerOtherRoomEventsListener ( otherRoomEventsListener ) ;
ToastUtil . show ( WordUtil . isNewZh ( ) ? " 接受成功 " : " Success " ) ;
new Handler ( Looper . getMainLooper ( ) ) . post ( new Runnable ( ) {
public void run ( ) {
Log . e ( " ry " , liveid + " 来了!!!! " + rcrtcOtherRoom . getRemoteUsers ( ) . size ( ) ) ;
for ( int i = 0 ; i < rcrtcOtherRoom . getRemoteUsers ( ) . size ( ) ; i + + ) {
//遍历远端用户发布的资源列表
for ( RCRTCInputStream stream : rcrtcOtherRoom . getRemoteUsers ( ) . get ( i ) . getStreams ( ) ) {
Log . e ( " ry " , stream . getMediaType ( ) + " rcrtcOtherRoom成功 : " + rcrtcOtherRoom . getRemoteUsers ( ) . size ( ) ) ;
if ( stream . getMediaType ( ) = = RCRTCMediaType . AUDIO ) {
//音频只需要订阅
inputStreamList . add ( stream ) ;
}
}
}
Log . e ( " ry " , " asa " + inputStreamList . size ( ) ) ;
//开始订阅资源
rtcRoom . getLocalUser ( ) . subscribeStreams ( inputStreamList , new IRCRTCResultCallback ( ) {
@Override
public void onSuccess ( ) {
}
@Override
public void onFailed ( RTCErrorCode rtcErrorCode ) {
Log . e ( " ry " , " 订阅资源失败: " + rtcErrorCode ) ;
ToastUtil . show ( mContext . getString ( R . string . live_pk_link_error ) ) ;
}
} ) ;
}
} ) ;
}
@Override
public void onFailed ( RTCErrorCode rtcErrorCode ) {
Log . e ( " ry " , liveid + " 加入其他房间失败 : " + rtcErrorCode ) ;
Log . i ( " ry " , liveid + " 加入其他房间失败 : " + rtcErrorCode ) ;
}
} ) ;
}
@Override
public void onFailed ( RTCErrorCode errorCode ) {
ToastUtil . show ( " 接受失败 " ) ;
}
} ) ;
}
/**
* 显示申请PK的弹窗
*/
@@ -800,25 +728,6 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
}
}
public static Bitmap fromText ( float textSize , String text ) {
Paint paint = new Paint ( ) ;
paint . setTextSize ( textSize ) ;
paint . setTextAlign ( Paint . Align . LEFT ) ;
paint . setColor ( Color . BLACK ) ;
Paint . FontMetricsInt fm = paint . getFontMetricsInt ( ) ;
int width = ( int ) paint . measureText ( text ) ;
int height = fm . descent - fm . ascent ;
Bitmap bitmap = Bitmap . createBitmap ( width , height , Bitmap . Config . ARGB_8888 ) ;
Canvas canvas = new Canvas ( bitmap ) ;
canvas . drawText ( text , 0 , fm . leading - fm . ascent , paint ) ;
canvas . save ( ) ;
return bitmap ;
}
private String TAG = " 多人PK " ;
/**
@@ -834,11 +743,11 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
public void run ( ) {
if ( btn_close ! = null ) {
btn_close . setVisibility ( View . GONE ) ;
livePushRy ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
livePushSw ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
}
}
} ) ;
livePushRy ViewHolder . exitChannelDrPk ( drPkbeans ) ;
livePushSw ViewHolder . exitChannelDrPk ( drPkbeans ) ;
leaveHandler . removeCallbacks ( leaveRunnable ) ;
}
@@ -847,17 +756,17 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
@Override
public void run ( ) {
//恢复全屏画面
livePushRy ViewHolder . dr_pk_view . setVisibility ( View . GONE ) ;
livePushSw ViewHolder . dr_pk_view . setVisibility ( View . GONE ) ;
//删除之前其他主播的画面
livePushRy ViewHolder . dr1_preview . removeAllViews ( ) ;
livePushRy ViewHolder . dr2_preview . removeAllViews ( ) ;
livePushRy ViewHolder . dr3_preview . removeAllViews ( ) ;
livePushRy ViewHolder . dr4_preview . removeAllViews ( ) ;
livePushRy ViewHolder . cameraPreview3 . removeAllViews ( ) ;
livePushSw ViewHolder . dr1_preview . removeAllViews ( ) ;
livePushSw ViewHolder . dr2_preview . removeAllViews ( ) ;
livePushSw ViewHolder . dr3_preview . removeAllViews ( ) ;
livePushSw ViewHolder . dr4_preview . removeAllViews ( ) ;
livePushSw ViewHolder . cameraPreview3 . removeAllViews ( ) ;
leaveHandler . removeCallbacks ( leaveRunnable ) ;
livePushRy ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
livePushRy ViewHolder . mPreView . removeView ( detailsView1 ) ;
livePushRy ViewHolder . cameraPreview3 . setVisibility ( View . GONE ) ;
livePushSw ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
livePushSw ViewHolder . mPreView . removeView ( detailsView1 ) ;
livePushSw ViewHolder . cameraPreview3 . setVisibility ( View . GONE ) ;
}
} ;
@@ -1083,7 +992,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
} ) ;
//
int index = livePushRy ViewHolder . setAnDrPkRtc ( String . valueOf ( drPkbeans . get ( i ) . getId ( ) ) , - 1 ) ;
int index = livePushSw ViewHolder . setAnDrPkRtc ( String . valueOf ( drPkbeans . get ( i ) . getId ( ) ) , - 1 ) ;
L . eSw ( " onLinkDRMicPkApplyOk(UserBean u)-点击接收 1 " + u . getUserNiceName ( ) ) ;
L . eSw ( " 發送action = 2 " ) ;
@@ -1308,7 +1217,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
public void setMyDrPkDetailsView ( ) {
if ( detailsView1 ! = null ) {
livePushRy ViewHolder . dr1_preview . removeView ( detailsView1 ) ;
livePushSw ViewHolder . dr1_preview . removeView ( detailsView1 ) ;
}
detailsView1 = LayoutInflater . from ( mContext ) . inflate ( R . layout . view_live_pk_details , null ) ;
detailsLinearLayout1 = detailsView1 . findViewById ( R . id . lin_pk1 ) ;
@@ -1317,7 +1226,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
textGrade1 = detailsView1 . findViewById ( R . id . text_grade1 ) ;
textPkName1 = detailsView1 . findViewById ( R . id . text_pk_name1 ) ;
imageGrade1 . setTag ( String . valueOf ( IMLoginManager . get ( mContext ) . getUserInfo ( ) . getId ( ) ) ) ;
livePushRy ViewHolder . dr1_preview . addView ( detailsView1 ) ;
livePushSw ViewHolder . dr1_preview . addView ( detailsView1 ) ;
detailsLinearLayout1 . setVisibility ( View . GONE ) ;
linearGrade1 . setVisibility ( View . GONE ) ;
}
@@ -1361,7 +1270,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
L . eSw ( " j == 0: " + j ) ;
//设置多人PK数据
if ( detailsView2 ! = null ) {
livePushRy ViewHolder . dr2_preview . removeView ( detailsView2 ) ;
livePushSw ViewHolder . dr2_preview . removeView ( detailsView2 ) ;
}
detailsView2 = LayoutInflater . from ( mContext ) . inflate ( R . layout . view_live_pk_details , null ) ;
detailsLinearLayout2 = detailsView2 . findViewById ( R . id . lin_pk2 ) ;
@@ -1371,13 +1280,13 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
textGrade2 = detailsView2 . findViewById ( R . id . text_grade2 ) ;
imageGrade2 . setTag ( String . valueOf ( drPkbeanList . get ( 0 ) . getId ( ) ) ) ;
textPkName2 . setText ( drPkbeanList . get ( 0 ) . getUser_nicename ( ) ) ;
livePushRy ViewHolder . dr2_preview . addView ( detailsView2 ) ;
livePushSw ViewHolder . dr2_preview . addView ( detailsView2 ) ;
detailsLinearLayout2 . setVisibility ( View . GONE ) ;
linearGrade2 . setVisibility ( View . GONE ) ;
} else if ( j = = 1 ) {
L . eSw ( " j == 1: " + j ) ;
if ( detailsView4 ! = null ) {
livePushRy ViewHolder . dr4_preview . removeView ( detailsView4 ) ;
livePushSw ViewHolder . dr4_preview . removeView ( detailsView4 ) ;
}
detailsView4 = LayoutInflater . from ( mContext ) . inflate ( R . layout . view_live_pk_details , null ) ;
detailsLinearLayout4 = detailsView4 . findViewById ( R . id . lin_pk4 ) ;
@@ -1387,14 +1296,14 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
textGrade4 = detailsView4 . findViewById ( R . id . text_grade4 ) ;
imageGrade4 . setTag ( String . valueOf ( drPkbeanList . get ( 1 ) . getId ( ) ) ) ;
textPkName4 . setText ( drPkbeanList . get ( 1 ) . getUser_nicename ( ) ) ;
livePushRy ViewHolder . dr4_preview . addView ( detailsView4 ) ;
livePushSw ViewHolder . dr4_preview . addView ( detailsView4 ) ;
detailsLinearLayout4 . setVisibility ( View . GONE ) ;
linearGrade4 . setVisibility ( View . GONE ) ;
} else if ( j = = 2 ) {
L . eSw ( " j == 2: " + j ) ;
if ( detailsView4 ! = null ) {
livePushRy ViewHolder . dr4_preview . removeView ( detailsView4 ) ;
livePushSw ViewHolder . dr4_preview . removeView ( detailsView4 ) ;
}
detailsView4 = LayoutInflater . from ( mContext ) . inflate ( R . layout . view_live_pk_details , null ) ;
detailsLinearLayout4 = detailsView4 . findViewById ( R . id . lin_pk4 ) ;
@@ -1404,12 +1313,12 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
textGrade4 = detailsView4 . findViewById ( R . id . text_grade4 ) ;
imageGrade4 . setTag ( String . valueOf ( drPkbeanList . get ( 2 ) . getId ( ) ) ) ;
textPkName4 . setText ( drPkbeanList . get ( 2 ) . getUser_nicename ( ) ) ;
livePushRy ViewHolder . dr4_preview . addView ( detailsView4 ) ;
livePushSw ViewHolder . dr4_preview . addView ( detailsView4 ) ;
detailsLinearLayout4 . setVisibility ( View . GONE ) ;
linearGrade4 . setVisibility ( View . GONE ) ;
if ( detailsView3 ! = null ) {
livePushRy ViewHolder . dr3_preview . removeView ( detailsView3 ) ;
livePushSw ViewHolder . dr3_preview . removeView ( detailsView3 ) ;
}
detailsView3 = LayoutInflater . from ( mContext ) . inflate ( R . layout . view_live_pk_details , null ) ;
detailsLinearLayout3 = detailsView3 . findViewById ( R . id . lin_pk3 ) ;
@@ -1419,7 +1328,7 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
textGrade3 = detailsView3 . findViewById ( R . id . text_grade3 ) ;
imageGrade3 . setTag ( String . valueOf ( drPkbeanList . get ( 1 ) . getId ( ) ) ) ;
textPkName3 . setText ( drPkbeanList . get ( 1 ) . getUser_nicename ( ) ) ;
livePushRy ViewHolder . dr3_preview . addView ( detailsView3 ) ;
livePushSw ViewHolder . dr3_preview . addView ( detailsView3 ) ;
detailsLinearLayout3 . setVisibility ( View . GONE ) ;
linearGrade3 . setVisibility ( View . GONE ) ;
@@ -1434,326 +1343,6 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
}
/**
* 多人PK PK主播发过来的已经接受
*/
public void onDRLinkMicToPk ( String u ) {
Log . e ( " eve " , u + " " ) ;
/**
* 加入副房间
*
* 前提必须已经 通过 {@link RCRTCEngine#joinRoom(String, RCRTCRoomType, IRCRTCResultDataCallback)} 或 {@link RCRTCEngine#joinRoom(String, IRCRTCResultDataCallback)} 加入了主房间
*
* @param roomId 房间 ID ,长度 64 个字符,可包含:`A-Z`、`a-z`、`0-9`、`+`、`=`、`-`、`_`
* @param callBack 加入房间回调
* @group 房间管理
*/
/*RCRTCEngine.getInstance().joinOtherRoom(u, new IRCRTCResultDataCallback<RCRTCOtherRoom>() {
@Override
public void onSuccess(RCRTCOtherRoom rcrtcOtherRoom) {
rcrtcOtherRoom.registerOtherRoomEventsListener(otherRoomEventsListener);
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
if (livePushRyViewHolder.dr_pk_view.getVisibility() == View.GONE) {
ScreenDimenUtil util = ScreenDimenUtil.getInstance();
int mScreenWdith = util.getScreenWdith();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960);
params.weight = 1;
params.topMargin = DpUtil.dp2px(123);
livePushRyViewHolder.dr_pk_view.setLayoutParams(params);
livePushRyViewHolder.camera.setLayoutParams(params);
livePushRyViewHolder.dr_pk_view.setVisibility(View.VISIBLE);
livePushRyViewHolder.dr1_preview.setVisibility(View.GONE);
livePushRyViewHolder.dr2_preview.setVisibility(View.GONE);
livePushRyViewHolder.dr3_preview.setVisibility(View.GONE);
livePushRyViewHolder.dr4_preview.setVisibility(View.GONE);
detailsView1 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null);
detailsLinearLayout1 = detailsView1.findViewById(R.id.lin_pk1);
linearGrade1 = detailsView1.findViewById(R.id.linear_grade1);
imageGrade1 = detailsView1.findViewById(R.id.image_grade1);
textGrade1 = detailsView1.findViewById(R.id.text_grade1);
imageGrade1.setTag(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId()));
livePushRyViewHolder.mPreView.addView(detailsView1);
detailsLinearLayout1.setVisibility(View.VISIBLE);
linearGrade1.setVisibility(View.GONE);
}
//遍历远端用户列表
for (int i = 0; i < rcrtcOtherRoom.getRemoteUsers().size(); i++) {
//遍历远端用户发布的资源列表
for (RCRTCInputStream stream : rcrtcOtherRoom.getRemoteUsers().get(i).getStreams()) {
Log.e("ry111", stream.getMediaType() + "");
if (stream.getMediaType() == RCRTCMediaType.VIDEO) {
if (inputStreamList.size() == 0) {
livePushRyViewHolder.dr1_preview.setVisibility(View.VISIBLE);
//如果远端用户发布的是视频流, 创建显示视图RCRTCVideoView, 并添加到布局中显示
RCRTCVideoView remoteView = new RCRTCVideoView(contexts);
((RCRTCVideoInputStream) stream).setVideoView(remoteView);
//todo 本demo只演示添加1个远端用户的视图
livePushRyViewHolder.dr1_preview.removeAllViews();
remoteView.setScalingType(SCALE_ASPECT_FILL);
livePushRyViewHolder.dr1_preview.addView(remoteView);
LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback<LiveInfoModel>() {
@Override
public void onSuccess(LiveInfoModel data) {
detailsView2 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null);
detailsLinearLayout2 = detailsView2.findViewById(R.id.lin_pk2);
linearGrade2 = detailsView2.findViewById(R.id.linear_grade2);
textPkName2 = detailsView2.findViewById(R.id.text_pk_name2);
imageGrade2 = detailsView2.findViewById(R.id.image_grade2);
textGrade2 = detailsView2.findViewById(R.id.text_grade2);
imageGrade2.setTag(String.valueOf(u));
textPkName2.setText(data.getUserNicename());
livePushRyViewHolder.dr1_preview.addView(detailsView2);
detailsLinearLayout2.setVisibility(View.VISIBLE);
linearGrade2.setVisibility(View.GONE);
}
@Override
public void onError(String error) {
}
});
} else if (inputStreamList.size() == 1) {
livePushRyViewHolder.dr3_preview.setVisibility(View.VISIBLE);
//如果远端用户发布的是视频流, 创建显示视图RCRTCVideoView, 并添加到布局中显示
RCRTCVideoView remoteView = new RCRTCVideoView(contexts);
((RCRTCVideoInputStream) stream).setVideoView(remoteView);
//todo 本demo只演示添加1个远端用户的视图
livePushRyViewHolder.dr3_preview.removeAllViews();
remoteView.setScalingType(SCALE_ASPECT_FILL);
livePushRyViewHolder.dr3_preview.addView(remoteView);
LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback<LiveInfoModel>() {
@Override
public void onSuccess(LiveInfoModel data) {
detailsView4 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null);
detailsLinearLayout4 = detailsView4.findViewById(R.id.lin_pk4);
linearGrade4 = detailsView4.findViewById(R.id.linear_grade4);
textPkName4 = detailsView4.findViewById(R.id.text_pk_name4);
imageGrade4 = detailsView4.findViewById(R.id.image_grade4);
textGrade4 = detailsView4.findViewById(R.id.text_grade4);
imageGrade4.setTag(u);
textPkName4.setText(data.getUserNicename());
livePushRyViewHolder.dr3_preview.addView(detailsView4);
detailsLinearLayout4.setVisibility(View.VISIBLE);
linearGrade4.setVisibility(View.GONE);
}
@Override
public void onError(String error) {
}
});
} else if (inputStreamList.size() == 2) {
livePushRyViewHolder.cameraPreview3.setVisibility(View.VISIBLE);
//如果远端用户发布的是视频流, 创建显示视图RCRTCVideoView, 并添加到布局中显示
RCRTCVideoView remoteView = new RCRTCVideoView(contexts);
((RCRTCVideoInputStream) stream).setVideoView(remoteView);
//todo 本demo只演示添加1个远端用户的视图
livePushRyViewHolder.cameraPreview3.removeAllViews();
remoteView.setScalingType(SCALE_ASPECT_FILL);
livePushRyViewHolder.cameraPreview3.addView(remoteView);
LiveNetManager.get(mContext).getLiveInfo(u, new com.yunbao.common.http.base.HttpCallback<LiveInfoModel>() {
@Override
public void onSuccess(LiveInfoModel data) {
detailsView3 = LayoutInflater.from(mContext).inflate(R.layout.view_live_pk_details, null);
detailsLinearLayout3 = detailsView3.findViewById(R.id.lin_pk3);
linearGrade3 = detailsView3.findViewById(R.id.linear_grade3);
textPkName3 = detailsView3.findViewById(R.id.text_pk_name3);
imageGrade3 = detailsView3.findViewById(R.id.image_grade3);
textGrade3 = detailsView3.findViewById(R.id.text_grade3);
imageGrade3.setTag(u);
textPkName3.setText(data.getUserNicename());
livePushRyViewHolder.cameraPreview3.addView(detailsView3);
detailsLinearLayout3.setVisibility(View.VISIBLE);
linearGrade3.setVisibility(View.GONE);
}
@Override
public void onError(String error) {
}
});
}
inputStreamList.add(stream);
}
inputStreamList1.add(stream);
}
//开始订阅资源
rtcRoom.getLocalUser().subscribeStreams(inputStreamList1, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
Log.i("ry", "订阅资源成功");
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
Log.i("ry", "订阅资源失败: " + rtcErrorCode.getReason());
ToastUtil.show(mContext.getString(R.string.live_pk_link_error));
}
});
//2. 合流画布设置
rcrtcLiveInfo.setMixConfig(create_Custom_MixConfig(false, inputStreamList), new IRCRTCResultCallback() {
@Override
public void onSuccess() {
Log.e("ry", inputStreamList.size() + "混成功" + u);
}
@Override
public void onFailed(RTCErrorCode errorCode) {
Log.e("ry", "混失败" + errorCode);
}
});
}
}
});
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
Log.i("ry", "加入其他房间失败 : " + rtcErrorCode.getReason());
}
});*/
}
/**
* 创建自定义合流布局配置
*
* @param isCrop 是否裁减画布
* @param streams 必须为视频流列表
* @return
*/
private RCRTCMixConfig create_Custom_MixConfig ( boolean isCrop , List < RCRTCInputStream > streams ) {
Log . e ( " 视频合流 " , streams . toString ( ) ) ;
Log . e ( " 视频合流 " , " 视频长度: " + streams . size ( ) ) ;
RCRTCMixConfig config = new RCRTCMixConfig ( ) ;
//1. 设置自定义合流布局模式
config . setLayoutMode ( RCRTCMixConfig . MixLayoutMode . CUSTOM ) ;
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 = 960 ;
int height = 720 ;
normal . setWidth ( width ) ; //视频宽
normal . setHeight ( height ) ; //视频高
normal . setFps ( fps ) ; //视频帧率
//2. 合流画布设置
//(请参照画布和声音配置示例代码)
//3. 假设以画布设置的宽高为 300 * 300为例(应以真实设置的宽高为准),设置每个视频流小窗口的坐标及宽高
ArrayList < RCRTCMixConfig . CustomLayoutList . CustomLayout > list = new ArrayList < > ( ) ;
if ( streams . size ( ) = = 1 ) {
//user1的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout1 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout1 . setVideoStream ( RCRTCEngine . getInstance ( ) . getDefaultVideoStream ( ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout1 . setX ( 0 ) ; //X 坐标
videoLayout1 . setY ( 0 ) ; //Y 坐标
videoLayout1 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout1 . setHeight ( 720 ) ; // 视频窗口的高
list . add ( videoLayout1 ) ;
//user2的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout2 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout2 . setVideoStream ( streams . get ( 0 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout2 . setX ( 480 ) ; //X 坐标
videoLayout2 . setY ( 0 ) ; //Y 坐标
videoLayout2 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout2 . setHeight ( 720 ) ; // 视频窗口的高
list . add ( videoLayout2 ) ;
} else if ( streams . size ( ) = = 2 ) {
//user1的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout1 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
list . add ( videoLayout1 ) ;
videoLayout1 . setVideoStream ( RCRTCEngine . getInstance ( ) . getDefaultVideoStream ( ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout1 . setX ( 0 ) ; //X 坐标
videoLayout1 . setY ( 0 ) ; //Y 坐标
videoLayout1 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout1 . setHeight ( 720 ) ; // 视频窗口的高
//user2的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout2 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout2 . setVideoStream ( streams . get ( 0 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout2 . setX ( 480 ) ; //X 坐标
videoLayout2 . setY ( 0 ) ; //Y 坐标
videoLayout2 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout2 . setHeight ( 360 ) ; // 视频窗口的高
list . add ( videoLayout2 ) ;
//user3的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout3 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout3 . setVideoStream ( streams . get ( 1 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout3 . setX ( 480 ) ; //X 坐标
videoLayout3 . setY ( 360 ) ; //Y 坐标
videoLayout3 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout3 . setHeight ( 360 ) ; // 视频窗口的高
list . add ( videoLayout3 ) ;
} else if ( streams . size ( ) = = 3 ) {
//user1的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout1 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout1 . setVideoStream ( RCRTCEngine . getInstance ( ) . getDefaultVideoStream ( ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout1 . setX ( 0 ) ; //X 坐标
videoLayout1 . setY ( 0 ) ; //Y 坐标
videoLayout1 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout1 . setHeight ( 720 ) ; // 视频窗口的高
list . add ( videoLayout1 ) ;
//user2的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout2 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout2 . setVideoStream ( streams . get ( 0 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout2 . setX ( 480 ) ; //X 坐标
videoLayout2 . setY ( 0 ) ; //Y 坐标
videoLayout2 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout2 . setHeight ( 360 ) ; // 视频窗口的高
list . add ( videoLayout2 ) ;
//user3的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout3 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout3 . setVideoStream ( streams . get ( 1 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout3 . setX ( 480 ) ; //X 坐标
videoLayout3 . setY ( 360 ) ; //Y 坐标
videoLayout3 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout3 . setHeight ( 360 ) ; // 视频窗口的高
list . add ( videoLayout3 ) ;
//user3的视频流
RCRTCMixConfig . CustomLayoutList . CustomLayout videoLayout4 = new RCRTCMixConfig . CustomLayoutList . CustomLayout ( ) ;
videoLayout4 . setVideoStream ( streams . get ( 2 ) ) ; // RCRTCStream#MediaType 必须是Video
videoLayout4 . setX ( 0 ) ; //X 坐标
videoLayout4 . setY ( 360 ) ; //Y 坐标
videoLayout4 . setWidth ( 480 ) ; // 视频窗口的宽
videoLayout4 . setHeight ( 360 ) ; // 视频窗口的高
list . add ( videoLayout4 ) ;
}
config . setCustomLayouts ( list ) ;
return config ;
}
@Override
public void onClick ( View v ) {
int i = v . getId ( ) ;
@@ -2092,18 +1681,18 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
String userID1 = ( String ) imageGrade1 . getTag ( ) ;
String userID2 = ( String ) imageGrade2 . getTag ( ) ;
String userID4 = ( String ) imageGrade4 . getTag ( ) ;
if ( livePushRy ViewHolder . timeTitle . getVisibility ( ) = = View . GONE ) {
if ( livePushSw ViewHolder . timeTitle . getVisibility ( ) = = View . GONE ) {
mHandler . removeMessages ( WHAT_PK_TIME2 ) ;
RelativeLayout . LayoutParams layoutParams = ( RelativeLayout . LayoutParams ) livePushRy ViewHolder . timeTitle . getLayoutParams ( ) ;
RelativeLayout . LayoutParams layoutParams = ( RelativeLayout . LayoutParams ) livePushSw ViewHolder . timeTitle . getLayoutParams ( ) ;
layoutParams . topMargin = DpUtil . dp2px ( 123 ) ;
livePushRy ViewHolder . timeTitle . setLayoutParams ( layoutParams ) ;
livePushRy ViewHolder . timeTitle . setVisibility ( View . VISIBLE ) ;
livePushSw ViewHolder . timeTitle . setLayoutParams ( layoutParams ) ;
livePushSw ViewHolder . timeTitle . setVisibility ( View . VISIBLE ) ;
String pkTime = StringUtil . getDurationText ( time * 1000 ) ;
livePushRy ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , pkTime ) ) ;
livePushSw ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , pkTime ) ) ;
mPkTimeCount = time ;
if ( time > 0 ) {
String s1 = StringUtil . getDurationText ( mPkTimeCount * 1000 ) ;
livePushRy ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , s1 ) ) ;
livePushSw ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , s1 ) ) ;
mHandler . sendEmptyMessage ( WHAT_PK_TIME2 ) ;
}
}
@@ -2304,11 +1893,11 @@ public class LiveSwLinkMicPkPresenter implements View.OnClickListener {
if ( mPkTimeCount > 0 ) { //
if ( mHandler ! = null ) {
String s1 = StringUtil . getDurationText ( mPkTimeCount * 1000 ) ;
livePushRy ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , s1 ) ) ;
livePushSw ViewHolder . textTime . setText ( String . format ( mContext . getString ( R . string . pk_time ) , s1 ) ) ;
mHandler . sendEmptyMessageAtTime ( WHAT_PK_TIME2 , getNextSecondTime ( ) ) ;
}
} else {
livePushRy ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
livePushSw ViewHolder . timeTitle . setVisibility ( View . GONE ) ;
if ( mHandler ! = null ) {
mHandler . removeCallbacksAndMessages ( null ) ;
}