Flutter视频压缩插件video_compress_v2的使用

Flutter视频压缩插件video_compress_v2的使用

Version 平台

video_compress_v2 是一个用于Flutter的新视频压缩支持库。它可以将HDR视频转换为SDR视频,压缩视频,移除音频,处理缩略图,并使您的视频在所有平台上兼容。该库完全使用原生代码编写,未使用FFMPEG,因为FFMPEG速度较慢且体积庞大,GNU许可证也对商业应用构成障碍。

目录

开始使用

1. 添加依赖

在您的包的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  video_compress_v2: last-version

2. 安装依赖

通过命令行安装依赖:

$  pub get

3. 导入库

在Dart代码中导入库:

import 'package:video_compress_v2/video_compress.dart';

如何使用

导入

import 'package:video_compress_v2/video_compress.dart';

视频压缩

使用以下方法压缩视频:

MediaInfo mediaInfo = await VideoCompressV2.compressVideo(
  path,
  quality: VideoQuality.DefaultQuality, 
  deleteOrigin: false, // 默认为false
);

检查压缩状态

检查视频是否正在压缩:

VideoQuality.isCompressing

从VideoPath获取内存缩略图

从视频路径获取内存缩略图:

final uint8list = await VideoCompressV2.getByteThumbnail(
  videopath,
  quality: 50, // 默认值为100
  position: -1 // 默认值为-1
);

从VideoPath获取文件缩略图

从视频路径获取文件缩略图:

final thumbnailFile = await VideoCompressV2.getFileThumbnail(
  videopath,
  quality: 50, // 默认值为100
  position: -1 // 默认值为-1
);

获取媒体信息

获取视频的媒体信息:

final info = await VideoCompressV2.getMediaInfo(videopath);

删除所有缓存文件

删除所有由video_compress生成的文件:

await VideoCompressV2.deleteAllCache()

监听压缩进度

监听压缩进度:

class _Compress extends State<Compress> {

  StreamSubscription _subscription;

  [@override](/user/override)
  void initState() {
    super.initState();
    _subscription =
        VideoCompressV2.compressProgress$.listen((progress) {
      debugPrint('progress: $progress');
    });
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    _subscription.cancel();
  }
}

待办事项

  • 添加裁剪视频功能
  • 为Android添加取消功能

方法

函数名 参数 描述 返回类型
getByteThumbnail String path [视频路径], int quality(1-100)[缩略图质量], int position [从视频位置获取缩略图] 从视频路径获取缩略图 Future<Uint8List>
getFileThumbnail String path [视频路径], int quality(1-100)[缩略图质量], int position [从视频位置获取缩略图] 从视频路径获取缩略图文件 Future<File>
getMediaInfo String path [视频路径] 从视频路径获取媒体信息 Future<MediaInfo>
compressVideo String path [视频路径], VideoQuality quality [压缩视频质量], bool deleteOrigin [删除原始视频], int startTime [压缩视频开始时间], int duration [从开始时间起的压缩视频时长], bool includeAudio [压缩视频是否包含音频], int frameRate [压缩视频帧率] 在原始视频路径上压缩视频 Future<MediaInfo>
cancelCompression 取消压缩 Future<void>
deleteAllCache 删除所有由video_compress生成的文件 Future<bool>

订阅

订阅名称 描述 流类型
compressProgress$ 订阅压缩进度流 double progress

贡献

欢迎贡献!

致谢

本项目受到flutter_ffmpeg库的启发。

由Flutter团队在Tastech-asia制作并以❤完成。

示例代码

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:video_compress_v2/video_compress_v2.dart';
import 'package:file_selector/file_selector.dart';
import 'dart:io';

