Flutter视频压缩插件video_compress_v2的使用
Flutter视频压缩插件video_compress_v2的使用
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
更多关于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'),
),
],
),
),
);
}
}