feat: 直播弹幕2

This commit is contained in:
guozhigq
2024-08-21 00:14:45 +08:00
parent 91856b5c21
commit 5304120909
4 changed files with 58 additions and 18 deletions

View File

@ -2,8 +2,9 @@ import 'package:pilipala/http/danmaku.dart';
import 'package:pilipala/models/danmaku/dm.pb.dart';
class PlDanmakuController {
PlDanmakuController(this.cid);
PlDanmakuController(this.cid, this.type);
final int cid;
final String type;
Map<int, List<DanmakuElem>> dmSegMap = {};
// 已请求的段落标记
List<bool> requestedSeg = [];

View File

@ -12,11 +12,15 @@ import 'package:pilipala/utils/storage.dart';
class PlDanmaku extends StatefulWidget {
final int cid;
final PlPlayerController playerController;
final String type;
final Function(DanmakuController)? createdController;
const PlDanmaku({
super.key,
required this.cid,
required this.playerController,
this.type = 'video',
this.createdController,
});
@override
@ -43,9 +47,9 @@ class _PlDanmakuState extends State<PlDanmaku> {
super.initState();
enableShowDanmaku =
setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: false);
_plDanmakuController = PlDanmakuController(widget.cid);
if (mounted) {
playerController = widget.playerController;
_plDanmakuController = PlDanmakuController(widget.cid, widget.type);
playerController = widget.playerController;
if (mounted && widget.type == 'video') {
if (enableShowDanmaku || playerController.isOpenDanmu.value) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
@ -55,13 +59,15 @@ class _PlDanmakuState extends State<PlDanmaku> {
..addStatusLister(playerListener)
..addPositionListener(videoPositionListen);
}
playerController.isOpenDanmu.listen((p0) {
if (p0 && !_plDanmakuController.initiated) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
}
});
if (widget.type == 'video') {
playerController.isOpenDanmu.listen((p0) {
if (p0 && !_plDanmakuController.initiated) {
_plDanmakuController.initiate(
playerController.duration.value.inMilliseconds,
playerController.position.value.inMilliseconds);
}
});
}
blockTypes = playerController.blockTypes;
showArea = playerController.showArea;
opacityVal = playerController.opacityVal;
@ -128,6 +134,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
child: DanmakuView(
createdController: (DanmakuController e) async {
playerController.danmakuController = _controller = e;
widget.createdController?.call(e);
},
option: DanmakuOption(
fontSize: 15 * fontSizeVal,
@ -136,8 +143,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
hideTop: blockTypes.contains(5),
hideScroll: blockTypes.contains(2),
hideBottom: blockTypes.contains(4),
duration:
danmakuDurationVal / playerController.playbackSpeed,
duration: danmakuDurationVal / playerController.playbackSpeed,
strokeWidth: strokeWidth,
// initDuration /
// (danmakuSpeedVal * widget.playerController.playbackSpeed),