Refactor native player to use better_player

This commit is contained in:
Tommy Chow 2023-04-16 01:54:51 -04:00
parent b1d27de3ea
commit e7cb49da86
5 changed files with 61 additions and 51 deletions

View file

@ -1,10 +1,10 @@
import 'dart:io';
import 'package:better_player/better_player.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:frosty/screens/channel/video/video_store.dart';
import 'package:simple_pip_mode/simple_pip.dart';
import 'package:video_player/video_player.dart';
import 'package:webview_flutter/webview_flutter.dart';
class Video extends StatefulWidget {
@ -140,7 +140,7 @@ class _NativeVideoState extends State<NativeVideo> {
return Center(
child: AspectRatio(
aspectRatio: 16 / 9,
child: VideoPlayer(videoPlayerController),
child: BetterPlayer(controller: videoPlayerController),
),
);
},

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'package:better_player/better_player.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
@ -10,7 +11,6 @@ import 'package:frosty/screens/settings/stores/auth_store.dart';
import 'package:frosty/screens/settings/stores/settings_store.dart';
import 'package:mobx/mobx.dart';
import 'package:simple_pip_mode/simple_pip.dart';
import 'package:video_player/video_player.dart';
import 'package:webview_flutter/webview_flutter.dart';
part 'video_store.g.dart';
@ -34,7 +34,7 @@ abstract class VideoStoreBase with Store {
WebViewController? controller;
@readonly
VideoPlayerController? _videoPlayerController;
BetterPlayerController? _videoPlayerController;
/// The timer that handles hiding the overlay automatically
late Timer _overlayTimer;
@ -126,14 +126,34 @@ abstract class VideoStoreBase with Store {
updateStreamInfo();
}
BetterPlayerController _createPlayerController({required String source}) {
return BetterPlayerController(
const BetterPlayerConfiguration(
autoPlay: true,
controlsConfiguration: BetterPlayerControlsConfiguration(
showControls: false,
),
),
betterPlayerDataSource: BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
source,
liveStream: true,
// bufferingConfiguration: const BetterPlayerBufferingConfiguration(
// bufferForPlaybackAfterRebufferMs: 500,
// bufferForPlaybackMs: 500,
// ),
),
);
}
/// Initializes the video webview.
@action
Future<void> initVideo() async {
if (settingsStore.useNativePlayer) {
_streamLinks = await twitchApi.getStreamLinks(userLogin: userLogin, token: authStore.streamLinkToken);
_videoPlayerController = VideoPlayerController.network(_streamLinks?[_selectedQuality] ?? '');
await _videoPlayerController?.initialize();
await _videoPlayerController?.play();
_videoPlayerController = _createPlayerController(source: _streamLinks?[_selectedQuality] ?? '');
_paused = false;
} else {
// Add event listeners to notify the JavaScript channels when the video plays and pauses.
@ -163,10 +183,8 @@ abstract class VideoStoreBase with Store {
@action
Future<void> handleQualityChange(String quality) async {
await _videoPlayerController?.dispose();
_videoPlayerController = VideoPlayerController.network(_streamLinks?[quality] ?? '');
await _videoPlayerController?.initialize();
await _videoPlayerController?.play();
_videoPlayerController?.dispose();
_videoPlayerController = _createPlayerController(source: _streamLinks?[quality] ?? '');
_selectedQuality = quality;
}

View file

@ -20,16 +20,16 @@ mixin _$VideoStore on VideoStoreBase, Store {
late final _$_videoPlayerControllerAtom =
Atom(name: 'VideoStoreBase._videoPlayerController', context: context);
VideoPlayerController? get videoPlayerController {
BetterPlayerController? get videoPlayerController {
_$_videoPlayerControllerAtom.reportRead();
return super._videoPlayerController;
}
@override
VideoPlayerController? get _videoPlayerController => videoPlayerController;
BetterPlayerController? get _videoPlayerController => videoPlayerController;
@override
set _videoPlayerController(VideoPlayerController? value) {
set _videoPlayerController(BetterPlayerController? value) {
_$_videoPlayerControllerAtom
.reportWrite(value, super._videoPlayerController, () {
super._videoPlayerController = value;

View file

@ -41,6 +41,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.10.0"
better_player:
dependency: "direct main"
description:
name: better_player
sha256: f2e5d57ea49fb7c4d93838d23846ca5ddf78af6f946e103aeacf2afdd01909b3
url: "https://pub.dev"
source: hosted
version: "0.0.83"
boolean_selector:
dependency: transitive
description:
@ -413,6 +421,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_widget_from_html_core:
dependency: transitive
description:
name: flutter_widget_from_html_core
sha256: e8f4f8b461a140ffb7c71f938bc76efc758893e7468843d9dbf70cb0b9e900cb
url: "https://pub.dev"
source: hosted
version: "0.8.5+3"
freezed_annotation:
dependency: transitive
description:
@ -429,6 +445,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.2.0"
fwfh_text_style:
dependency: transitive
description:
name: fwfh_text_style
sha256: "37806ee0222f79b6e8d4c698c322c897eae6a817258156f40aeece4e588fac60"
url: "https://pub.dev"
source: hosted
version: "2.22.08+1"
glob:
dependency: transitive
description:
@ -1107,46 +1131,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
video_player:
dependency: "direct main"
description:
name: video_player
sha256: de95f0e9405f29b5582573d4166132e71f83b3158aac14e8ee5767a54f4f1fbd
url: "https://pub.dev"
source: hosted
version: "2.6.1"
video_player_android:
visibility_detector:
dependency: transitive
description:
name: video_player_android
sha256: a592048a711d5739d9cea2255d425779f138d41095b9149bda60ce4bc1af8871
name: visibility_detector
sha256: "15c54a459ec2c17b4705450483f3d5a2858e733aee893dcee9d75fd04814940d"
url: "https://pub.dev"
source: hosted
version: "2.4.4"
video_player_avfoundation:
dependency: transitive
description:
name: video_player_avfoundation
sha256: "75c6d68cd479a25f34d635149ba6887bc8f1b2b2921841121fd44ea0c5bc1927"
url: "https://pub.dev"
source: hosted
version: "2.4.4"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
sha256: a8c4dcae2a7a6e7cc1d7f9808294d968eca1993af34a98e95b9bdfa959bec684
url: "https://pub.dev"
source: hosted
version: "6.1.0"
video_player_web:
dependency: transitive
description:
name: video_player_web
sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c"
url: "https://pub.dev"
source: hosted
version: "2.0.16"
version: "0.3.3"
wakelock:
dependency: "direct main"
description:

View file

@ -59,7 +59,7 @@ dependencies:
simple_pip_mode:
git:
url: https://github.com/tommyxchow/simple_pip_mode_flutter
video_player: ^2.6.1
better_player: ^0.0.83
dev_dependencies:
flutter_test: