viewer: video overlay muted/speed indicators
This commit is contained in:
parent
ac21238ab4
commit
318ee1385e
3 changed files with 51 additions and 4 deletions
|
@ -2,12 +2,14 @@ import 'dart:async';
|
||||||
|
|
||||||
import 'package:aves/model/settings/settings.dart';
|
import 'package:aves/model/settings/settings.dart';
|
||||||
import 'package:aves/theme/format.dart';
|
import 'package:aves/theme/format.dart';
|
||||||
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:aves/theme/themes.dart';
|
import 'package:aves/theme/themes.dart';
|
||||||
import 'package:aves/utils/constants.dart';
|
import 'package:aves/utils/constants.dart';
|
||||||
import 'package:aves/widgets/common/fx/blurred.dart';
|
import 'package:aves/widgets/common/fx/blurred.dart';
|
||||||
import 'package:aves/widgets/common/fx/borders.dart';
|
import 'package:aves/widgets/common/fx/borders.dart';
|
||||||
import 'package:aves/widgets/viewer/video/controller.dart';
|
import 'package:aves/widgets/viewer/video/controller.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class VideoProgressBar extends StatefulWidget {
|
class VideoProgressBar extends StatefulWidget {
|
||||||
final AvesVideoController? controller;
|
final AvesVideoController? controller;
|
||||||
|
@ -114,10 +116,16 @@ class _VideoProgressBarState extends State<VideoProgressBar> {
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Row(
|
||||||
// fake text below to match the height of the text above and center the whole thing
|
children: [
|
||||||
'',
|
_buildSpeedIndicator(),
|
||||||
style: textStyle,
|
_buildMuteIndicator(),
|
||||||
|
Text(
|
||||||
|
// fake text below to match the height of the text above and center the whole thing
|
||||||
|
'',
|
||||||
|
style: textStyle,
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -128,6 +136,38 @@ class _VideoProgressBarState extends State<VideoProgressBar> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildSpeedIndicator() => StreamBuilder<double>(
|
||||||
|
stream: controller?.speedStream ?? Stream.value(1.0),
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
final speed = controller?.speed ?? 1.0;
|
||||||
|
return speed != 1
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsetsDirectional.only(end: 8),
|
||||||
|
child: Text('x$speed'),
|
||||||
|
)
|
||||||
|
: const SizedBox();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget _buildMuteIndicator() => StreamBuilder<double>(
|
||||||
|
stream: controller?.volumeStream ?? Stream.value(1.0),
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
final isMuted = controller?.isMuted ?? false;
|
||||||
|
return isMuted
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsetsDirectional.only(end: 8),
|
||||||
|
child: Selector<MediaQueryData, double>(
|
||||||
|
selector: (context, mq) => mq.textScaleFactor,
|
||||||
|
builder: (context, textScaleFactor, child) => Icon(
|
||||||
|
AIcons.mute,
|
||||||
|
size: 16 * textScaleFactor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: const SizedBox();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
void _seekFromTap(Offset globalPosition) async {
|
void _seekFromTap(Offset globalPosition) async {
|
||||||
if (controller == null) return;
|
if (controller == null) return;
|
||||||
final keyContext = _progressBarKey.currentContext!;
|
final keyContext = _progressBarKey.currentContext!;
|
||||||
|
|
|
@ -94,6 +94,8 @@ abstract class AvesVideoController {
|
||||||
|
|
||||||
Stream<double> get volumeStream;
|
Stream<double> get volumeStream;
|
||||||
|
|
||||||
|
Stream<double> get speedStream;
|
||||||
|
|
||||||
bool get isReady;
|
bool get isReady;
|
||||||
|
|
||||||
bool get isPlaying => status == VideoStatus.playing;
|
bool get isPlaying => status == VideoStatus.playing;
|
||||||
|
|
|
@ -18,6 +18,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
|
||||||
final StreamController<FijkValue> _valueStreamController = StreamController.broadcast();
|
final StreamController<FijkValue> _valueStreamController = StreamController.broadcast();
|
||||||
final StreamController<String?> _timedTextStreamController = StreamController.broadcast();
|
final StreamController<String?> _timedTextStreamController = StreamController.broadcast();
|
||||||
final StreamController<double> _volumeStreamController = StreamController.broadcast();
|
final StreamController<double> _volumeStreamController = StreamController.broadcast();
|
||||||
|
final StreamController<double> _speedStreamController = StreamController.broadcast();
|
||||||
final AChangeNotifier _completedNotifier = AChangeNotifier();
|
final AChangeNotifier _completedNotifier = AChangeNotifier();
|
||||||
Offset _macroBlockCrop = Offset.zero;
|
Offset _macroBlockCrop = Offset.zero;
|
||||||
final List<StreamSummary> _streams = [];
|
final List<StreamSummary> _streams = [];
|
||||||
|
@ -333,6 +334,9 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
|
||||||
@override
|
@override
|
||||||
Stream<double> get volumeStream => _volumeStreamController.stream;
|
Stream<double> get volumeStream => _volumeStreamController.stream;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<double> get speedStream => _speedStreamController.stream;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isReady => _instance.isPlayable();
|
bool get isReady => _instance.isPlayable();
|
||||||
|
|
||||||
|
@ -372,6 +376,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
|
||||||
if (speed <= 0 || _speed == speed) return;
|
if (speed <= 0 || _speed == speed) return;
|
||||||
final optionChange = _needSoundTouch(speed) != _needSoundTouch(_speed);
|
final optionChange = _needSoundTouch(speed) != _needSoundTouch(_speed);
|
||||||
_speed = speed;
|
_speed = speed;
|
||||||
|
_speedStreamController.add(_speed);
|
||||||
|
|
||||||
if (optionChange) {
|
if (optionChange) {
|
||||||
_init(startMillis: currentPosition);
|
_init(startMillis: currentPosition);
|
||||||
|
|
Loading…
Reference in a new issue