web-dev-qa-db-fra.com

Comment obtenir le rapport qualité-prix de la vidéo?

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)),
                              ),
                            );
                          },
                        ),
                      )
6
Gentle

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.

1
Joe Muller

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.

0
ProDevZ

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());
        }
      },
    );
0
yshean