Je ne veux pas que ma vidéo soit étirée. J'utilise Chewie
package flottant comme mon lecteur vidéo.
J'ai essayé d'utiliser _controller.value.size.aspectRatio
mais cela renvoie une erreur The getter 'aspectRatio' was called on null.
voici mon code pour obtenir une vidéo de la galerie:
Future uploadVideoFromGallery() async {
print("CALLED");
Map<PermissionGroup, PermissionStatus> permissions =
await PermissionHandler().requestPermissions(
[PermissionGroup.storage, PermissionGroup.camera]);
if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
var videoFile = await ImagePicker.pickVideo(source: ImageSource.gallery);
if (videoFile != null) {
getVideoThumbnail(videoFile.path);
setState(() {
isFileImage = false;
image = videoFile;
_controller = VideoPlayerController.file(image);
});
print(videoFile.path);
}
} else {
debugPrint('permission not granted');
}
}
et voici mon code pour placer le videoFile
:
Chewie(
controller: ChewieController(
videoPlayerController: _controller,
aspectRatio: _controller.value.size.aspectRatio,
materialProgressColors: ChewieProgressColors(
playedColor: Color(colorSecondary),
handleColor: Color(colorPrimary),
bufferedColor: Color(colorPrimary),
),
placeholder: Container(
color: Colors.grey,
),
autoInitialize: true,
looping: false,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Color(colorText)),
),
);
},
),
)
Si vous utilisez simplement le package régulier - Video_player , vous pouvez afficher une version non établie de votre vidéo à l'aide du code suivant:
return FittedBox(
fit: BoxFit.cover,
child: SizedBox(
height: model.videoPlayerController.value.size?.height ?? 0,
width: model.videoPlayerController.value.size?.width ?? 0,
child: VideoPlayer(model.videoPlayerController),
),
);
J'ai écrit un article sur Affichage des vidéos d'une URL dans le flutter aussi.
Tout d'abord, essayez de changer _controller.value.size.aspectRatio
Sur _controller.value.aspectRatio
.
Ensuite, assurez-vous d'initialiser le contrôleur à l'aide de _controller.initialize()
.
Si cela donne l'erreur, ajoutez une vérification null.
_controller != null
? // Do your code
: Text("Controller is null")
Cela devrait résoudre votre problème.
Vous devez attendre que le contrôleur de lecteur vidéo soit initialisé. Attribuez une valeur de rapport de format à ChewieController
uniquement après que le _playerController.initialize()
est complet (dans le bloc then
).
@override
void initState() {
super.initState();
Uri videoUrl = VideoProvider.fromUri(_post.url).getVideos().first.uri;
_playerController = VideoPlayerController.network(videoUrl.toString());
_initializeVideoPlayerFuture = _playerController.initialize().then((_) {
_chewieController = ChewieController(
videoPlayerController: _playerController,
aspectRatio: _playerController.value.aspectRatio,
allowedScreenSleep: false,
errorBuilder: (context, error) => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.error),
Text(error),
],
)),
);
});
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initializeVideoPlayerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return AspectRatio(
aspectRatio: _playerController.value.aspectRatio,
child: Chewie(
controller: _chewieController,
),
);
} else {
return Center(child: CircularProgressIndicator());
}
},
);