feat: Support setVideoFPS for subscribe. (#258)
* feat: Support setVideoFPS for subscribe. * Update lib/src/publication/remote.dart Co-authored-by: David Zhao <dz@livekit.io> * Add comment for setVideoFPS. --------- Co-authored-by: David Zhao <dz@livekit.io>
This commit is contained in:
@@ -199,17 +199,22 @@ class _RemoteParticipantWidgetState
|
|||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
|
// Menu for RemoteTrackPublication<RemoteAudioTrack>
|
||||||
|
if (firstAudioPublication != null && !isScreenShare)
|
||||||
|
RemoteTrackPublicationMenuWidget(
|
||||||
|
pub: firstAudioPublication!,
|
||||||
|
icon: EvaIcons.volumeUp,
|
||||||
|
),
|
||||||
// Menu for RemoteTrackPublication<RemoteVideoTrack>
|
// Menu for RemoteTrackPublication<RemoteVideoTrack>
|
||||||
if (videoPublication != null)
|
if (videoPublication != null)
|
||||||
RemoteTrackPublicationMenuWidget(
|
RemoteTrackPublicationMenuWidget(
|
||||||
pub: videoPublication!,
|
pub: videoPublication!,
|
||||||
icon: isScreenShare ? EvaIcons.monitor : EvaIcons.video,
|
icon: isScreenShare ? EvaIcons.monitor : EvaIcons.video,
|
||||||
),
|
),
|
||||||
// Menu for RemoteTrackPublication<RemoteAudioTrack>
|
if (videoPublication != null)
|
||||||
if (firstAudioPublication != null && !isScreenShare)
|
RemoteTrackFPSMenuWidget(
|
||||||
RemoteTrackPublicationMenuWidget(
|
pub: videoPublication!,
|
||||||
pub: firstAudioPublication!,
|
icon: EvaIcons.options2,
|
||||||
icon: EvaIcons.volumeUp,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -253,3 +258,37 @@ class RemoteTrackPublicationMenuWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class RemoteTrackFPSMenuWidget extends StatelessWidget {
|
||||||
|
final IconData icon;
|
||||||
|
final RemoteTrackPublication pub;
|
||||||
|
const RemoteTrackFPSMenuWidget({
|
||||||
|
required this.pub,
|
||||||
|
required this.icon,
|
||||||
|
Key? key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) => Material(
|
||||||
|
color: Colors.black.withOpacity(0.3),
|
||||||
|
child: PopupMenuButton<Function>(
|
||||||
|
tooltip: 'PreferredFPS',
|
||||||
|
icon: Icon(icon, color: Colors.white),
|
||||||
|
onSelected: (value) => value(),
|
||||||
|
itemBuilder: (BuildContext context) => <PopupMenuEntry<Function>>[
|
||||||
|
PopupMenuItem(
|
||||||
|
child: const Text('30'),
|
||||||
|
value: () => pub.setVideoFPS(30),
|
||||||
|
),
|
||||||
|
PopupMenuItem(
|
||||||
|
child: const Text('15'),
|
||||||
|
value: () => pub.setVideoFPS(15),
|
||||||
|
),
|
||||||
|
PopupMenuItem(
|
||||||
|
child: const Text('8'),
|
||||||
|
value: () => pub.setVideoFPS(8),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ class RemoteTrackPublication<T extends RemoteTrack>
|
|||||||
bool get enabled => _enabled;
|
bool get enabled => _enabled;
|
||||||
bool _enabled = true;
|
bool _enabled = true;
|
||||||
|
|
||||||
|
/// The current desired FPS of the track. This is only available for video tracks that support SVC.
|
||||||
|
int? _fps;
|
||||||
|
int get fps => _fps ?? 0;
|
||||||
|
|
||||||
lk_models.VideoQuality _videoQuality = lk_models.VideoQuality.HIGH;
|
lk_models.VideoQuality _videoQuality = lk_models.VideoQuality.HIGH;
|
||||||
lk_models.VideoQuality get videoQuality => _videoQuality;
|
lk_models.VideoQuality get videoQuality => _videoQuality;
|
||||||
|
|
||||||
@@ -227,6 +231,14 @@ class RemoteTrackPublication<T extends RemoteTrack>
|
|||||||
sendUpdateTrackSettings();
|
sendUpdateTrackSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set desired FPS, server will do its best to return FPS close to this.
|
||||||
|
/// It's only supported for video codecs that support SVC currently.
|
||||||
|
Future<void> setVideoFPS(int newValue) async {
|
||||||
|
if (newValue == _fps) return;
|
||||||
|
_fps = newValue;
|
||||||
|
sendUpdateTrackSettings();
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> enable() async {
|
Future<void> enable() async {
|
||||||
if (_enabled) return;
|
if (_enabled) return;
|
||||||
_enabled = true;
|
_enabled = true;
|
||||||
@@ -289,6 +301,7 @@ class RemoteTrackPublication<T extends RemoteTrack>
|
|||||||
);
|
);
|
||||||
if (kind == lk_models.TrackType.VIDEO) {
|
if (kind == lk_models.TrackType.VIDEO) {
|
||||||
settings.quality = _videoQuality;
|
settings.quality = _videoQuality;
|
||||||
|
if (_fps != null) settings.fps = _fps!;
|
||||||
}
|
}
|
||||||
participant.room.engine.signalClient.sendUpdateTrackSettings(settings);
|
participant.room.engine.signalClient.sendUpdateTrackSettings(settings);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user