Flutter视频压缩插件video_compressor的使用

Flutter视频压缩插件video_compressor的使用

video_compressor 是一个用于在 Flutter 应用中压缩视频的插件。通过该插件,您可以根据自定义配置对视频进行高效压缩。


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  video_compressor: ^0.5.0

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


2. 示例代码

以下是一个完整的示例代码,展示如何使用 video_compressor 插件对视频进行压缩。

示例代码

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:video_compressor/video_compressor.dart';
import 'package:file_picker/file_picker.dart';
import 'package:video_player/video_player.dart';
import 'package:open_file/open_file.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Video Compression',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Video Compression Experiment'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

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

class _MyHomePageState extends State<MyHomePage> {
  String _tips = ""; // 提示信息
  String _name = ""; // 视频名称
  int _duration = 0; // 视频时长(秒)
  int _compRate = 0; // 压缩率
  String _sizeChange = ""; // 文件大小变化
  String _compressedFile = ""; // 压缩后的文件路径
  bool _isVideoCompressed = false; // 是否已压缩

  // 重置状态
  void _reload() {
    setState(() {
      _tips = "";
      _name = "";
      _duration = 0;
      _compRate = 0;
      _sizeChange = "";
      _compressedFile = "";
      _isVideoCompressed = false;
    });
  }

  // 压缩视频
  Future<void> _compressVideo() async {
    _reload(); // 重置状态

    // 用户选择视频文件
    FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.video);
    if (result == null) return;

    File file = File(result.files.single.path!);

    // 获取视频元信息
    var videoInfo = await VideoMetaInfo().getVideoInfo(file.path);
    if (videoInfo == null) return;

    // 配置压缩参数
    CompressionConfig conf = CompressionConfig(
      videoInfo.mimetype!,
      videoInfo.duration!,
      videoInfo.filesize!,
      videoInfo.width!,
      videoInfo.height!,
      videoInfo.bitrate!,
    );

    // 检查是否需要压缩
    if (conf.isCompressionNeeded) {
      await VideoCompressor.setLogLevel(0); // 设置日志级别为0(无日志)

      // 开始压缩视频
      final MediaInfo? info = await VideoCompressor.compressVideo(
        file.path,
        quality: conf.targetQuality!,
        width: conf.targetWidth,
        height: conf.targetHeight,
        bps: conf.targetBps,
      );

      if (info != null) {
        if (info.status != null) {
          setState(() {
            _tips = "压缩失败,请使用原始视频上传!";
            _compressedFile = info.status!;
          });
        } else {
          setState(() {
            _tips = "压缩成功!";
            _name = videoInfo.title!;
            _duration = (videoInfo.duration! / 1000).round();
            _compRate = 100 - (info.filesize! / videoInfo.filesize! * 100).round();
            _sizeChange = "原视频大小:${(videoInfo.filesize! / (1024 * 1024)).round()} MB;压缩后大小:${(info.filesize! / (1024 * 1024)).round()} MB";
            _compressedFile = info.path!;
            _isVideoCompressed = true;
          });
        }
      }
    } else {
      setState(() {
        _tips = conf.tips!;
        _compressedFile = videoInfo.path!;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              '提示: $_tips',
              style: Theme.of(context).textTheme.headline6,
            ),
            Text(
              '文件名: $_name',
              style: Theme.of(context).textTheme.headline6,
            ),
            Text(
              '视频长度: ${_duration}秒',
              style: Theme.of(context).textTheme.headline6,
            ),
            Text(
              '压缩率: $_compRate%',
              style: Theme.of(context).textTheme.headline6,
            ),
            Text(
              '文件大小: $_sizeChange',
              style: Theme.of(context).textTheme.headline6,
            ),
            Visibility(
              visible: !_isVideoCompressed,
              child: StreamBuilder<double>(
                stream: VideoCompressor.onProgressUpdated,
                builder: (context, snapshot) {
                  if (snapshot.data != null && snapshot.data > 0) {
                    return Column(
                      children: [
                        LinearProgressIndicator(
                          minHeight: 8,
                          value: snapshot.data / 100,
                        ),
                        const SizedBox(height: 8),
                        Text('${snapshot.data.toStringAsFixed(0)}%', style: const TextStyle(fontSize: 20)),
                      ],
                    );
                  }
                  return const SizedBox.shrink();
                },
              ),
            ),
            ElevatedButton(
              onPressed: () async {
                if (_compressedFile.isNotEmpty) {
                  final result = await OpenFile.open(_compressedFile);
                } else {
                  setState(() {
                    _tips = "请先选择视频...";
                  });
                }
              },
              child: Text('播放视频'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _compressVideo,
        tooltip: '压缩视频',
        child: Icon(Icons.compress),
      ),
    );
  }
}

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

1 回复

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


video_compressor 是一个用于 Flutter 的视频压缩插件。它可以帮助你在 Flutter 应用中压缩视频文件,从而减少文件大小,节省存储空间和网络带宽。以下是使用 video_compressor 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  video_compressor: ^2.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在需要使用视频压缩功能的地方导入 video_compressor 插件:

import 'package:video_compressor/video_compressor.dart';

3. 压缩视频

你可以使用 VideoCompressor.compressVideo 方法来压缩视频。以下是一个简单的示例:

Future<void> compressVideo() async {
  // 选择视频文件路径
  String videoPath = '/path/to/your/video.mp4';

  try {
    // 压缩视频
    final compressedVideoPath = await VideoCompressor.compressVideo(
      videoPath,
      quality: VideoQuality.MediumQuality,  // 视频质量
      deleteOrigin: false,  // 是否删除原文件
    );

    print('压缩后的视频路径: $compressedVideoPath');
  } catch (e) {
    print('视频压缩失败: $e');
  }
}

4. 视频质量选项

VideoCompressor.compressVideo 方法允许你指定视频的压缩质量。以下是可用的质量选项:

  • VideoQuality.LowQuality: 低质量
  • VideoQuality.MediumQuality: 中等质量
  • VideoQuality.HighQuality: 高质量
  • VideoQuality.DefaultQuality: 默认质量

5. 其他功能

video_compressor 还提供了其他一些功能,例如:

  • 获取视频缩略图:你可以使用 VideoCompressor.getThumbnail 方法来获取视频的缩略图。

    Future<void> getThumbnail() async {
      String videoPath = '/path/to/your/video.mp4';
    
      final thumbnailPath = await VideoCompressor.getThumbnail(
        videoPath,
        quality: 50,  // 缩略图质量
      );
    
      print('缩略图路径: $thumbnailPath');
    }
回到顶部