import 'package:video_compress_v2_example/video_thumbnail.dart';

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

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

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 _counter = 'video';

  Future<void> _compressVideo() async {
    var file;
    if (Platform.isMacOS) {
      final typeGroup = XTypeGroup(label: 'videos', extensions: ['mov', 'mp4']);
      file = await openFile(acceptedTypeGroups: [typeGroup]);
    } else {
      final picker = ImagePicker();
      var pickedFile = await picker.pickVideo(source: ImageSource.gallery);
      file = File(pickedFile!.path);
    }
    if (file == null) {
      return;
    }
    await VideoCompressV2.setLogLevel(0);
    final info = await VideoCompressV2.compressVideo(
      file.path,
      quality: VideoQuality.Res1280x720Quality,
      deleteOrigin: false,
      includeAudio: true,
    );
    print(info!.path);
    setState(() {
      _counter = info.path!;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            InkWell(
                child: Icon(
                  Icons.cancel,
                  size: 55,
                ),
                onTap: () {
                  VideoCompressV2.cancelCompression();
                }),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => VideoThumbnail()),
                );
              },
              child: Text('Test thumbnail'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async => _compressVideo(),
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


video_compress_v2 是一个用于在 Flutter 应用中压缩视频的插件。它提供了简单易用的 API 来处理视频压缩任务。以下是如何使用 video_compress_v2 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  video_compress_v2: ^版本号

确保替换 ^版本号 为最新的 video_compress_v2 插件版本。

2. 获取插件实例

在你的 Dart 文件中导入插件并获取其实例:

import 'package:video_compress_v2/video_compress_v2.dart';

final videoCompress = VideoCompress();

3. 压缩视频

使用 compressVideo 方法来压缩视频。你需要提供视频的路径,并且可以选择性地指定压缩质量、分辨率等参数。

Future<void> compressVideo() async {
  try {
    final MediaInfo? mediaInfo = await videoCompress.compressVideo(
      '/path/to/your/video.mp4',
      quality: VideoQuality.MediumQuality,
      deleteOrigin: false, // 是否删除原文件
    );

    if (mediaInfo != null) {
      print('压缩后的视频路径: ${mediaInfo.path}');
      print('压缩后的视频大小: ${mediaInfo.filesize}');
    }
  } catch (e) {
    print('视频压缩出错: $e');
  }
}

4. 获取缩略图

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

Future<void> getVideoThumbnail() async {
  try {
    final thumbnailFile = await videoCompress.getThumbnail(
      '/path/to/your/video.mp4',
      quality: 50, // 缩略图质量 (1-100)
    );

    print('缩略图路径: ${thumbnailFile.path}');
  } catch (e) {
    print('获取缩略图出错: $e');
  }
}

5. 删除临时文件

如果你希望在压缩完成后删除临时文件,可以使用 deleteAllCache 方法:

await videoCompress.deleteAllCache();

6. 其他方法

video_compress_v2 还提供了其他一些方法,例如:

  • getMediaInfo: 获取视频的详细信息(如尺寸、时长、大小等)。
  • cancelCompression: 取消正在进行的压缩任务。
// 获取视频信息
final mediaInfo = await videoCompress.getMediaInfo('/path/to/your/video.mp4');
print('视频时长: ${mediaInfo.duration}');

// 取消压缩
videoCompress.cancelCompression();

7. 注意事项

  • 压缩视频的处理时间取决于视频的大小和设备的性能。
  • 确保你有权限读取和写入设备存储,尤其是在 Android 和 iOS 上进行文件操作时。

8. 示例代码

下面是一个完整的示例代码,展示如何使用 video_compress_v2 插件压缩视频并获取缩略图:

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

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

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

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

class _VideoCompressExampleState extends State<VideoCompressExample> {
  final videoCompress = VideoCompress();

  Future<void> compressVideo() async {
    try {
      final mediaInfo = await videoCompress.compressVideo(
        '/path/to/your/video.mp4',
        quality: VideoQuality.MediumQuality,
        deleteOrigin: false,
      );

      if (mediaInfo != null) {
        print('压缩后的视频路径: ${mediaInfo.path}');
        print('压缩后的视频大小: ${mediaInfo.filesize}');
      }
    } catch (e) {
      print('视频压缩出错: $e');
    }
  }

  Future<void> getVideoThumbnail() async {
    try {
      final thumbnailFile = await videoCompress.getThumbnail(
        '/path/to/your/video.mp4',
        quality: 50,
      );

      print('缩略图路径: ${thumbnailFile.path}');
    } catch (e) {
      print('获取缩略图出错: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Compress Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: compressVideo,
              child: Text('Compress Video'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: getVideoThumbnail,
              child: Text('Get Thumbnail'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部