Ausgabe
Wenn ich ein Video abspiele, lädt es das gesamte Video in den ersten 5 Minuten von selbst. Das verbraucht viele meiner Daten. Ich möchte Videos während der Wiedergabe oder nur für die nächsten fünf Minuten laden. Welche Funktionalität sollte ich dafür verwenden, damit meine Arbeit einfach wird?
class VideoView extends GetView<VideoController> {
VideoController videoController = Get.put(VideoController());
late BetterPlayerController? _betterPlayerController;
@override
Widget build(BuildContext context) {
Wakelock.enable();
return Scaffold(
backgroundColor: Colors.black,
body: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: AspectRatio(
aspectRatio: 16 / 9,
child: BetterPlayer.network(
videoController.args[0],
betterPlayerConfiguration: BetterPlayerConfiguration(
aspectRatio: 16 / 9,
controlsConfiguration:
BetterPlayerControlsConfiguration(enableFullscreen: false)),
),
),
),
);
}
@override
void onClose() {
videoController.dispose();
Wakelock.disable();
}
}
Nur 2 min Videowiedergabe und 25 min geladen.
Lösung
Also bekam ich die Antwort, nachdem ich viele Dokumentationen gelesen hatte. Mir war es sehr wichtig, den Datenverbrauch der Nutzer zu reduzieren. Die meisten Benutzer/Studenten sahen sich Videos mehr als 6 Stunden am Tag an. Wenn ein einstündiges Video mehr als 400 MB-500 MB verbraucht, ist das überhaupt nicht gut. Der Benutzer hatte eine begrenzte Datenmenge von ~1,5 GB pro Tag.
Das Problem war nur mit dem Puffer, der ohne Begrenzung lief. `
import 'package:better_player/better_player.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:wakelock/wakelock.dart';
class VideoView extends StatefulWidget {
@override
_VideoView createState() => _VideoView();
}
class _VideoView extends State<VideoView> {
late BetterPlayerController _betterPlayerController;
@override
void initState() {
BetterPlayerConfiguration betterPlayerConfiguration =
BetterPlayerConfiguration(
aspectRatio: 16 / 9,
autoDispose: true,
autoDetectFullscreenAspectRatio: true,
fullScreenByDefault: true,
fullScreenAspectRatio: 16 / 9,//AR dual time but it's okay.
controlsConfiguration: BetterPlayerControlsConfiguration(
enablePip: false,
enableFullscreen: true,
enableSubtitles: false,
loadingColor: Colors.deepOrange,
progressBarBufferedColor: Colors.red, //very useful
progressBarHandleColor: Colors.blue,
progressBarBackgroundColor: Colors.white));
BetterPlayerDataSource dataSource = BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
Get.arguments[2], <== deault quality url
videoFormat: BetterPlayerVideoFormat.other, //don't forget it if not hsl
resolutions: {
"LOW": Get.arguments[3], // url1
"MEDIUM": Get.arguments[2], // url2
"HD": Get.arguments[1], // url3
"Full HD": Get.arguments[0], // url4
},
// Here is the problem and I resolve it in this way
bufferingConfiguration: BetterPlayerBufferingConfiguration(
minBufferMs: 5000,
maxBufferMs: 131072,
bufferForPlaybackMs: 2500,
bufferForPlaybackAfterRebufferMs: 5000,
),
// cacheConfiguration is very useful
cacheConfiguration: BetterPlayerCacheConfiguration(
useCache: true,
maxCacheSize: 10 * 1024 * 1024,
maxCacheFileSize: 10 * 1024 * 1024,
preCacheSize: 3 * 1024 * 1024),
);
_betterPlayerController = BetterPlayerController(betterPlayerConfiguration,
betterPlayerDataSource: dataSource);
super.initState();
}
@override
Widget build(BuildContext context) {
Wakelock.enable();
return SafeArea(
child: Scaffold(
backgroundColor: Colors.black,
body: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: AspectRatio(
aspectRatio: 16 / 9, // AR for self satisfaction
child: BetterPlayer(
controller: _betterPlayerController,
),
),
),
),
);
}
void onClose() {
_betterPlayerController.dispose(); // necessary
Wakelock.disable();
}
}
`
Beantwortet von – Pawan Kumar
Antwort geprüft von – Jay B. (FixError Admin)