Merge pull request #584 from arthenica/development-flutter

merge flutter plugin v5.1.0 to main
This commit is contained in:
Taner Sener 2022-10-02 20:35:49 +01:00 committed by GitHub
commit de919e37dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 223 additions and 176 deletions

View File

@ -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 |

View File

@ -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 |

View File

@ -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

View File

@ -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_<package name>: 4.5.1
ffmpeg_kit_flutter_<package name>: 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.
<table>
<thead>
<tr>
<th align="center" colspan="2">Main Release</th>
<th align="center" colspan="2">LTS Release</th>
<th align="center" colspan="3">Main Release</th>
<th align="center" colspan="3">LTS Release</th>
</tr>
<tr>
<th align="center">Android<br>API Level</th>
<th align="center">iOS Minimum<br>Deployment Target</th>
<th align="center">macOS Minimum<br>Deployment Target</th>
<th align="center">Android<br>API Level</th>
<th align="center">iOS Minimum<br>Deployment Target</th>
<th align="center">macOS Minimum<br>Deployment Target</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">24</td>
<td align="center">12.1</td>
<td align="center">10.15</td>
<td align="center">16</td>
<td align="center">10</td>
<td align="center">10.12</td>
</tr>
</tbody>
</table>

View File

@ -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'
}

View File

@ -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<String> 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<String> 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<String> 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));
}

View File

@ -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]);
}
}

View File

@ -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

View File

@ -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<void> 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);
}
}
}

View File

@ -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<dynamic, dynamic>? getTags() => this.getProperties(Chapter.keyTags);
Map<dynamic, dynamic>? 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<dynamic, dynamic>? getAllProperties() => this._allProperties;

View File

@ -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<dynamic, dynamic> sessionMap) =>
AbstractSession.createFFmpegSessionFromMap(sessionMap);
/// Returns the session specific statistics callback.
StatisticsCallback? getStatisticsCallback() =>
FFmpegKitFactory.getStatisticsCallback(this.getSessionId());

View File

@ -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<dynamic, dynamic> sessionMap) =>
AbstractSession.createFFprobeSessionFromMap(sessionMap);
/// Returns the session specific complete callback.
FFprobeSessionCompleteCallback? getCompleteCallback() =>
FFmpegKitFactory.getFFprobeSessionCompleteCallback(this.getSessionId());

View File

@ -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<dynamic, dynamic>? 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<StreamInformation> getStreams() {
@ -102,9 +116,9 @@ class MediaInformation {
return list;
}
/// Returns all media properties.
Map<dynamic, dynamic>? getMediaProperties() =>
this._allProperties?[keyMediaProperties];
/// Returns all format properties found.
Map<dynamic, dynamic>? getFormatProperties() =>
this._allProperties?[keyFormatProperties];
/// Returns all properties found, including stream properties.
Map<dynamic, dynamic>? getAllProperties() => this._allProperties;

View File

@ -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<dynamic, dynamic> sessionMap) =>
AbstractSession.createMediaInformationSessionFromMap(sessionMap);
/// Returns the media information extracted in this session.
MediaInformation? getMediaInformation() => this._mediaInformation;

View File

@ -106,5 +106,5 @@ abstract class Session {
bool isMediaInformation();
/// Cancels running the session.
void cancel();
Future<void> cancel();
}

View File

@ -17,15 +17,13 @@
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
*/
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<dynamic, dynamic> 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];

View File

@ -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<dynamic, dynamic>? 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<dynamic, dynamic>? getAllProperties() => this._allProperties;

View File

@ -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]);
}
}

View File

@ -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

View File

@ -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