Flutter视频压缩插件wy_video_compress的使用

发布于 1周前 作者 ionicwang 来自 Flutter

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

1 回复

更多关于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.xmlInfo.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)),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!