videosdk-live/videosdk-rtc-flutter-sdk-example

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;
});
}
}
}

WhatsApp Image 2023-02-25 at 11 53 19 AM

If you see in screen shot

  1. 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

@rajansurani thanx for reply I think it will works