Flutter视频滑动控制插件video_slider的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter视频滑动控制插件video_slider的使用

video_slider 是一个用于裁剪视频特定区域的简单视频滑块库。

视频滑块示例

该库受 video_editor 启发。几乎所有的滑块代码都是从该库复制过来的。我所做的只是将滑块从其他依赖项(如播放器、裁剪器和ffmpeg)中提取出来。您可以将这个简单的滑块与其他原始播放器或您想要使用的裁剪方法结合起来。

需求

  • sdk: >=2.12.0 <3.0.0
  • flutter: >=1.20.0

安装

在您的 pubspec.yaml 文件中添加 video_slider 依赖项:

dependencies:
  video_slider: ^0.0.1

使用

示例

/// 需要将 VideoSlider 包裹在一个具有宽度和高度约束的部件中。
Container(
  width: MediaQuery.of(context).size.width - 40,
  height: 60,
  margin: const EdgeInsets.symmetric(horizontal: 20),
  child: VideoSlider(
    controller: widget.controller,
    height: 60,
    maxDuration: const Duration(seconds: 15),
  ),
)

请参阅 示例 获取更多信息。

完整示例代码

以下是一个完整的示例,展示了如何使用 video_slider 插件来裁剪视频。

import 'dart:io';

import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:video_slider/video_slider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'VideoSlider Demo',
      home: PickerPage(),
    );
  }
}

class PickerPage extends StatefulWidget {
  const PickerPage({Key? key}) : super(key: key);

  [@override](/user/override)
  _PickerPageState createState() => _PickerPageState();
}

class _PickerPageState extends State<PickerPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            final assets = await FilePicker.platform.pickFiles(type: FileType.video);
            if (assets != null) {
              final controller = VideoEditorController.file(File(assets.files.single.path!));
              Navigator.push(
                context,
                MaterialPageRoute<bool>(
                  builder: (_) => AppPage(controller),
                ),
              );
            }
          },
          child: Text("Pick Video From Gallery"),
        ),
      ),
    );
  }
}

class AppPage extends StatefulWidget {
  const AppPage(this.controller, {Key? key}) : super(key: key);

  final VideoEditorController controller;

  [@override](/user/override)
  _AppPageState createState() => _AppPageState();
}

class _AppPageState extends State<AppPage> {
  String _positionText = 'Start: \nEnd: ';

  [@override](/user/override)
  void initState() {
    super.initState();
    _init();
  }

  Future<void> _init() async {
    await widget.controller.initialize();
    widget.controller.video.play();
    setState(() {});
  }

  [@override](/user/override)
  void dispose() {
    widget.controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Container(
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height,
          color: Colors.black,
          child: Stack(
            children: [
              Align(
                alignment: Alignment.center,
                child: widget.controller.video.value.isInitialized
                    ? AspectRatio(
                        aspectRatio: widget.controller.video.value.aspectRatio,
                        child: VideoPlayer(widget.controller.video),
                      )
                    : const Center(
                        child: Text('Loading...'),
                      ),
              ),
              Align(
                alignment: Alignment.center,
                child: ElevatedButton(
                  child: Text('Print start position time and end position time.'),
                  onPressed: () {
                    final duration = widget.controller.video.value.duration.inSeconds;
                    final start = widget.controller.minTrim * duration;
                    final end = widget.controller.maxTrim * duration;
                    setState(() {
                      _positionText = 'Start: $start\nEnd: $end';
                    });
                  },
                ),
              ),
              if (widget.controller.video.value.isInitialized)
                Positioned(
                  bottom: 100,
                  child: Column(
                    children: [
                      Text(
                        _positionText,
                        style: TextStyle(
                          color: Colors.red,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                      Container(
                        width: MediaQuery.of(context).size.width - 40,
                        height: 60,
                        margin: const EdgeInsets.symmetric(horizontal: 20),
                        child: VideoSlider(
                          controller: widget.controller,
                          height: 60,
                          maxDuration: const Duration(seconds: 15),
                        ),
                      ),
                    ],
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter视频滑动控制插件video_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频滑动控制插件video_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用video_slider插件来控制视频播放的一个基本示例。请注意,video_slider并非一个官方或广泛认知的插件名称,因此我将假设你指的是一个自定义的或第三方插件,该插件提供视频播放进度条的控制功能。如果实际上是指其他插件,请查阅相应的文档进行调整。

首先,你需要确保你的Flutter项目已经添加了视频播放相关的依赖,比如chewievideo_player,因为video_slider很可能依赖于这些库来实现视频播放功能。以下是一个示例的pubspec.yaml依赖部分:

dependencies:
  flutter:
    sdk: flutter
  video_player: ^2.2.10 # 确保使用最新版本
  chewie: ^1.2.2 # 确保使用最新版本
  # 假设 video_slider 是一个第三方插件,你可能需要添加它的依赖,如下(注意替换为实际插件名)
  # video_slider: ^x.y.z # 替换为实际版本号

然后,在pubspec.yaml文件所在目录运行flutter pub get来获取这些依赖。

接下来,在你的Dart代码中集成视频播放和滑动控制。由于video_slider的具体实现细节未知,我将提供一个基于chewievideo_player的基本示例,并假设video_slider是一个封装好的控件,可以嵌入到Flutter应用中。

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
// 假设 video_slider 是可用的,并导入它
// import 'package:video_slider/video_slider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoPlayerScreen(),
    );
  }
}

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  VideoPlayerController _controller;
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    // 初始化视频控制器
    _controller = VideoPlayerController.network(
      'https://www.example.com/video.mp4', // 替换为你的视频URL
    )
      ..initialize().then((_) {
        // 一旦视频初始化完成,设置Chewie控制器
        setState(() {
          _chewieController = ChewieController(
            videoPlayerController: _controller,
            aspectRatio: _controller.value.aspectRatio,
            autoPlay: false,
            looping: false,
          );
        });
      });
  }

  @override
  void dispose() {
    _controller.dispose();
    _chewieController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Player with Slider'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? Chewie(
                controller: _chewieController,
              )
            // 假设 video_slider 是一个Widget,你可以这样使用它
            // : VideoSlider(
            //     videoController: _controller,
            //     // 其他参数配置
            //   )
            : Container(
                child: CircularProgressIndicator(),
              ),
      ),
    );
  }
}

// 如果 video_slider 实际上是一个封装好的控件,并提供了类似下面的API,你可以按照以下方式使用(仅为示例)
/*
class VideoSlider extends StatelessWidget {
  final VideoPlayerController videoController;

  VideoSlider({required this.videoController, Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Slider(
      value: videoController.value.position.inSeconds.toDouble(),
      min: 0,
      max: videoController.value.duration.inSeconds.toDouble(),
      onChanged: (newValue) {
        videoController.seekTo(Duration(seconds: newValue.toInt()));
      },
    );
  }
}
*/

在这个示例中,我使用了video_playerchewie来播放视频。如果video_slider是一个存在的插件,并且提供了一个封装好的控件,你很可能只需要将其替换或嵌入到上述代码中的相应位置。请查阅video_slider的实际文档以获取正确的使用方法和API。

由于video_slider的具体实现细节未知,上述代码中的VideoSlider类是一个假设性的示例,展示了如何创建一个自定义的视频进度条控件。如果video_slider插件已经提供了这样的功能,你应该按照其文档进行集成。

回到顶部