【问题标题】:Volume Gesture lagging pre loaded multiple video音量手势滞后预加载多个视频
【发布时间】:2022-01-15 06:45:38
【问题描述】:

对于使用 preload_page_view 包的上述问题有类似的答案,但我遇到了问题。

我尝试了以下两种有包和无包的方法

带包装:

return Scaffold(
      body: PreloadPageView.builder(
        controller: _controller,
        preloadPagesCount: 3,
      scrollDirection: Axis.vertical,
        itemCount: 10,
        itemBuilder: (context, i) {
        return  VideoInit(
          index: i,
           videoUrl: sampleVideo[i],

        );
      }),
    );

没有包,我做了这个技巧:通过提供 viewportFraction

 return Scaffold(
      body: PageView.builder(
        allowImplicitScrolling: true,
        controller: PageController(viewportFraction: 0.999),
        itemCount: 3,
        itemBuilder: (context, i) {
        return  VideoInit(
          index: i,
           videoUrl: sampleVideo[i],

        );
      }),
    );

视频播放器的代码是:

 late VideoPlayerController _controller;
  bool initialized = false;

  initiliazeVideo() {

    _controller = VideoPlayerController.network(
       widget.videoUrl)
      ..initialize().then((_) {
        if (mounted) {
          setState(() {
            _controller.setLooping(true);
            _controller.pause();
            initialized = true;
          });
        }
      });
  }

  @override
  void initState() {
    initiliazeVideo();
    super.initState();
  }

  @override
  void dispose() {
        if (initialized) {
      initialized = false;
      _controller.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return  VisibilityDetector(
      onVisibilityChanged: (info) {
        if (info.visibleFraction > 0.5) {
          if (initialized) {
            _controller.play();
          }
        } else if (info.visibleFraction < 0.4) {
          if (initialized) {
            _controller.pause();
            _controller.seekTo(Duration.zero);
          }
        }
      },
      key: UniqueKey(),
      child: initialized
          ? SizedBox.expand(
              child: FittedBox(
                fit:  BoxFit.cover,
                child: SizedBox(
                  width: _controller.value.size.width,
                  height: _controller.value.size.height,
                  child: VideoPlayer(_controller),
                ),
              ),
            )
          : const Center(child: CircularProgressIndicator()),
    );
 

上述方法的问题是当用户尝试使用音量按钮并滑动音量指示器来调整android上的音量时,视频开始滞后

https://www.dropbox.com/s/z7t2fvszd8p9f2y/VID_20220115124459.mp4?dl=0


有什么替代方法可以解决这个问题?

编辑/更新
如果我什至使用 listViewBuilder,就会出现滞后。如果页面视图或列表视图中有单个视频,则不存在此类问题。我认为这是因为多个视频控制器的初始化。
对于实现所需目标的替代方法有什么建议吗?

【问题讨论】:

  • 问题可能与 PageView 本身无关,但 VideoPlayer - 你检查它是否在没有 PageView 的情况下滞后?
  • 如果我使用 listViewBuilder,就会出现滞后。如果页面视图或列表视图中有单个视频,则不存在此类问题。我认为这是因为多个视频控制器的初始化。 @mfkw1

标签: flutter dart flutter-dependencies flutter-video-player


【解决方案1】:

如果您不想同时播放多个VideoPlayers,更可靠的同步它们的方法是收听PageController

_controllerindex 传递到每个页面,收听它和play()/pause() 基于_controller.page == index 的视频。

这应该有一个额外的好处,即在页面切换期间暂停所有内容(如果您不希望这样做,可以使用.floor().ceil() 更改条件)

【讨论】:

  • 您能详细说明一下您的代码吗?在上面的代码中,我没有同时播放多个视频。我只是预加载并初始化它们,以减少初始化时间,当那个页面可见时,我播放视频
  • 是的,但我认为问题在于使用 VisibilityDetector 检测页面何时可见。尝试听 PageController 代替,如我的回答中所述。如果您仍然无法正确理解,请随时发表评论,我会尽力为您提供更详细的代码示例。
  • 嗨,问题不在于 VisibilityDetector,因为我什至尝试过使用 Provider。通过创建一个 ChangeNotifier。然后在 onPageChanged 函数中设置 currentPageView 的值并向下传递页面索引的小部件树并检查 videosProvider.currentVideo == widget.index
  • 我已经尝试过你的方法,甚至```widget.controller.addListener(() { if (widget.controller.page == widget.index) { _controller.play(); } else { _controller.pause(); } });``` 还是有问题
  • 不幸的是,我想不出任何其他解决方案。您可能应该在 video_player 包中提交错误。
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多