1.视频基础逻辑

This commit is contained in:
fuenmao 2024-12-03 10:50:34 +08:00
parent 86724ced8f
commit 3cd40b9f9f
3 changed files with 101 additions and 36 deletions

View File

@ -6,7 +6,6 @@ import 'package:get/get.dart';
import 'package:signalr_core/signalr_core.dart';
import 'package:wgshare/common/store/user_store.dart';
import 'package:wgshare/utils/count_microphone_volume.dart';
import 'package:wgshare/utils/storage.dart';
import '../../common/config/request_config.dart';
import '../../common/mixins/request_tool_mixin.dart';
import '../../common/models/common/base_structure_result.dart';
@ -94,6 +93,7 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
void getMeetingRoomAllUser(List<MeetingRoomUser> meetingRoomUsers) async {
state.users.value = meetingRoomUsers;
state.cacheUsers.value = meetingRoomUsers;
doHttpGetTvAnchor();
}
///
@ -172,28 +172,47 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
///
void setCameraOpen(bool isOpen){
state.isOpenCamera.value = isOpen;
setEnableLocalVideo(isOpen);
if(isOpen == true){
state.isOpenCamera.value = true;
setEnableVideo();
setStartPreview();
setClientRole("主播");
changePageState(1);
}else{
state.isOpenCamera.value = false;
setDisablePreview();
}
if(state.isOpenMicrophone.value == false){
setMicrophoneOpen(isOpen);
}
if(isOpen == true){
setClientRole("主播");
changePageState(1);
doHttpGetTvAnchor();
}else{
changePageState(0);
}
doHttpSetCamer();
}
///
void hangUpVideo(){
setDisableVideo();
setDisablePreview();
state.isOpenCamera.value = false;
changePageState(0);
doHttpSetCamer();
}
///
Future<void> doHttpGetTvAnchor() async {
BaseStructureResult res = await getClient().getTvAnchor(state.roomNumber.value);
if(res.data!.toString().length != 9){
state.remoteUid.value = res.data!;
/*var s = 2;
// if(res.data!.toString().length != 9){
if(s == 2){
state.remoteUid.value = "18";
setEnableVideo();
changePageState(1);
/*var isSaveLive = false;
state.isOpenCamera.value = true;
setEnableVideo();
setClientRole("主播");
changePageState(1);
*//*var isSaveLive = false;
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == state.remoteUid.value){
isSaveLive = true;
@ -201,8 +220,14 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
}
if(isSaveLive == true){
changePageState(1);
}*/
}
}*//*
}*/
Future.delayed(const Duration(milliseconds: 500), () {
state.remoteUid.value = "18";
setEnableVideo();
changePageState(1);
});
}
/// --------------------------signalR Socket相关
@ -359,6 +384,31 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
}
});
///
state.hubConnection.value?.on("OperCamera", (e){
// var jsonStr = const Utf8Decoder().convert(json.encode(e?[0]).runes.toList());
var jsonStr = json.encode(e?[0]);
var listDynamic = jsonDecode(jsonStr);
MeetingRoomUser meetingRoomUser = MeetingRoomUser.fromJson(listDynamic);
if(meetingRoomUser.enableCamera == true){
debugPrint("wgs输出===Socket-单独用户开摄像头");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
mru.enableCamera = true;
}
}
state.isOpenCamera.value = true;
}else{
debugPrint("wgs输出===Socket-单独用户闭摄像头");
for(MeetingRoomUser mru in state.cacheUsers.value){
if(mru.uid == meetingRoomUser.uid){
mru.enableCamera = false;
}
}
state.isOpenCamera.value = false;
}
});
///
state.hubConnection.value?.on("ShowUser", (e){
// var jsonStr = const Utf8Decoder().convert(json.encode(e).runes.toList());
@ -571,19 +621,24 @@ class MeetingMainLogic extends GetxController with RequestToolMixin{
}
}
///
Future<void> setEnableLocalVideo(bool enabled) async {
if(enabled == true){
//
await state.rctEngine.value?.enableVideo();
//
await state.rctEngine.value?.startPreview();
}else{
//
await state.rctEngine.value?.disableVideo();
//
await state.rctEngine.value?.stopPreview();
}
///
Future<void> setEnableVideo() async {
await state.rctEngine.value?.enableVideo();
}
///
Future<void> setDisableVideo() async {
await state.rctEngine.value?.disableVideo();
}
///
Future<void> setStartPreview() async {
await state.rctEngine.value?.startPreview();
}
///
Future<void> setDisablePreview() async {
await state.rctEngine.value?.stopPreview();
}
/// /

View File

@ -190,6 +190,9 @@ class MeetingMainPage extends StatelessWidget {
channelId: state.roomNumber.value,
isOpenCamera: state.isOpenCamera.value,
remoteUid: state.remoteUid.value,
onHangUpTap: (){
logic.hangUpVideo();
},
)
: Container()
),

View File

@ -11,15 +11,17 @@ import 'meeting_main_video_state.dart';
class MeetingMainVideoComponent extends StatelessWidget {
MeetingMainVideoComponent(
{super.key,
required this.rtcEngine,
required this.channelId,
required this.isOpenCamera,
required this.remoteUid});
required this.rtcEngine,
required this.channelId,
required this.isOpenCamera,
required this.remoteUid,
required this.onHangUpTap});
final RtcEngine rtcEngine;
final String channelId;
final String remoteUid;
final bool isOpenCamera;
final Function onHangUpTap;
final MeetingMainVideoLogic logic = Get.put(MeetingMainVideoLogic());
final MeetingMainVideoState state = Get.find<MeetingMainVideoLogic>().state;
@ -58,10 +60,15 @@ class MeetingMainVideoComponent extends StatelessWidget {
: const CircularProgressIndicator(),
Positioned(
bottom: 110,
child: Image.asset(
'assets/images/meeting_main_hang_up.png',
width: 50.w,
height: 50.h,
child: GestureDetector(
child: Image.asset(
'assets/images/meeting_main_hang_up.png',
width: 50.w,
height: 50.h,
),
onTap: (){
onHangUpTap();
},
),
),
Positioned(