Some time during call video of participants swaps between Particippants
cg-sangam opened this issue · 2 comments
When call gets connected after enabling video some time participants video get swaps .
My video sdk version 1.0.9
my flutter doctor
[!] Flutter (Channel stable, 3.7.3, on macOS 13.0.1 22A400 darwin-arm64, locale
en-IN)
! Warning: dart
on your path resolves to
/opt/homebrew/Cellar/dart/2.18.5/libexec/bin/dart, which is not inside
your current Flutter SDK checkout at
/Users/macintosh/Desktop/Sangam/flutter_sdk/flutter. Consider adding
/Users/macintosh/Desktop/Sangam/flutter_sdk/flutter/bin to the front of
your path.
[!] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
✗ cmdline-tools component is missing
Run path/to/sdkmanager --install "cmdline-tools;latest"
See https://developer.android.com/studio/command-line for more details.
✗ Android license status unknown.
Run flutter doctor --android-licenses
to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/macos#android-setup for
more details.
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.3)
[✓] VS Code (version 1.75.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability
My flutter code impelementation
Room room = VideoSDK.createRoom(
roomId: GroupSharingApi.instance.meetingId,
token: GroupSharingApi.instance.videoSDKToken,
displayName: '${_profile.firstName} ${_profile.lastName}',
micEnabled: widget.micEnabled,
camEnabled: widget.camEnabled,
maxResolution: 'hd',
multiStream: true,
participantId: _userId,
defaultCameraIndex: 1,
notification: const NotificationInfo(
title: "Video SDK",
message: "Video SDK is sharing screen in the meeting",
icon: "notification_share", // drawable icon name
),
);
// Register meeting events
registerMeetingEvents(room);
and participant grid UI Code:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:videosdk/videosdk.dart';
import 'package:creatics_mobile/group_sharing/video_sdk/widgets/conference-call-participant-grid/participant_grid_tile.dart';
class ConferenceParticipantGrid extends StatefulWidget {
final Room meeting;
const ConferenceParticipantGrid({Key? key, required this.meeting}) : super(key: key);
@OverRide
State createState() => _ConferenceParticipantGridState();
}
class _ConferenceParticipantGridState extends State {
late Participant localParticipant;
String? activeSpeakerId;
String? presenterId;
int numberofColumns = 1;
int numberOfMaxOnScreenParticipants = 6;
String quality = "high";
Map<String, Participant> participants = {};
Map<String, Participant> onScreenParticipants = {};
@OverRide
void initState() {
localParticipant = widget.meeting.localParticipant;
participants.putIfAbsent(localParticipant.id, () => localParticipant);
participants.addAll(widget.meeting.participants);
presenterId = widget.meeting.activePresenterId;
updateOnScreenParticipants();
// Setting meeting event listeners
setMeetingListeners(widget.meeting);
super.initState();
}
@OverRide
void setState(fn) {
if (mounted) {
super.setState(fn);
}
}
@OverRide
Widget build(BuildContext context) {
return GridView.builder(
shrinkWrap: true,
itemCount: onScreenParticipants.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 4.0,
mainAxisSpacing: 4.0
), itemBuilder: (BuildContext context, int index){
return ParticipantGridTile(
participant: onScreenParticipants.values.toList()[index],
quality: quality,
activeSpeakerId: activeSpeakerId);
});
}
void setMeetingListeners(Room _meeting) {
// Called when participant joined meeting
_meeting.on(
Events.participantJoined,
(Participant participant) {
final newParticipants = participants;
newParticipants[participant.id] = participant;
setState(() {
participants = newParticipants;
updateOnScreenParticipants();
});
},
);
// Called when participant left meeting
_meeting.on(
Events.participantLeft,
(participantId) {
final newParticipants = participants;
newParticipants.remove(participantId);
setState(() {
participants = newParticipants;
updateOnScreenParticipants();
});
},
);
_meeting.on(
Events.speakerChanged,
(_activeSpeakerId) {
setState(() {
activeSpeakerId = _activeSpeakerId;
updateOnScreenParticipants();
});
},
);
_meeting.on(Events.presenterChanged, (_presenterId) {
setState(() {
presenterId = _presenterId;
numberOfMaxOnScreenParticipants = _presenterId != null ? 2 : 6;
updateOnScreenParticipants();
});
});
// Called when speaker is changed
_meeting.on(Events.speakerChanged, (_activeSpeakerId) {
setState(() {
activeSpeakerId = _activeSpeakerId;
});
});
_meeting.localParticipant.on(Events.streamEnabled, (Stream stream) {
if (stream.kind == "share") {
setState(() {
numberOfMaxOnScreenParticipants = 2;
updateOnScreenParticipants();
});
}
});
_meeting.localParticipant.on(Events.streamDisabled, (Stream stream) {
if (stream.kind == "share") {
setState(() {
numberOfMaxOnScreenParticipants = 6;
updateOnScreenParticipants();
});
}
});
}
updateOnScreenParticipants() {
Map<String, Participant> newScreenParticipants = <String, Participant>{};
participants.values
.toList()
.sublist(
0,
participants.length > numberOfMaxOnScreenParticipants
? numberOfMaxOnScreenParticipants
: participants.length)
.forEach((participant) {
newScreenParticipants.putIfAbsent(participant.id, () => participant);
});
if (!newScreenParticipants.containsKey(activeSpeakerId) && activeSpeakerId != null) {
newScreenParticipants.remove(newScreenParticipants.keys.last);
newScreenParticipants.putIfAbsent(
activeSpeakerId!, () => participants.values.firstWhere((element) => element.id == activeSpeakerId));
}
if (!listEquals(newScreenParticipants.keys.toList(), onScreenParticipants.keys.toList())) {
setState(() {
onScreenParticipants = newScreenParticipants;
quality = newScreenParticipants.length > 4
? "low"
: newScreenParticipants.length > 2
? "medium"
: "high";
});
}
if (numberofColumns !=
(newScreenParticipants.length > 2 || numberOfMaxOnScreenParticipants == 2 ? 2 : 1)) {
setState(() {
numberofColumns = newScreenParticipants.length > 2 || numberOfMaxOnScreenParticipants == 2 ? 2 : 1;
});
}
}
}
If you see in screen shot
- In Mahadev user video is correct but in Shruti user Mahadev user video shows
which is wrong.
Here i have joined from only my own device
I am able to see myself at 2 places
1 with correct name
Other with incorrect name
Please try by adding key to the ParticipantGridTile
@rajansurani thanx for reply I think it will works