feat: 字幕展示

This commit is contained in:
guozhigq
2024-02-27 22:50:02 +08:00
parent cb0ff334b3
commit ee368d348d
8 changed files with 204 additions and 4 deletions

View File

@ -21,6 +21,7 @@ import 'package:pilipala/utils/storage.dart';
import 'package:screen_brightness/screen_brightness.dart';
import 'package:status_bar_control/status_bar_control.dart';
import 'package:universal_platform/universal_platform.dart';
import '../../models/video/subTitile/content.dart';
// import 'package:wakelock_plus/wakelock_plus.dart';
Box videoStorage = GStrorage.video;
@ -231,6 +232,10 @@ class PlPlayerController {
// 播放顺序相关
PlayRepeat playRepeat = PlayRepeat.pause;
RxList<SubTitileContentModel> subtitleContents =
<SubTitileContentModel>[].obs;
RxString subtitleContent = ''.obs;
void updateSliderPositionSecond() {
int newSecond = _sliderPosition.value.inSeconds;
if (sliderPositionSeconds.value != newSecond) {
@ -277,8 +282,7 @@ class PlPlayerController {
danmakuDurationVal =
localCache.get(LocalCacheKey.danmakuDuration, defaultValue: 4.0);
// 描边粗细
strokeWidth =
localCache.get(LocalCacheKey.strokeWidth, defaultValue: 1.5);
strokeWidth = localCache.get(LocalCacheKey.strokeWidth, defaultValue: 1.5);
playRepeat = PlayRepeat.values.toList().firstWhere(
(e) =>
e.value ==
@ -566,6 +570,8 @@ class PlPlayerController {
_sliderPosition.value = event;
updateSliderPositionSecond();
}
querySubtitleContent(
videoPlayerController!.state.position.inSeconds.toDouble());
/// 触发回调事件
for (var element in _positionListeners) {
@ -1050,6 +1056,17 @@ class PlPlayerController {
}
}
void querySubtitleContent(double progress) {
if (subtitleContents.isNotEmpty) {
for (var content in subtitleContents) {
if (progress >= content.from! && progress <= content.to!) {
subtitleContent.value = content.content!;
return;
}
}
}
}
setPlayRepeat(PlayRepeat type) {
playRepeat = type;
videoStorage.put(VideoBoxKey.playRepeat, type.value);

View File

@ -16,7 +16,6 @@ import 'package:pilipala/plugin/pl_player/utils.dart';
import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart';
import 'package:screen_brightness/screen_brightness.dart';
import 'models/bottom_progress_behavior.dart';
import 'widgets/app_bar_ani.dart';
import 'widgets/backward_seek.dart';
@ -428,6 +427,42 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
if (widget.danmuWidget != null)
Positioned.fill(top: 4, child: widget.danmuWidget!),
widget.controller.subscriptions.isNotEmpty
? Stack(
children: [
Positioned(
left: 0,
right: 0,
bottom: 30,
child: Align(
alignment: Alignment.center,
child: Obx(
() => Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: widget.controller.subtitleContent.value != ''
? Colors.black.withOpacity(0.4)
: Colors.transparent,
),
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 4,
),
child: Text(
widget.controller.subtitleContent.value,
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
),
),
],
)
: nil,
/// 手势
Positioned.fill(
left: 16,