引入better_player_plus: ^1.1.5
import 'package:better_player_plus/better_player_plus.dart';
late BetterPlayerController _videoController;
/// 进入后判断是否全屏
bool get _isFullScreen =>
MediaQuery.of(context).orientation == Orientation.landscape;
Size get _window => MediaQueryData.fromView(window).size;
bool _isVideoInit = false;
bool _isBuffering = false;
void initState() {
// TODO: implement initState
super.initState();
//BoxFit.contain + fullScreenByDefault=true + autoDetectFullscreenAspectRatio = true,设置后播放器播放时默认按视频的宽高比例放大填充父布局
final betterPlayerConfiguration = BetterPlayerConfiguration(
fit: BoxFit.contain,
autoPlay: true,
looping: true,
fullScreenByDefault: true,
autoDetectFullscreenAspectRatio: true,
controlsConfiguration: const BetterPlayerControlsConfiguration(
showControls: false, // 是否显示控制栏
enableSkips: false, // 禁用快进/快退
)
);
_videoController = BetterPlayerController(betterPlayerConfiguration,betterPlayerDataSource: dataSource);
_videoController.addEventsListener(_videoListener);
}
_videoListener(BetterPlayerEvent event) async {
switch(event.betterPlayerEventType){
case BetterPlayerEventType.initialized:
setState(() {
_isVideoInit = true;
double? videoWidth = _videoController.videoPlayerController?.value.size?.width;
double? videoHeight = _videoController.videoPlayerController?.value.size?.height;
print('_videoWidth= $videoWidth _videoHeight= $videoHeight');
if(videoWidth != null && videoHeight != null){
double aspectRatio = videoHeight / videoWidth;
_logic.videoAspectRatio = aspectRatio;
}
_videoController.play();
});
break;
case BetterPlayerEventType.progress:
Duration res = _videoController.videoPlayerController!.value.position;
Duration? totalDuration = _videoController.videoPlayerController?.value.duration;
if (_videoController.isPlaying() == true && _key.currentState != null) {
/// 减少build次数
_key.currentState!.setPosition(
position: res,
totalDuration: totalDuration,
);
}
break;
case BetterPlayerEventType.bufferingStart:
_isBuffering = true;
break;
case BetterPlayerEventType.bufferingEnd:
_isBuffering = false;
break;
case BetterPlayerEventType.exception:
esLoadingToast('视频加载失败');
print('视频播放器问题:${_videoController.videoPlayerController!.value.errorDescription} =====');
break;
default:
break;
}
}
void dispose() {
// TODO: implement dispose
_videoController.removeEventsListener(_videoListener);
_videoController.dispose();
super.dispose();
}
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
backgroundColor: Colors.black,
body: Container(
width: _isFullScreen ? _window.width : double.infinity,
height: _isFullScreen ? _window.height : double.infinity,
alignment: Alignment.center,
child: _isVideoInit != true || _isBuffering == true ? _coverImageView() : BetterPlayer(controller: _videoController)
)
);
}
//视频封面
_coverImageView({bool? showLoading}){
return Stack(
alignment: Alignment.center,
children: [
_logic.articleDetail!.articlePic != null
? Utils().roundedImage(_logic.articleDetail!.articlePic!.last.url, 2,
fit: BoxFit.cover, borderColor: Colors.black)
: SizedBox(width: double.infinity, height: double.infinity),
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
strokeWidth: 2,
)
],
);
}
只配置fit: BoxFit.contain时,播放时显示区域虽然按视频比例,但是不会尽可能大的充满屏幕

BoxFit.contain + fullScreenByDefault=true + autoDetectFullscreenAspectRatio = true,播放时显示区域按视频比例比例尽可能大的充满屏幕

761

被折叠的 条评论
为什么被折叠?



