diff --git a/README.md b/README.md index 2cdc9b9..46496a1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ It includes scripts to build `FFmpeg` native libraries, a wrapper library to run - Supports hybrid platforms: Flutter, React Native - Based on FFmpeg `v4.5-dev` or later with optional system and external libraries - 8 prebuilt binary packages available at [Github](https://github.com/arthenica/ffmpeg-kit/releases), [Maven Central](https://search.maven.org), [CocoaPods](https://cocoapods.org), [pub](https://pub.dev) and [npm](https://www.npmjs.com) -- Licensed under `LGPL 3.0`, or `GPL v3.0` if GPL licensed libraries are enabled +- Licensed under `LGPL 3.0` by default, `GPL v3.0` if GPL licensed libraries are enabled ### 2. Android @@ -126,6 +126,7 @@ the exact version number of `FFmpeg` is obtained using the `git describe --tags` | Platforms | FFmpegKit Version | FFmpeg Version | Release Date | |:----------------:|:----------------------------------------------------------------------------------:|:--------------:|:------------:| +| Flutter | [5.1.0](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v5.1.0) | 5.1.2 | Oct 02, 2022 | | Android | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | React Native | [4.5.2](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.2) | 4.5-dev-3393 | May 25, 2022 | diff --git a/docs/index.md b/docs/index.md index 12d8eed..c60828a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,7 +15,7 @@ applications and 8 prebuilt binary packages available at [Github](https://github - Supports hybrid platforms: Flutter, React Native - Based on FFmpeg `v4.5-dev` or later with optional system and external libraries - 8 prebuilt binary packages available at [Github](https://github.com/arthenica/ffmpeg-kit/releases), [Maven Central](https://search.maven.org), [CocoaPods](https://cocoapods.org), [pub](https://pub.dev) and [npm](https://www.npmjs.com) -- Licensed under `LGPL 3.0`, or `GPL v3.0` if GPL licensed libraries are enabled +- Licensed under `LGPL 3.0` by default, some packages licensed by `GPL v3.0` effectively ### 2. Android @@ -112,10 +112,11 @@ the same `FFmpeg` release branch. `dev` part in the version string indicates that `FFmpeg` source code is cloned from the `FFmpeg` `master` branch and the exact version number of `FFmpeg` is obtained using the `git describe --tags` command. -| Platforms | FFmpegKit Version | FFmpeg Version | Release Date | -|:----------------:|:----------------------------------------------------------------------------------:|:--------------:|:------------:| +| Platforms | FFmpegKit Version | FFmpeg Version | Release Date | +|:----------------:|:---------------------------------------------------------------------------------:|:--------------:|:------------:| +| Flutter | [5.1.0](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v5.1.0) | 5.1.2 | Oct 02, 2022 | | Android | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | -| Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | +| Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | React Native | [4.5.2](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.2) | 4.5-dev-3393 | May 25, 2022 | | Flutter | [4.5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v4.5.1) | 4.5-dev-3393 | Jan 02, 2022 | | React Native | [4.5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.1) | 4.5-dev-3393 | Jan 02, 2022 | diff --git a/flutter/flutter/CHANGELOG.md b/flutter/flutter/CHANGELOG.md index 31f1289..38e6d3f 100644 --- a/flutter/flutter/CHANGELOG.md +++ b/flutter/flutter/CHANGELOG.md @@ -1,3 +1,13 @@ +## 5.1.0 +- Feature release based on native v5.1 +- Implements AbstractSession.cancel() method +- Runs iOS and macOS callbacks on main queue + +## 5.1.0-LTS +- Feature release based on native v5.1.LTS +- Implements AbstractSession.cancel() method +- Runs iOS and macOS callbacks on main queue + ## 4.5.1 - Feature release based on native v4.5.1 diff --git a/flutter/flutter/README.md b/flutter/flutter/README.md index 8e2f409..b5623bd 100644 --- a/flutter/flutter/README.md +++ b/flutter/flutter/README.md @@ -5,14 +5,17 @@ - Includes both `FFmpeg` and `FFprobe` - Supports - `Android`, `iOS` and `macOS` - - FFmpeg `v4.5-dev` releases + - FFmpeg `v5.1.2` - `arm-v7a`, `arm-v7a-neon`, `arm64-v8a`, `x86` and `x86_64` architectures on Android - - `Android API Level 16` or later + - `Android API Level 24` or later + - `API Level 16` on LTS releases - `armv7`, `armv7s`, `arm64`, `arm64-simulator`, `i386`, `x86_64`, `x86_64-mac-catalyst` and `arm64-mac-catalyst` architectures on iOS - - `iOS SDK 10` or later + - `iOS SDK 12.1` or later + - `iOS SDK 10` on LTS releases - `arm64` and `x86_64` architectures on macOS - - `macOS SDK 10.12+` or later + - `macOS SDK 10.15` or later + - `macOS SDK 10.12` on LTS releases - Can process Storage Access Framework (SAF) Uris on Android - 25 external libraries @@ -24,7 +27,7 @@ `vid.stab`, `x264`, `x265`, `xvidcore` -- Licensed under LGPL 3.0, can be customized to support GPL v3.0 +- Licensed under `LGPL 3.0` by default, some packages licensed by `GPL v3.0` effectively ### 2. Installation @@ -32,21 +35,21 @@ Add `ffmpeg_kit_flutter` as a dependency in your `pubspec.yaml file`. ```yaml dependencies: - ffmpeg_kit_flutter: 4.5.1 + ffmpeg_kit_flutter: 5.1.0 ``` #### 2.1 Packages -`ffmpeg` includes built-in encoders for some popular formats. However, there are certain external libraries that needs +`FFmpeg` includes built-in encoders for some popular formats. However, there are certain external libraries that needs to be enabled in order to encode specific formats/codecs. For example, to encode an `mp3` file you need `lame` or `shine` library enabled. You have to install a `ffmpeg_kit_flutter` package that has at least one of them inside. To encode an `h264` video, you need to install a package with `x264` inside. To encode `vp8` or `vp9` videos, you need a `ffmpeg_kit_flutter` package with `libvpx` inside. `ffmpeg-kit` provides eight packages that include different sets of external libraries. These packages are named -according to the external libraries included in them. Refer to -[Packages](https://github.com/arthenica/ffmpeg-kit#8-packages) section of the project README to see the names of those -packages and external libraries included in each of them. +according to the external libraries included. Refer to the +[Packages](https://github.com/arthenica/ffmpeg-kit/wiki/Packages) wiki page to see the names of those +packages and external libraries included in each one of them. #### 2.2 Installing Packages @@ -55,7 +58,7 @@ using the following dependency format. ```yaml dependencies: - ffmpeg_kit_flutter_: 4.5.1 + ffmpeg_kit_flutter_: 5.1.0 ``` Note that hyphens in the package name must be replaced with underscores. Additionally, do not forget to use the package @@ -67,39 +70,44 @@ In order to install the `LTS` variant, append `-LTS` to the version you have for ```yaml dependencies: - ffmpeg_kit_flutter: 4.5.1-LTS + ffmpeg_kit_flutter: 5.1.0-LTS ``` #### 2.4 LTS Releases -`ffmpeg_kit_flutter` is published in two different variants: `Main Release` and `LTS Release`. Both releases share the -same source code but is built with different settings (Architectures, API Level, iOS Min SDK, etc.). Refer to -[LTS Releases](https://github.com/arthenica/ffmpeg-kit#10-lts-releases) section of the project README to see how they -compare to each other. +`ffmpeg_kit_flutter` is published in two variants: `Main Release` and `LTS Release`. Both releases share the +same source code but is built with different settings (Architectures, API Level, iOS Min SDK, etc.). Refer to the +[LTS Releases](https://github.com/arthenica/ffmpeg-kit/wiki/LTS-Releases) wiki page to see how they differ from each +other. -#### 2.5 Android and iOS Support +#### 2.5 Platform Support -The following table shows the Android API level and iOS deployment target required in `ffmpeg_kit_flutter` releases. +The following table shows Android API level, iOS deployment target and macOS deployment target requirements in +`ffmpeg_kit_flutter` releases. - - + + + + + +
Main ReleaseLTS ReleaseMain ReleaseLTS Release
Android
API Level
iOS Minimum
Deployment Target
macOS Minimum
Deployment Target
Android
API Level
iOS Minimum
Deployment Target
macOS Minimum
Deployment Target
24 12.110.15 16 1010.12
diff --git a/flutter/flutter/android/build.gradle b/flutter/flutter/android/build.gradle index 0a033dc..7c6b559 100644 --- a/flutter/flutter/android/build.gradle +++ b/flutter/flutter/android/build.gradle @@ -1,24 +1,31 @@ buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.1.2' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() } } apply plugin: 'com.android.library' android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { minSdkVersion 24 - targetSdkVersion 30 - versionCode 451 - versionName "4.5.1" + targetSdkVersion 31 + versionCode 510 + versionName "5.1.0" } buildTypes { @@ -35,14 +42,7 @@ android { } } -repositories { - mavenCentral() - jcenter() - google() -} - dependencies { implementation 'androidx.annotation:annotation:1.2.0' - implementation 'com.arthenica:ffmpeg-kit-https:4.5.1-1' + implementation 'com.arthenica:ffmpeg-kit-https:5.1' } - diff --git a/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java b/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java index 3d227bb..479ce82 100644 --- a/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java +++ b/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -831,7 +831,7 @@ public class FFmpegKitFlutterPlugin implements FlutterPlugin, ActivityAware, Met // FFmpegSession protected void ffmpegSession(@NonNull final List arguments, @NonNull final Result result) { - final FFmpegSession session = new FFmpegSession(arguments.toArray(new String[0]), null, null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); + final FFmpegSession session = FFmpegSession.create(arguments.toArray(new String[0]), null, null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); resultHandler.successAsync(result, toMap(session)); } @@ -872,14 +872,14 @@ public class FFmpegKitFlutterPlugin implements FlutterPlugin, ActivityAware, Met // FFprobeSession protected void ffprobeSession(@NonNull final List arguments, @NonNull final Result result) { - final FFprobeSession session = new FFprobeSession(arguments.toArray(new String[0]), null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); + final FFprobeSession session = FFprobeSession.create(arguments.toArray(new String[0]), null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); resultHandler.successAsync(result, toMap(session)); } // MediaInformationSession protected void mediaInformationSession(@NonNull final List arguments, @NonNull final Result result) { - final MediaInformationSession session = new MediaInformationSession(arguments.toArray(new String[0]), null, null); + final MediaInformationSession session = MediaInformationSession.create(arguments.toArray(new String[0]), null, null); resultHandler.successAsync(result, toMap(session)); } diff --git a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m index c7b5f8a..a2dac73 100644 --- a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -112,30 +112,40 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; - (void)registerGlobalCallbacks { [FFmpegKitConfig enableFFmpegSessionCompleteCallback:^(FFmpegSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableFFprobeSessionCompleteCallback:^(FFprobeSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableMediaInformationSessionCompleteCallback:^(MediaInformationSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableLogCallback: ^(Log* log){ if (self->logsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toLogDictionary:log]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; [FFmpegKitConfig enableStatisticsCallback:^(Statistics* statistics){ if (self->statisticsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toStatisticsDictionary:statistics]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; } @@ -563,7 +573,7 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFmpegSession - (void)ffmpegSession:(NSArray*)arguments result:(FlutterResult)result { - FFmpegSession* session = [[FFmpegSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFmpegSession* session = [FFmpegSession create:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -604,14 +614,14 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFprobeSession - (void)ffprobeSession:(NSArray*)arguments result:(FlutterResult)result { - FFprobeSession* session = [[FFprobeSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFprobeSession* session = [FFprobeSession create:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } // MediaInformationSession - (void)mediaInformationSession:(NSArray*)arguments result:(FlutterResult)result { - MediaInformationSession* session = [[MediaInformationSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil]; + MediaInformationSession* session = [MediaInformationSession create:arguments withCompleteCallback:nil withLogCallback:nil]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -632,23 +642,21 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // MediaInformationJsonParser - (void)mediaInformationJsonParserFrom:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result(nil); } } - (void)mediaInformationJsonParserFromWithError:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result([FlutterError errorWithCode:@"PARSE_FAILED" message:@"Parsing MediaInformation failed with JSON error." details:nil]); } } diff --git a/flutter/flutter/ios/ffmpeg_kit_flutter.podspec b/flutter/flutter/ios/ffmpeg_kit_flutter.podspec index ba33a6e..afd9360 100644 --- a/flutter/flutter/ios/ffmpeg_kit_flutter.podspec +++ b/flutter/flutter/ios/ffmpeg_kit_flutter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ffmpeg_kit_flutter' - s.version = '4.5.1' + s.version = '5.1.0' s.summary = 'FFmpeg Kit for Flutter' s.description = 'A Flutter plugin for running FFmpeg and FFprobe commands.' s.homepage = 'https://github.com/arthenica/ffmpeg-kit' @@ -23,112 +23,112 @@ Pod::Spec.new do |s| s.subspec 'min' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-min', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'min-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-min', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'min-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-min-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'min-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-min-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'https' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-https', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'https-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-https', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'https-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-https-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'https-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-https-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'audio' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-audio', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-audio', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'audio-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-audio', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-audio', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'video' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-video', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-video', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'video-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-video', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-video', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'full' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-full', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'full-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-full', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'full-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-full-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'full-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-full-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end diff --git a/flutter/flutter/lib/abstract_session.dart b/flutter/flutter/lib/abstract_session.dart index 4667569..4cbb521 100644 --- a/flutter/flutter/lib/abstract_session.dart +++ b/flutter/flutter/lib/abstract_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -35,7 +35,7 @@ import 'src/ffmpeg_kit_factory.dart'; /// Abstract session implementation which includes common features shared by /// "FFmpeg", "FFprobe" and "MediaInformation" sessions. -class AbstractSession extends Session { +abstract class AbstractSession extends Session { static FFmpegKitPlatform _platform = FFmpegKitPlatform.instance; /// Defines how long default "getAll" methods wait, in milliseconds. @@ -428,5 +428,18 @@ class AbstractSession extends Session { bool isMediaInformation() => false; /// Cancels running the session. - void cancel() {} + Future cancel() async { + try { + final int? sessionId = getSessionId(); + await FFmpegKitConfig.init(); + if (sessionId == null) { + return _platform.ffmpegKitCancel(); + } else { + return _platform.ffmpegKitCancelSession(sessionId); + } + } on PlatformException catch (e, stack) { + print("Plugin cancel error: ${e.message}"); + return Future.error("cancel failed.", stack); + } + } } diff --git a/flutter/flutter/lib/chapter.dart b/flutter/flutter/lib/chapter.dart index cbf7bfc..cdf6b87 100644 --- a/flutter/flutter/lib/chapter.dart +++ b/flutter/flutter/lib/chapter.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Taner Sener + * Copyright (c) 2021-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -51,7 +51,7 @@ class Chapter { String? getEndTime() => this.getStringProperty(Chapter.keyEndTime); /// Returns all tags. - Map? getTags() => this.getProperties(Chapter.keyTags); + Map? getTags() => this.getProperty(Chapter.keyTags); /// Returns the chapter property associated with the key. String? getStringProperty(String key) => this._allProperties?[key]; @@ -59,8 +59,8 @@ class Chapter { /// Returns the chapter property associated with the key. num? getNumberProperty(String key) => this._allProperties?[key]; - /// Returns the chapter properties associated with the key. - dynamic getProperties(String key) => this._allProperties?[key]; + /// Returns the chapter property associated with the key. + dynamic getProperty(String key) => this._allProperties?[key]; /// Returns all properties found. Map? getAllProperties() => this._allProperties; diff --git a/flutter/flutter/lib/ffmpeg_session.dart b/flutter/flutter/lib/ffmpeg_session.dart index 2cbc777..e3a655c 100644 --- a/flutter/flutter/lib/ffmpeg_session.dart +++ b/flutter/flutter/lib/ffmpeg_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -49,11 +49,6 @@ class FFmpegSession extends AbstractSession { return session; } - /// Creates a new FFmpeg session from [sessionMap], which includes session - /// fields as map keys. - static FFmpegSession fromMap(Map sessionMap) => - AbstractSession.createFFmpegSessionFromMap(sessionMap); - /// Returns the session specific statistics callback. StatisticsCallback? getStatisticsCallback() => FFmpegKitFactory.getStatisticsCallback(this.getSessionId()); diff --git a/flutter/flutter/lib/ffprobe_session.dart b/flutter/flutter/lib/ffprobe_session.dart index af35a38..42e826d 100644 --- a/flutter/flutter/lib/ffprobe_session.dart +++ b/flutter/flutter/lib/ffprobe_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -41,11 +41,6 @@ class FFprobeSession extends AbstractSession { return session; } - /// Creates a new FFprobe session from [sessionMap], which includes session - /// fields as map keys. - static FFprobeSession fromMap(Map sessionMap) => - AbstractSession.createFFprobeSessionFromMap(sessionMap); - /// Returns the session specific complete callback. FFprobeSessionCompleteCallback? getCompleteCallback() => FFmpegKitFactory.getFFprobeSessionCompleteCallback(this.getSessionId()); diff --git a/flutter/flutter/lib/media_information.dart b/flutter/flutter/lib/media_information.dart index 83560f1..1abb89e 100644 --- a/flutter/flutter/lib/media_information.dart +++ b/flutter/flutter/lib/media_information.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -22,7 +22,7 @@ import 'stream_information.dart'; /// Media information class. class MediaInformation { - static const keyMediaProperties = "format"; + static const keyFormatProperties = "format"; static const keyFilename = "filename"; static const keyFormat = "format_name"; static const keyFormatLong = "format_long_name"; @@ -38,40 +38,54 @@ class MediaInformation { MediaInformation(this._allProperties); /// Returns file name. - String? getFilename() => this.getStringProperty(MediaInformation.keyFilename); + String? getFilename() => + this.getStringFormatProperty(MediaInformation.keyFilename); /// Returns format. - String? getFormat() => this.getStringProperty(MediaInformation.keyFormat); + String? getFormat() => + this.getStringFormatProperty(MediaInformation.keyFormat); /// Returns long format. String? getLongFormat() => - this.getStringProperty(MediaInformation.keyFormatLong); + this.getStringFormatProperty(MediaInformation.keyFormatLong); /// Returns duration. - String? getDuration() => this.getStringProperty(MediaInformation.keyDuration); + String? getDuration() => + this.getStringFormatProperty(MediaInformation.keyDuration); /// Returns start time. String? getStartTime() => - this.getStringProperty(MediaInformation.keyStartTime); + this.getStringFormatProperty(MediaInformation.keyStartTime); /// Returns size. - String? getSize() => this.getStringProperty(MediaInformation.keySize); + String? getSize() => this.getStringFormatProperty(MediaInformation.keySize); /// Returns bitrate. - String? getBitrate() => this.getStringProperty(MediaInformation.keyBitRate); + String? getBitrate() => + this.getStringFormatProperty(MediaInformation.keyBitRate); /// Returns all tags. Map? getTags() => - this.getProperties(StreamInformation.keyTags); + this.getFormatProperty(StreamInformation.keyTags); - /// Returns the media property associated with the key. - String? getStringProperty(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + String? getStringProperty(String key) => this.getAllProperties()?[key]; - /// Returns the media property associated with the key. - num? getNumberProperty(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + num? getNumberProperty(String key) => this.getAllProperties()?[key]; - /// Returns the media properties associated with the key. - dynamic getProperties(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + dynamic getProperty(String key) => this.getAllProperties()?[key]; + + /// Returns the format property associated with the key. + String? getStringFormatProperty(String key) => + this.getFormatProperties()?[key]; + + /// Returns the format property associated with the key. + num? getNumberFormatProperty(String key) => this.getFormatProperties()?[key]; + + /// Returns the format property associated with the key. + dynamic getFormatProperty(String key) => this.getFormatProperties()?[key]; /// Returns all streams found as a list. List getStreams() { @@ -102,9 +116,9 @@ class MediaInformation { return list; } - /// Returns all media properties. - Map? getMediaProperties() => - this._allProperties?[keyMediaProperties]; + /// Returns all format properties found. + Map? getFormatProperties() => + this._allProperties?[keyFormatProperties]; /// Returns all properties found, including stream properties. Map? getAllProperties() => this._allProperties; diff --git a/flutter/flutter/lib/media_information_session.dart b/flutter/flutter/lib/media_information_session.dart index c550ca8..472fa1b 100644 --- a/flutter/flutter/lib/media_information_session.dart +++ b/flutter/flutter/lib/media_information_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -43,11 +43,6 @@ class MediaInformationSession extends AbstractSession { return session; } - /// Creates a new MediaInformation session from [sessionMap], which includes - /// session fields as map keys. - static MediaInformationSession fromMap(Map sessionMap) => - AbstractSession.createMediaInformationSessionFromMap(sessionMap); - /// Returns the media information extracted in this session. MediaInformation? getMediaInformation() => this._mediaInformation; diff --git a/flutter/flutter/lib/session.dart b/flutter/flutter/lib/session.dart index 7fe16ae..a4796d8 100644 --- a/flutter/flutter/lib/session.dart +++ b/flutter/flutter/lib/session.dart @@ -106,5 +106,5 @@ abstract class Session { bool isMediaInformation(); /// Cancels running the session. - void cancel(); + Future cancel(); } diff --git a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart index bb4529d..d72fca1 100644 --- a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart +++ b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart @@ -17,15 +17,13 @@ * along with FFmpegKit. If not, see . */ -import '../ffmpeg_session.dart'; +import '../abstract_session.dart'; import '../ffmpeg_session_complete_callback.dart'; -import '../ffprobe_session.dart'; import '../ffprobe_session_complete_callback.dart'; import '../log.dart'; import '../log_callback.dart'; import '../log_redirection_strategy.dart'; import '../media_information.dart'; -import '../media_information_session.dart'; import '../media_information_session_complete_callback.dart'; import '../session.dart'; import '../statistics.dart'; @@ -66,12 +64,12 @@ class FFmpegKitFactory { static Session mapToSession(Map sessionMap) { switch (sessionMap["type"]) { case 2: - return FFprobeSession.fromMap(sessionMap); + return AbstractSession.createFFprobeSessionFromMap(sessionMap); case 3: - return MediaInformationSession.fromMap(sessionMap); + return AbstractSession.createMediaInformationSessionFromMap(sessionMap); case 1: default: - return FFmpegSession.fromMap(sessionMap); + return AbstractSession.createFFmpegSessionFromMap(sessionMap); } } @@ -79,12 +77,13 @@ class FFmpegKitFactory { if (sessionMap != null) { switch (sessionMap["type"]) { case 2: - return FFprobeSession.fromMap(sessionMap); + return AbstractSession.createFFprobeSessionFromMap(sessionMap); case 3: - return MediaInformationSession.fromMap(sessionMap); + return AbstractSession.createMediaInformationSessionFromMap( + sessionMap); case 1: default: - return FFmpegSession.fromMap(sessionMap); + return AbstractSession.createFFmpegSessionFromMap(sessionMap); } } else { return null; @@ -100,7 +99,7 @@ class FFmpegKitFactory { } } - static String getVersion() => "4.5.1"; + static String getVersion() => "5.1.0"; static LogRedirectionStrategy? getLogRedirectionStrategy(int? sessionId) => logRedirectionStrategyMap[sessionId]; diff --git a/flutter/flutter/lib/stream_information.dart b/flutter/flutter/lib/stream_information.dart index eb546b6..0af0528 100644 --- a/flutter/flutter/lib/stream_information.dart +++ b/flutter/flutter/lib/stream_information.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -108,7 +108,7 @@ class StreamInformation { /// Returns all tags. Map? getTags() => - this.getProperties(StreamInformation.keyTags); + this.getProperty(StreamInformation.keyTags); /// Returns the stream property associated with the key. String? getStringProperty(String key) => this._allProperties?[key]; @@ -116,8 +116,8 @@ class StreamInformation { /// Returns the stream property associated with the key. num? getNumberProperty(String key) => this._allProperties?[key]; - /// Returns the stream properties associated with the key. - dynamic getProperties(String key) => this._allProperties?[key]; + /// Returns the stream property associated with the key. + dynamic getProperty(String key) => this._allProperties?[key]; /// Returns all properties found. Map? getAllProperties() => this._allProperties; diff --git a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m index f9f557e..b616988 100644 --- a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -112,30 +112,40 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; - (void)registerGlobalCallbacks { [FFmpegKitConfig enableFFmpegSessionCompleteCallback:^(FFmpegSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableFFprobeSessionCompleteCallback:^(FFprobeSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableMediaInformationSessionCompleteCallback:^(MediaInformationSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableLogCallback: ^(Log* log){ if (self->logsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toLogDictionary:log]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; [FFmpegKitConfig enableStatisticsCallback:^(Statistics* statistics){ if (self->statisticsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toStatisticsDictionary:statistics]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; } @@ -563,7 +573,7 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFmpegSession - (void)ffmpegSession:(NSArray*)arguments result:(FlutterResult)result { - FFmpegSession* session = [[FFmpegSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFmpegSession* session = [FFmpegSession create:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -604,14 +614,14 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFprobeSession - (void)ffprobeSession:(NSArray*)arguments result:(FlutterResult)result { - FFprobeSession* session = [[FFprobeSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFprobeSession* session = [FFprobeSession create:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } // MediaInformationSession - (void)mediaInformationSession:(NSArray*)arguments result:(FlutterResult)result { - MediaInformationSession* session = [[MediaInformationSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil]; + MediaInformationSession* session = [MediaInformationSession create:arguments withCompleteCallback:nil withLogCallback:nil]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -632,23 +642,21 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // MediaInformationJsonParser - (void)mediaInformationJsonParserFrom:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result(nil); } } - (void)mediaInformationJsonParserFromWithError:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result([FlutterError errorWithCode:@"PARSE_FAILED" message:@"Parsing MediaInformation failed with JSON error." details:nil]); } } diff --git a/flutter/flutter/macos/ffmpeg_kit_flutter.podspec b/flutter/flutter/macos/ffmpeg_kit_flutter.podspec index 083244d..ee93a39 100644 --- a/flutter/flutter/macos/ffmpeg_kit_flutter.podspec +++ b/flutter/flutter/macos/ffmpeg_kit_flutter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ffmpeg_kit_flutter' - s.version = '4.5.1' + s.version = '5.1.0' s.summary = 'FFmpeg Kit for Flutter' s.description = 'A Flutter plugin for running FFmpeg and FFprobe commands.' s.homepage = 'https://github.com/arthenica/ffmpeg-kit' @@ -23,112 +23,112 @@ Pod::Spec.new do |s| s.subspec 'min' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-min', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'min-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-min', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'min-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-min-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'min-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-min-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'https' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-https', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'https-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-https', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'https-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-https-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'https-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-https-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'audio' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-audio', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-audio', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'audio-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-audio', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-audio', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'video' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-video', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-video', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'video-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-video', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-video', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'full' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-full', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'full-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-full', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'full-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-full-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'full-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-full-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end diff --git a/flutter/flutter/pubspec.yaml b/flutter/flutter/pubspec.yaml index 5af935f..c592e26 100644 --- a/flutter/flutter/pubspec.yaml +++ b/flutter/flutter/pubspec.yaml @@ -3,7 +3,7 @@ description: FFmpeg Kit for Flutter. Supports Android, iOS and macOS platforms. repository: https://github.com/arthenica/ffmpeg-kit issue_tracker: https://github.com/arthenica/ffmpeg-kit/issues homepage: https://github.com/arthenica/ffmpeg-kit -version: 4.5.1 +version: 5.1.0 environment: sdk: ">=2.12.0 <3.0.0" @@ -28,4 +28,4 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - plugin_platform_interface: ^2.0.2 + plugin_platform_interface: ^2.1.3