video: prevent speed control when audio is not ready

This commit is contained in:
Thibault Deckers 2021-06-22 18:25:51 +09:00
parent e40770b1c4
commit 2f6a851e68
4 changed files with 36 additions and 23 deletions

View file

@ -79,6 +79,7 @@ class Settings extends ChangeNotifier {
EntryAction.share, EntryAction.share,
]; ];
static const videoQuickActionsDefault = [ static const videoQuickActionsDefault = [
VideoAction.replay10,
VideoAction.togglePlay, VideoAction.togglePlay,
]; ];

View file

@ -242,32 +242,32 @@ class _ButtonRow extends StatelessWidget {
ValueListenableBuilder<bool> _buildFromListenable(ValueListenable<bool>? enabledNotifier) { ValueListenableBuilder<bool> _buildFromListenable(ValueListenable<bool>? enabledNotifier) {
return ValueListenableBuilder<bool>( return ValueListenableBuilder<bool>(
valueListenable: enabledNotifier ?? ValueNotifier(false), valueListenable: enabledNotifier ?? ValueNotifier(false),
builder: (context, canDo, child) { builder: (context, canDo, child) => IconButton(
return IconButton(
icon: child!, icon: child!,
onPressed: canDo ? onPressed : null, onPressed: canDo ? onPressed : null,
tooltip: action.getText(context), tooltip: action.getText(context),
); ),
},
child: Icon(action.getIcon()), child: Icon(action.getIcon()),
); );
} }
switch (action) { switch (action) {
case VideoAction.captureFrame:
child = _buildFromListenable(controller?.canCaptureFrameNotifier);
break;
case VideoAction.selectStreams:
child = _buildFromListenable(controller?.canSelectStreamNotifier);
break;
case VideoAction.setSpeed:
child = _buildFromListenable(controller?.canSetSpeedNotifier);
break;
case VideoAction.togglePlay: case VideoAction.togglePlay:
child = _PlayToggler( child = _PlayToggler(
controller: controller, controller: controller,
onPressed: onPressed, onPressed: onPressed,
); );
break; break;
case VideoAction.captureFrame:
child = _buildFromListenable(controller?.renderingVideoNotifier);
break;
case VideoAction.selectStreams:
child = _buildFromListenable(controller?.canSelectStreamNotifier);
break;
case VideoAction.replay10: case VideoAction.replay10:
case VideoAction.setSpeed:
child = IconButton( child = IconButton(
icon: Icon(action.getIcon()), icon: Icon(action.getIcon()),
onPressed: onPressed, onPressed: onPressed,
@ -287,17 +287,19 @@ class _ButtonRow extends StatelessWidget {
PopupMenuEntry<VideoAction> _buildPopupMenuItem(BuildContext context, VideoAction action) { PopupMenuEntry<VideoAction> _buildPopupMenuItem(BuildContext context, VideoAction action) {
late final enabled; late final enabled;
switch (action) { switch (action) {
case VideoAction.togglePlay:
case VideoAction.replay10:
case VideoAction.setSpeed:
enabled = true;
break;
case VideoAction.captureFrame: case VideoAction.captureFrame:
enabled = controller?.renderingVideoNotifier.value ?? false; enabled = controller?.canCaptureFrameNotifier.value ?? false;
break; break;
case VideoAction.selectStreams: case VideoAction.selectStreams:
enabled = controller?.canSelectStreamNotifier.value ?? false; enabled = controller?.canSelectStreamNotifier.value ?? false;
break; break;
case VideoAction.setSpeed:
enabled = controller?.canSetSpeedNotifier.value ?? false;
break;
case VideoAction.replay10:
case VideoAction.togglePlay:
enabled = true;
break;
} }
Widget? child; Widget? child;

View file

@ -41,7 +41,9 @@ abstract class AvesVideoController {
Stream<String?> get timedTextStream; Stream<String?> get timedTextStream;
ValueNotifier<bool> get renderingVideoNotifier; ValueNotifier<bool> get canCaptureFrameNotifier;
ValueNotifier<bool> get canSetSpeedNotifier;
ValueNotifier<bool> get canSelectStreamNotifier; ValueNotifier<bool> get canSelectStreamNotifier;

View file

@ -36,7 +36,10 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
final double maxSpeed = 2; final double maxSpeed = 2;
@override @override
final ValueNotifier<bool> renderingVideoNotifier = ValueNotifier(false); final ValueNotifier<bool> canCaptureFrameNotifier = ValueNotifier(false);
@override
final ValueNotifier<bool> canSetSpeedNotifier = ValueNotifier(false);
@override @override
final ValueNotifier<bool> canSelectStreamNotifier = ValueNotifier(false); final ValueNotifier<bool> canSelectStreamNotifier = ValueNotifier(false);
@ -56,9 +59,14 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
} }
_instance = FijkPlayer(); _instance = FijkPlayer();
_valueStream.firstWhere((value) => value.videoRenderStart).then( _valueStream.firstWhere((value) => value.videoRenderStart).then(
(value) => renderingVideoNotifier.value = true, (value) => canCaptureFrameNotifier.value = true,
onError: (error) {}, onError: (error) {},
); );
_valueStream.firstWhere((value) => value.audioRenderStart).then(
(value) => canSetSpeedNotifier.value = true,
onError: (error) {},
);
_startListening(); _startListening();
} }