i'm building video app base on video_player . i'd to change video quality like YouTube without any loading and screen blinking (after finish loaded buffer new selected quality source will play )
i create sample code but when i change video controller data source loading is show on screen affter that screen blinking and after all new data source video play (that is not smooth like youTube)
this is my vide player code
VideoPlayerController? _videoPlayerController;
@override
void initState() {
super.initState();
_videoPlayerController = VideoPlayerController.network('video url')
..initialize().then((_) {
_videoPlayerController!.play();
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return _videoPlayerController == null
? const Center(
child: LoadingWidget(),
)
: _videoPlayerController!.value.isInitialized
? Stack(
children: [
VideoPlayer(_videoPlayerController!),
Button(text: 'chnage video quality to 720p', onClick: (){
_startPlay('vide 720p url ');
})
],
)
: Center(child: LoadingWidget());
}
@override
void dispose() {
_videoPlayerController!.dispose();
super.dispose();
}
for change quality data source i use this code
Future<bool> _clearPrevious() async {
await _videoPlayerController?.pause();
return true;
}
//The values that are passed when changing quality
late Duration newCurrentPosition;
int _playBackTime = 0;
Future<void> _initializePlay(String videoPath) async {
_videoPlayerController = VideoPlayerController.network(videoPath);
_videoPlayerController!.addListener(() {
setState(() {
_playBackTime = _videoPlayerController!.value.position.inSeconds;
});
});
_videoPlayerController!.initialize().then((_) {
_videoPlayerController!.seekTo(newCurrentPosition);
_videoPlayerController!.play();
});
}
void _getValuesAndPlay(String videoPath) {
newCurrentPosition = _videoPlayerController!.value.position;
_startPlay(videoPath);
print(newCurrentPosition.toString());
}
Future<void> _startPlay(String videoPath) async {
Future.delayed(const Duration(milliseconds: 200), () {
_clearPrevious().then((_) {
_initializePlay(videoPath);
});
});
}