feat: added video buffer

This commit is contained in:
omkar 2025-01-31 20:08:56 +05:30
parent f8af47b165
commit 4228607073
5 changed files with 51 additions and 7 deletions

View file

@ -11,6 +11,7 @@ class PlaybackSettings {
double fontSize;
bool externalPlayer;
String? selectedExternalPlayer;
int bufferSize;
PlaybackSettings({
this.autoPlay = true,
@ -23,6 +24,7 @@ class PlaybackSettings {
this.fontSize = 16,
this.externalPlayer = false,
this.selectedExternalPlayer,
this.bufferSize = 32,
});
Map<String, dynamic> toJson() => {
@ -32,16 +34,18 @@ class PlaybackSettings {
'defaultSubtitleTrack': defaultSubtitleTrack,
'subtitleColor': subtitleColor.value,
'fontSize': fontSize,
'disableSubtitles': disableSubtitles,
};
factory PlaybackSettings.fromJson(Map<String, dynamic> json) {
return PlaybackSettings(
autoPlay: json['autoPlay'] ?? true,
playbackSpeed: json['playbackSpeed'] ?? 1.0,
playbackSpeed: (json['playbackSpeed'] ?? 1.0).toDouble(),
defaultAudioTrack: json['defaultAudioTrack'] ?? 'eng',
defaultSubtitleTrack: json['defaultSubtitleTrack'] ?? 'eng',
subtitleColor: Color(json['subtitleColor'] ?? Colors.white.value),
fontSize: json['fontSize'] ?? 16,
fontSize: (json['fontSize'] ?? 16).toDouble(),
disableSubtitles: json['disableSubtitles'] ?? false,
);
}
}

View file

@ -372,6 +372,38 @@ class _PlaybackSettingsPageState extends State<PlaybackSettingsPage> {
],
],
),
_buildSection(
"Player buffer",
[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("${settings.bufferSize} MB"),
Row(
children: [
const Text('32 MB'),
Expanded(
child: Slider(
value: settings.bufferSize.toDouble(),
min: 32,
max: 2024,
label: settings.bufferSize.round().toString(),
onChanged: (value) {
setState(() {
settings.bufferSize = value.toInt();
PlaybackSettingsService.instance
.saveSettings(settings);
});
},
),
),
const Text('2024 MB'),
],
),
],
),
],
),
],
);
},

View file

@ -40,12 +40,14 @@ class PlaybackSettingsService {
'disableHardwareAcceleration': settings.disableHardwareAcceleration,
'externalPlayer': settings.externalPlayer,
'selectedExternalPlayer': settings.selectedExternalPlayer,
'bufferSize': settings.bufferSize,
'fontSize': settings.fontSize,
};
await prefs.setString(_localSettingsKey, json.encode(localSettings));
await AppPocketBaseService.instance.pb.collection('users').update(
AppPocketBaseService.instance.pb.authStore.model.id,
body: {'playback_v2': settings.toJson()},
AppPocketBaseService.instance.pb.authStore.record!.id,
body: {'config': settings.toJson()},
);
_cachedSettings = settings;
@ -65,7 +67,7 @@ class PlaybackSettingsService {
);
final serverSettings = PlaybackSettings.fromJson(
record.data['playback_v2'] ?? {},
record.data['config'] ?? {},
);
_cachedSettings = PlaybackSettings(
@ -74,11 +76,13 @@ class PlaybackSettingsService {
defaultAudioTrack: serverSettings.defaultAudioTrack,
defaultSubtitleTrack: serverSettings.defaultSubtitleTrack,
subtitleColor: serverSettings.subtitleColor,
fontSize: serverSettings.fontSize,
fontSize: (localSettings['fontSize'] ?? 16).toDouble(),
disableHardwareAcceleration:
localSettings['disableHardwareAcceleration'] ?? false,
externalPlayer: localSettings['externalPlayer'] ?? false,
selectedExternalPlayer: localSettings['selectedExternalPlayer'],
disableSubtitles: serverSettings.disableSubtitles,
bufferSize: (localSettings['bufferSize'] ?? 32),
);
return _cachedSettings!;

View file

@ -15,6 +15,7 @@ class VideoPlay extends StatefulWidget {
final Meta? meta;
final int index;
final String stream;
final int bufferSize;
const VideoPlay({
super.key,
@ -25,6 +26,7 @@ class VideoPlay extends StatefulWidget {
required void Function(String message) onError,
required this.index,
required this.stream,
required this.bufferSize,
});
@override
@ -35,8 +37,9 @@ class _VideoPlayState extends State<VideoPlay> {
late String stream = widget.stream;
late final player = Player(
configuration: const PlayerConfiguration(
configuration: PlayerConfiguration(
title: "Madari",
bufferSize: widget.bufferSize * 1024 * 1024,
),
);

View file

@ -151,6 +151,7 @@ class _VideoPlayerState extends State<VideoPlayer> with WidgetsBindingObserver {
body: VideoPlay(
stream: widget.stream,
meta: widget.meta,
bufferSize: state.data?.bufferSize ?? 32,
index: index,
key: ValueKey('${widget.id}_${widget.selectedIndex}'),
enabledHardwareAcceleration: