Flutter视频压缩插件wy_video_compress的使用
Flutter视频压缩插件wy_video_compress的使用
wy_video_compress
是一个用于在 Flutter 中对视频进行压缩的插件。它可以生成一个新的压缩视频路径,并可以选择保留原始视频或删除它。此外,该插件还可以从视频路径获取缩略图并提供视频信息,方便处理压缩后的视频。
使用步骤
1. 添加依赖
在 pubspec.yaml
文件中添加 wy_video_compress
插件的依赖:
dependencies:
wy_video_compress: ^0.6.1
然后运行以下命令以安装依赖:
flutter pub get
2. 初始化项目
创建一个 Flutter 应用程序并在 main.dart
文件中初始化插件。
示例代码
import 'package:flutter/material.dart';
import 'package:wy_video_compress/wy_video_compress.dart';
import 'package:file_selector/file_selector.dart';
import 'dart:io';
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 _before_info = '[Original video information]';
String _after_info = '[Compressed video information]';
late VideoPlayerController _videoPlayerController = VideoPlayerController.networkUrl(Uri.parse(''));
late CustomVideoPlayerController _customVideoPlayerController = CustomVideoPlayerController(
context: context,
videoPlayerController: _videoPlayerController,
);
String playPath = "";
Future<void> _compressVideo() async {
var file;
if (Platform.isMacOS) {
final typeGroup = XTypeGroup(label: 'videos', extensions: ['mov', 'mp4']);
file = await openFile(acceptedTypeGroups: [typeGroup]);
} else {
final List<AssetEntity>? result = await AssetPicker.pickAssets(
context,
pickerConfig: const AssetPickerConfig(requestType: RequestType.video, maxAssets: 1),
);
if (result != null && result.length > 0) {
AssetEntity entity = result[0];
file = await entity.file;
}
}
if (file == null) {
return;
}
await VideoCompress.setLogLevel(0);
final b_info = await VideoCompress.getMediaInfo(file.path);
var str = '[Original video information] info: ${b_info.toJson()}\n';
print(str);
setState(() {
_before_info = str;
});
// 压缩视频参数设置
final info = await VideoCompress.compressVideo(
file.path,
quality: VideoQuality.HighestQuality,
deleteOrigin: false,
includeAudio: true,
frameRate: 24,
bitRate: 17448464,
width: b_info.width! ~/ 2,
height: b_info.height! ~/ 2,
startTime: 0,
duration: 3,
);
if (info != null) {
playPath = info.path!;
var str = '[Compressed video information] info: ${info.toJson()}\n';
print(str);
setState(() {
_after_info = str;
});
}
}
Future<void> _saveVideoToAlbum() async {
if (!playPath.isEmpty) {
await VideoCompress.saveVideoToAlbum(playPath);
VideoCompress.deleteAllCache();
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title!),
),
body: ListView(
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_before_info',
style: Theme.of(context).textTheme.titleMedium,
),
Text(
'$_after_info',
style: Theme.of(context).textTheme.titleMedium,
),
InkWell(
child: Icon(
Icons.cancel,
size: 55,
),
onTap: () {
VideoCompress.cancelCompression();
},
),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => VideoThumbnail()),
);
},
child: Text('Test thumbnail'),
),
AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: CustomVideoPlayer(
customVideoPlayerController: _customVideoPlayerController
),
),
ElevatedButton(
onPressed: () {
if (_videoPlayerController.value.isPlaying) {
_videoPlayerController.pause();
} else {
_videoPlayerController = VideoPlayerController.file(File(playPath))..initialize().then((_) {
setState(() {});
});
_customVideoPlayerController = CustomVideoPlayerController(
context: context,
videoPlayerController: _videoPlayerController,
);
_videoPlayerController.play();
}
},
child: Text('Compressed Video Play'),
),
ElevatedButton(
onPressed: () => _saveVideoToAlbum(),
child: Text('Save Album'),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () async => _compressVideo(),
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
更多关于Flutter视频压缩插件wy_video_compress的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频压缩插件wy_video_compress的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
wy_video_compress
是一个用于 Flutter 应用的视频压缩插件。它可以帮助你轻松地压缩视频文件,从而减少文件大小,适合用于上传或存储。以下是如何在 Flutter 项目中使用 wy_video_compress
插件的步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 wy_video_compress
插件的依赖。
dependencies:
flutter:
sdk: flutter
wy_video_compress: ^1.0.0 # 请使用最新版本
然后,运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 wy_video_compress
插件。
import 'package:wy_video_compress/wy_video_compress.dart';
3. 初始化插件
在使用插件之前,建议先初始化插件。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await WyVideoCompress.initialize();
runApp(MyApp());
}
4. 压缩视频
使用 WyVideoCompress.compressVideo
方法来压缩视频。该方法需要传入视频文件的路径,并返回压缩后的视频文件路径。
void compressVideo(String videoPath) async {
try {
String compressedPath = await WyVideoCompress.compressVideo(
videoPath,
quality: VideoQuality.MediumQuality, // 压缩质量
deleteOrigin: false, // 是否删除原文件
);
print('Compressed video path: $compressedPath');
} catch (e) {
print('Error compressing video: $e');
}
}
5. 获取视频缩略图
你还可以使用 WyVideoCompress.getThumbnail
方法来获取视频的缩略图。
void getThumbnail(String videoPath) async {
try {
String thumbnailPath = await WyVideoCompress.getThumbnail(
videoPath,
quality: 50, // 缩略图质量 (0-100)
position: -1, // 缩略图的时间位置 (毫秒), -1 表示自动选择
);
print('Thumbnail path: $thumbnailPath');
} catch (e) {
print('Error getting thumbnail: $e');
}
}
6. 清理缓存
如果你在压缩过程中生成了临时文件,可以使用 WyVideoCompress.deleteAllCache
方法来清理缓存。
void deleteCache() async {
try {
await WyVideoCompress.deleteAllCache();
print('Cache deleted');
} catch (e) {
print('Error deleting cache: $e');
}
}
7. 处理权限
在 Android 和 iOS 上,你可能需要处理文件读取和写入的权限。确保你在 AndroidManifest.xml
和 Info.plist
中添加了相应的权限。
Android
在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
iOS
在 Info.plist
中添加以下权限:
<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your photo library to compress videos.</string>
8. 示例代码
以下是一个完整的示例代码,展示了如何使用 wy_video_compress
插件来压缩视频并获取缩略图。
import 'package:flutter/material.dart';
import 'package:wy_video_compress/wy_video_compress.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await WyVideoCompress.initialize();
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> {
String compressedPath;
String thumbnailPath;
void compressVideo() async {
String videoPath = 'path_to_your_video.mp4'; // 替换为你的视频路径
try {
compressedPath = await WyVideoCompress.compressVideo(
videoPath,
quality: VideoQuality.MediumQuality,
deleteOrigin: false,
);
setState(() {});
print('Compressed video path: $compressedPath');
} catch (e) {
print('Error compressing video: $e');
}
}
void getThumbnail() async {
String videoPath = 'path_to_your_video.mp4'; // 替换为你的视频路径
try {
thumbnailPath = await WyVideoCompress.getThumbnail(
videoPath,
quality: 50,
position: -1,
);
setState(() {});
print('Thumbnail path: $thumbnailPath');
} catch (e) {
print('Error getting thumbnail: $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'),
),
if (compressedPath != null)
Text('Compressed Video Path: $compressedPath'),
ElevatedButton(
onPressed: getThumbnail,
child: Text('Get Thumbnail'),
),
if (thumbnailPath != null)
Image.file(File(thumbnailPath)),
],
),
),
);
}
}