mod: 视频单例模式

This commit is contained in:
guozhigq
2023-08-08 16:38:36 +08:00
parent d46cff80e1
commit add1e6e2eb
4 changed files with 85 additions and 51 deletions

View File

@ -14,7 +14,7 @@ class LiveRoomController extends GetxController {
// 静音状态
RxBool volumeOff = false.obs;
PlPlayerController plPlayerController =
PlPlayerController(controlsEnabled: false);
PlPlayerController.getInstance(controlsEnabled: false);
// MeeduPlayerController meeduPlayerController = MeeduPlayerController(
// colorTheme: Theme.of(Get.context!).colorScheme.primary,

View File

@ -54,7 +54,7 @@ class VideoDetailController extends GetxController
RxString bgCover = ''.obs;
Box user = GStrorage.user;
Box localCache = GStrorage.localCache;
PlPlayerController plPlayerController = PlPlayerController();
PlPlayerController plPlayerController = PlPlayerController.getInstance();
// 是否开始自动播放 存在多p的情况下第二p需要为true
RxBool autoPlay = true.obs;
// 视频资源是否有效
@ -62,6 +62,11 @@ class VideoDetailController extends GetxController
// 封面图的展示
RxBool isShowCover = true.obs;
late VideoItem firstVideo;
late String videoUrl;
late String audioUrl;
late Duration defaultST;
@override
void onInit() {
super.onInit();
@ -107,7 +112,7 @@ class VideoDetailController extends GetxController
/// 更新画质、音质
/// TODO 继续进度播放
updatePlayer() {
Duration position = plPlayerController.position.value;
defaultST = plPlayerController.position.value;
plPlayerController.removeListeners();
plPlayerController.isBuffering.value = false;
plPlayerController.buffered.value = Duration.zero;
@ -115,24 +120,23 @@ class VideoDetailController extends GetxController
/// 暂不匹配解码规则
/// 根据currentVideoQa 重新设置videoUrl
VideoItem firstVideo =
firstVideo =
data.dash!.video!.firstWhere((i) => i.id == currentVideoQa.code);
// String videoUrl = firstVideo.baseUrl!;
videoUrl = firstVideo.baseUrl!;
/// 根据currentAudioQa 重新设置audioUrl
AudioItem firstAudio =
data.dash!.audio!.firstWhere((i) => i.id == currentAudioQa.code);
String audioUrl = firstAudio.baseUrl ?? '';
audioUrl = firstAudio.baseUrl ?? '';
playerInit(firstVideo, audioUrl, defaultST: position);
playerInit();
}
Future playerInit(firstVideo, audioSource,
{Duration defaultST = Duration.zero, int duration = 0}) async {
Future playerInit({video, audio, seekToTime, duration}) async {
await plPlayerController.setDataSource(
DataSource(
videoSource: firstVideo.baseUrl,
audioSource: audioSource,
videoSource: video ?? videoUrl,
audioSource: audio ?? audioUrl,
type: DataSourceType.network,
httpHeaders: {
'user-agent':
@ -143,11 +147,14 @@ class VideoDetailController extends GetxController
// 硬解
enableHA: true,
autoplay: autoPlay.value,
seekTo: defaultST,
duration: Duration(milliseconds: duration),
seekTo: seekToTime ?? defaultST,
duration: duration ?? Duration(milliseconds: data.timeLength ?? 0),
// 宽>高 水平 否则 垂直
direction:
firstVideo.width - firstVideo.height > 0 ? 'horizontal' : 'vertical',
direction: (firstVideo.width! - firstVideo.height!) > 0
? 'horizontal'
: 'vertical',
// 默认1倍速
speed: 1.0,
);
}
@ -163,25 +170,21 @@ class VideoDetailController extends GetxController
data = result['data'];
/// 优先顺序 省流模式 -> 设置中指定质量 -> 当前可选的最高质量
VideoItem firstVideo = data.dash!.video!.first;
// String videoUrl = firstVideo.baseUrl!;
firstVideo = data.dash!.video!.first;
videoUrl = firstVideo.baseUrl!;
//
currentVideoQa = VideoQualityCode.fromCode(firstVideo.id!)!;
/// 优先顺序 设置中指定质量 -> 当前可选的最高质量
AudioItem firstAudio =
data.dash!.audio!.isNotEmpty ? data.dash!.audio!.first : AudioItem();
String audioUrl = firstAudio.baseUrl ?? '';
audioUrl = firstAudio.baseUrl ?? '';
//
if (firstAudio.id != null) {
currentAudioQa = AudioQualityCode.fromCode(firstAudio.id!)!;
}
await playerInit(
firstVideo,
audioUrl,
defaultST: Duration(milliseconds: data.lastPlayTime!),
duration: data.timeLength ?? 0,
);
defaultST = Duration(milliseconds: data.lastPlayTime!);
await playerInit();
} else {
SmartDialog.showToast(result['msg'].toString());
}

View File

@ -49,8 +49,25 @@ class _VideoDetailPageState extends State<VideoDetailPage>
void initState() {
super.initState();
plPlayerController = videoDetailController.plPlayerController;
playerListener();
appbarStream = StreamController<double>();
_extendNestCtr.addListener(
() {
double offset = _extendNestCtr.position.pixels;
appbarStream.add(offset);
},
);
statusBarHeight = localCache.get('statusBarHeight');
_futureBuilderFuture = videoDetailController.queryVideoUrl();
}
// 播放器状态监听
void playerListener() {
plPlayerController!.onPlayerStatusChanged.listen(
(PlayerStatus status) {
(PlayerStatus status) async {
videoDetailController.markHeartBeat();
playerStatus = status;
if (status == PlayerStatus.playing) {
@ -68,18 +85,6 @@ class _VideoDetailPageState extends State<VideoDetailPage>
}
},
);
appbarStream = StreamController<double>();
_extendNestCtr.addListener(
() {
double offset = _extendNestCtr.position.pixels;
appbarStream.add(offset);
},
);
statusBarHeight = localCache.get('statusBarHeight');
_futureBuilderFuture = videoDetailController.queryVideoUrl();
}
// 继续播放或重新播放
@ -104,6 +109,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
if (videoDetailController.timer!.isActive) {
videoDetailController.timer!.cancel();
}
videoDetailController.defaultST = plPlayerController!.position.value;
plPlayerController!.pause();
super.didPushNext();
}
@ -111,6 +117,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
@override
// 返回当前页面时
void didPopNext() async {
videoDetailController.playerInit();
if (_extendNestCtr.position.pixels == 0) {
await Future.delayed(const Duration(milliseconds: 300));
plPlayerController!.play();