diff --git a/CHANGELOG.md b/CHANGELOG.md index 3268230a..029789f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.0+3 + +- `get_thumbnail_video: ^0.7.3` used instead of `video_thumbnail: ^0.5.3` because it's not maintained anymore + ## 3.0.0 > **Note** diff --git a/lib/src/export/ffmpeg_export_config.dart b/lib/src/export/ffmpeg_export_config.dart index bfd3b66f..3033dd4a 100644 --- a/lib/src/export/ffmpeg_export_config.dart +++ b/lib/src/export/ffmpeg_export_config.dart @@ -3,11 +3,12 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:get_thumbnail_video/index.dart'; +import 'package:get_thumbnail_video/video_thumbnail.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:video_editor/src/controller.dart'; import 'package:video_editor/src/models/file_format.dart'; -import 'package:video_thumbnail/video_thumbnail.dart'; class FFmpegVideoEditorExecute { const FFmpegVideoEditorExecute({ @@ -100,8 +101,7 @@ abstract class FFmpegVideoEditorConfig { required String filePath, required FileFormat format, }) async { - final String tempPath = - outputDirectory ?? (await getTemporaryDirectory()).path; + final String tempPath = outputDirectory ?? (await getTemporaryDirectory()).path; final String n = name ?? path.basenameWithoutExtension(filePath); final int epoch = DateTime.now().millisecondsSinceEpoch; return "$tempPath/${n}_$epoch.${format.extension}"; @@ -115,8 +115,7 @@ abstract class FFmpegVideoEditorConfig { /// ``` /// Returns the [double] progress value between 0.0 and 1.0. double getFFmpegProgress(int time) { - final double progressValue = - time / controller.trimmedDuration.inMilliseconds; + final double progressValue = time / controller.trimmedDuration.inMilliseconds; return progressValue.clamp(0.0, 1.0); } @@ -159,8 +158,7 @@ class VideoFFmpegVideoEditorConfig extends FFmpegVideoEditorConfig { /// Returns the FFmpeg command to make the generated GIF to loop infinitely /// [see FFmpeg doc](https://ffmpeg.org/ffmpeg-formats.html#gif-2) - String get gifCmd => - format.extension == VideoExportFormat.gif.extension ? "-loop 0" : ""; + String get gifCmd => format.extension == VideoExportFormat.gif.extension ? "-loop 0" : ""; /// Returns the list of all the active filters, including the GIF filter @override @@ -179,8 +177,7 @@ class VideoFFmpegVideoEditorConfig extends FFmpegVideoEditorConfig { @override Future getExecuteConfig() async { final String videoPath = controller.file.path; - final String outputPath = - await getOutputPath(filePath: videoPath, format: format); + final String outputPath = await getOutputPath(filePath: videoPath, format: format); final List filters = getExportFilters(); return FFmpegVideoEditorExecute( @@ -226,14 +223,16 @@ class CoverFFmpegVideoEditorConfig extends FFmpegVideoEditorConfig { /// Generate this selected cover image as a JPEG [File] /// /// If this controller's [selectedCoverVal] is `null`, then it return the first frame of this video. - Future _generateCoverFile() async => VideoThumbnail.thumbnailFile( - imageFormat: ImageFormat.JPEG, - thumbnailPath: (await getTemporaryDirectory()).path, - video: controller.file.path, - timeMs: controller.selectedCoverVal?.timeMs ?? - controller.startTrim.inMilliseconds, - quality: quality, - ); + Future _generateCoverFile() async { + final file = await VideoThumbnail.thumbnailFile( + imageFormat: ImageFormat.JPEG, + thumbnailPath: (await getTemporaryDirectory()).path, + video: controller.file.path, + timeMs: controller.selectedCoverVal?.timeMs ?? controller.startTrim.inMilliseconds, + quality: quality, + ); + return file.path; + } /// Returns a [FFmpegVideoEditorExecute] command to be executed with FFmpeg to export /// the cover image applying the editing parameters. @@ -245,8 +244,7 @@ class CoverFFmpegVideoEditorConfig extends FFmpegVideoEditorConfig { debugPrint('VideoThumbnail library error while exporting the cover'); return null; } - final String outputPath = - await getOutputPath(filePath: coverPath, format: format); + final String outputPath = await getOutputPath(filePath: coverPath, format: format); final List filters = getExportFilters(); return FFmpegVideoEditorExecute( diff --git a/lib/src/utils/thumbnails.dart b/lib/src/utils/thumbnails.dart index dc733035..85c7f725 100644 --- a/lib/src/utils/thumbnails.dart +++ b/lib/src/utils/thumbnails.dart @@ -1,9 +1,10 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:get_thumbnail_video/index.dart'; +import 'package:get_thumbnail_video/video_thumbnail.dart'; import 'package:video_editor/src/controller.dart'; import 'package:video_editor/src/models/cover_data.dart'; -import 'package:video_thumbnail/video_thumbnail.dart'; Stream> generateTrimThumbnails( VideoEditorController controller, { @@ -15,15 +16,13 @@ Stream> generateTrimThumbnails( for (int i = 1; i <= quantity; i++) { try { - final Uint8List? bytes = await VideoThumbnail.thumbnailData( + final Uint8List bytes = await VideoThumbnail.thumbnailData( imageFormat: ImageFormat.JPEG, video: path, timeMs: (eachPart * i).toInt(), quality: controller.trimThumbnailsQuality, ); - if (bytes != null) { - byteList.add(bytes); - } + byteList.add(bytes); } catch (e) { debugPrint(e.toString()); } @@ -72,7 +71,7 @@ Future generateSingleCoverThumbnail( int timeMs = 0, int quality = 10, }) async { - final Uint8List? thumbData = await VideoThumbnail.thumbnailData( + final Uint8List thumbData = await VideoThumbnail.thumbnailData( imageFormat: ImageFormat.JPEG, video: filePath, timeMs: timeMs, diff --git a/pubspec.yaml b/pubspec.yaml index 9f44d99b..f39e7457 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: video_editor -version: 3.0.0+1 +version: 3.0.0+3 description: | A flutter package for editing video with fully customizable UI. Supports crop, trim, rotation and cover selection. @@ -18,7 +18,7 @@ dependencies: path_provider: ^2.0.12 transparent_image: ^2.0.1 # show fade-in placeholder in thumbnails generation video_player: ^2.6.1 - video_thumbnail: ^0.5.3 + get_thumbnail_video: ^0.7.3 dev_dependencies: flutter_test: