Flutter视频帧导出插件flutter_export_video_frames的使用

Flutter视频帧导出插件flutter_export_video_frames的使用

获取开始

本项目是一个新的 Flutter 插件包起点,包含针对 Android 和/或 iOS 的平台特定实现代码。

对于如何开始使用 Flutter,您可以查看官方文档,获取教程、示例、移动开发指南以及完整的 API 参考。

使用示例

以下是一个完整的示例,展示了如何使用 flutter_export_video_frames 插件来从视频中导出帧并保存到本地。

示例代码

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_export_video_frames/flutter_export_video_frames.dart';
import 'package:image_picker/image_picker.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "插件示例应用",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(images: []),
    );
  }
}

class ImageItem extends StatelessWidget {
  ImageItem({required this.image});

  final Image image;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(child: image);
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({required this.images});

  final List<Image> images;

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

class _MyHomePageState extends State<MyHomePage> {
  var _isClean = false;

  Future _getImages() async {
    // 从相册选择一个视频
    var file = await ImagePicker.platform.pickVideo(source: ImageSource.gallery);
    // 导出视频的前10帧
    var images = await ExportVideoFrame.exportImage(file!.path, 10, 0);
    // 将导出的帧转换为Image对象
    var result = images.map((file) => Image.file(file)).toList();
    // 更新UI
    setState(() {
      widget.images.addAll(result);
      _isClean = true;
    });
  }

  Future _getGifImages() async {
    // 从相册选择一个视频
    var file = await ImagePicker.platform.pickImage(source: ImageSource.gallery);
    // 导出视频的GIF图像
    var images = await ExportVideoFrame.exportGifImage(file!.path, 0);
    // 将导出的帧转换为Image对象
    var result = images.map((file) => Image.file(file)).toList();
    // 更新UI
    setState(() {
      widget.images.addAll(result);
      _isClean = true;
    });
  }

  Future _getImagesByDuration() async {
    // 从相册选择一个视频
    var file = await ImagePicker.platform.pickVideo(source: ImageSource.gallery);
    // 设置导出帧的时间间隔
    var duration = Duration(seconds: 1);
    // 导出指定时间间隔的帧
    var image = await ExportVideoFrame.exportImageBySeconds(
        file!.path, duration, pi / 2);
    // 更新UI
    setState(() {
      widget.images.add(Image.file(image));
      _isClean = true;
    });
    // 保存图像到本地
    await ExportVideoFrame.saveImage(image, "Video Export Demo",
        waterMark: "images/water_mark.png",
        alignment: Alignment.bottomLeft,
        scale: 2.0);
  }

  Future _cleanCache() async {
    // 清除缓存
    var result = await ExportVideoFrame.cleanImageCache();
    print(result);
    setState(() {
      widget.images.clear();
      _isClean = false;
    });
  }

  Future _handleClickFirst() async {
    if (_isClean) {
      await _cleanCache();
    } else {
      await _getImages();
    }
  }

  Future _handleClickSecond() async {
    if (_isClean) {
      await _cleanCache();
    } else {
      await _getImagesByDuration();
    }
  }

  Future _handleClickThird() async {
    if (_isClean) {
      await _cleanCache();
    } else {
      await _getGifImages();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("导出图像"),
      ),
      body: Container(
        padding: EdgeInsets.zero,
        child: Column(
          children: [
            Expanded(
              flex: 1,
              child: GridView.extent(
                  maxCrossAxisExtent: 400,
                  childAspectRatio: 1.0,
                  padding: const EdgeInsets.all(4),
                  mainAxisSpacing: 4,
                  crossAxisSpacing: 4,
                  children: widget.images.length > 0
                      ? widget.images
                          .map((image) => ImageItem(image: image))
                          .toList()
                      : [Container()]),
            ),
            Expanded(
              flex: 0,
              child: Center(
                child: MaterialButton(
                  padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
                  height: 40,
                  minWidth: 100,
                  onPressed: () {
                    _handleClickFirst();
                  },
                  color: Colors.orange,
                  child: Text(_isClean ? "清除" : "导出图像列表"),
                ),
              ),
            ),
            Expanded(
              flex: 0,
              child: Center(
                child: MaterialButton(
                  padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
                  height: 40,
                  minWidth: 150,
                  onPressed: () {
                    _handleClickSecond();
                  },
                  color: Colors.orange,
                  child: Text(_isClean ? "清除" : "导出单个图像并保存"),
                ),
              ),
            ),
            Expanded(
              flex: 0,
              child: Center(
                child: MaterialButton(
                  padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
                  height: 40,
                  minWidth: 150,
                  onPressed: () {
                    _handleClickThird();
                  },
                  color: Colors.orange,
                  child: Text(_isClean ? "清除" : "导出GIF图像"),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter视频帧导出插件flutter_export_video_frames的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频帧导出插件flutter_export_video_frames的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_export_video_frames 是一个 Flutter 插件,用于从视频中提取帧并将其导出为图像。这个插件可以帮助你实现视频帧的提取和保存功能。以下是使用 flutter_export_video_frames 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_export_video_frames 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_export_video_frames: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:flutter_export_video_frames/flutter_export_video_frames.dart';

3. 使用插件提取视频帧

接下来,你可以使用插件提供的功能来提取视频帧并将其保存为图像。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:flutter_export_video_frames/flutter_export_video_frames.dart';

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

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

class VideoFrameExtractionDemo extends StatefulWidget {
  [@override](/user/override)
  _VideoFrameExtractionDemoState createState() => _VideoFrameExtractionDemoState();
}

class _VideoFrameExtractionDemoState extends State<VideoFrameExtractionDemo> {
  String _videoPath = 'path_to_your_video.mp4';  // 替换为你的视频路径
  String _outputDirectory = 'path_to_output_directory';  // 替换为输出目录路径

  Future<void> _extractVideoFrames() async {
    try {
      // 初始化插件
      FlutterExportVideoFrames exporter = FlutterExportVideoFrames();

      // 提取视频帧
      List<String> framePaths = await exporter.exportFrames(
        videoPath: _videoPath,
        outputDirectory: _outputDirectory,
        frameRate: 1,  // 每秒钟提取一帧
      );

      // 打印提取的帧路径
      for (String framePath in framePaths) {
        print('Extracted frame: $framePath');
      }

      // 显示成功消息
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Frames extracted successfully!')),
      );
    } catch (e) {
      // 显示错误消息
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error extracting frames: $e')),
      );
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Frame Extraction'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _extractVideoFrames,
          child: Text('Extract Frames'),
        ),
      ),
    );
  }
}
回到顶部