Kaynağa Gözat

merge v0.2.6

from development
Taner Sener 6 yıl önce
ebeveyn
işleme
68a0c5d6b3
73 değiştirilmiş dosya ile 1148 ekleme ve 139 silme
  1. 3 0
      CHANGELOG.md
  2. 5 17
      README.md
  3. 1 1
      android/build.gradle
  4. 135 18
      example/lib/flutter_ffmpeg_example.dart
  5. 1 1
      example/pubspec.lock
  6. 1 1
      example/pubspec.yaml
  7. 1 1
      ios/flutter_ffmpeg.podspec
  8. 56 3
      lib/flutter_ffmpeg.dart
  9. 1 1
      packages/flutter_ffmpeg_audio/android/build.gradle
  10. 1 1
      packages/flutter_ffmpeg_audio/ios/flutter_ffmpeg.podspec
  11. 56 3
      packages/flutter_ffmpeg_audio/lib/flutter_ffmpeg.dart
  12. 1 1
      packages/flutter_ffmpeg_audio/pubspec.yaml
  13. 1 1
      packages/flutter_ffmpeg_audio_lts/android/build.gradle
  14. 1 1
      packages/flutter_ffmpeg_audio_lts/ios/flutter_ffmpeg.podspec
  15. 56 3
      packages/flutter_ffmpeg_audio_lts/lib/flutter_ffmpeg.dart
  16. 1 1
      packages/flutter_ffmpeg_audio_lts/pubspec.yaml
  17. 1 1
      packages/flutter_ffmpeg_full-gpl/android/build.gradle
  18. 1 1
      packages/flutter_ffmpeg_full-gpl/ios/flutter_ffmpeg.podspec
  19. 56 3
      packages/flutter_ffmpeg_full-gpl/lib/flutter_ffmpeg.dart
  20. 1 1
      packages/flutter_ffmpeg_full-gpl/pubspec.yaml
  21. 1 1
      packages/flutter_ffmpeg_full-gpl_lts/android/build.gradle
  22. 1 1
      packages/flutter_ffmpeg_full-gpl_lts/ios/flutter_ffmpeg.podspec
  23. 56 3
      packages/flutter_ffmpeg_full-gpl_lts/lib/flutter_ffmpeg.dart
  24. 1 1
      packages/flutter_ffmpeg_full-gpl_lts/pubspec.yaml
  25. 1 1
      packages/flutter_ffmpeg_full/android/build.gradle
  26. 1 1
      packages/flutter_ffmpeg_full/ios/flutter_ffmpeg.podspec
  27. 56 3
      packages/flutter_ffmpeg_full/lib/flutter_ffmpeg.dart
  28. 1 1
      packages/flutter_ffmpeg_full/pubspec.yaml
  29. 1 1
      packages/flutter_ffmpeg_full_lts/android/build.gradle
  30. 1 1
      packages/flutter_ffmpeg_full_lts/ios/flutter_ffmpeg.podspec
  31. 56 3
      packages/flutter_ffmpeg_full_lts/lib/flutter_ffmpeg.dart
  32. 1 1
      packages/flutter_ffmpeg_full_lts/pubspec.yaml
  33. 1 1
      packages/flutter_ffmpeg_https-gpl/android/build.gradle
  34. 1 1
      packages/flutter_ffmpeg_https-gpl/ios/flutter_ffmpeg.podspec
  35. 56 3
      packages/flutter_ffmpeg_https-gpl/lib/flutter_ffmpeg.dart
  36. 1 1
      packages/flutter_ffmpeg_https-gpl/pubspec.yaml
  37. 1 1
      packages/flutter_ffmpeg_https-gpl_lts/android/build.gradle
  38. 1 1
      packages/flutter_ffmpeg_https-gpl_lts/ios/flutter_ffmpeg.podspec
  39. 56 3
      packages/flutter_ffmpeg_https-gpl_lts/lib/flutter_ffmpeg.dart
  40. 1 1
      packages/flutter_ffmpeg_https-gpl_lts/pubspec.yaml
  41. 1 1
      packages/flutter_ffmpeg_https/android/build.gradle
  42. 1 1
      packages/flutter_ffmpeg_https/ios/flutter_ffmpeg.podspec
  43. 56 3
      packages/flutter_ffmpeg_https/lib/flutter_ffmpeg.dart
  44. 1 1
      packages/flutter_ffmpeg_https/pubspec.yaml
  45. 1 1
      packages/flutter_ffmpeg_https_lts/android/build.gradle
  46. 1 1
      packages/flutter_ffmpeg_https_lts/ios/flutter_ffmpeg.podspec
  47. 56 3
      packages/flutter_ffmpeg_https_lts/lib/flutter_ffmpeg.dart
  48. 1 1
      packages/flutter_ffmpeg_https_lts/pubspec.yaml
  49. 1 1
      packages/flutter_ffmpeg_min-gpl/android/build.gradle
  50. 1 1
      packages/flutter_ffmpeg_min-gpl/ios/flutter_ffmpeg.podspec
  51. 56 3
      packages/flutter_ffmpeg_min-gpl/lib/flutter_ffmpeg.dart
  52. 1 1
      packages/flutter_ffmpeg_min-gpl/pubspec.yaml
  53. 1 1
      packages/flutter_ffmpeg_min-gpl_lts/android/build.gradle
  54. 1 1
      packages/flutter_ffmpeg_min-gpl_lts/ios/flutter_ffmpeg.podspec
  55. 56 3
      packages/flutter_ffmpeg_min-gpl_lts/lib/flutter_ffmpeg.dart
  56. 1 1
      packages/flutter_ffmpeg_min-gpl_lts/pubspec.yaml
  57. 1 1
      packages/flutter_ffmpeg_min/android/build.gradle
  58. 1 1
      packages/flutter_ffmpeg_min/ios/flutter_ffmpeg.podspec
  59. 56 3
      packages/flutter_ffmpeg_min/lib/flutter_ffmpeg.dart
  60. 1 1
      packages/flutter_ffmpeg_min/pubspec.yaml
  61. 1 1
      packages/flutter_ffmpeg_min_lts/android/build.gradle
  62. 1 1
      packages/flutter_ffmpeg_min_lts/ios/flutter_ffmpeg.podspec
  63. 56 3
      packages/flutter_ffmpeg_min_lts/lib/flutter_ffmpeg.dart
  64. 1 1
      packages/flutter_ffmpeg_min_lts/pubspec.yaml
  65. 1 1
      packages/flutter_ffmpeg_video/android/build.gradle
  66. 1 1
      packages/flutter_ffmpeg_video/ios/flutter_ffmpeg.podspec
  67. 56 3
      packages/flutter_ffmpeg_video/lib/flutter_ffmpeg.dart
  68. 1 1
      packages/flutter_ffmpeg_video/pubspec.yaml
  69. 1 1
      packages/flutter_ffmpeg_video_lts/android/build.gradle
  70. 1 1
      packages/flutter_ffmpeg_video_lts/ios/flutter_ffmpeg.podspec
  71. 56 3
      packages/flutter_ffmpeg_video_lts/lib/flutter_ffmpeg.dart
  72. 1 1
      packages/flutter_ffmpeg_video_lts/pubspec.yaml
  73. 1 1
      pubspec.yaml

+ 3 - 0
CHANGELOG.md

@@ -1,3 +1,6 @@
+## 0.2.6
+- Adds support for single quotes and double quotes in command strings
+
 ## 0.2.5
 - Implements side data information parsing
 

+ 5 - 17
README.md

@@ -1,6 +1,6 @@
 # flutter_ffmpeg 
 
-![GitHub release](https://img.shields.io/badge/release-v0.2.5-blue.svg)
+![GitHub release](https://img.shields.io/badge/release-v0.2.6-blue.svg)
 ![](https://img.shields.io/pub/v/flutter_ffmpeg.svg)
 
 FFmpeg plugin for Flutter. Supports iOS and Android.
@@ -70,7 +70,7 @@ FFmpeg plugin for Flutter. Supports iOS and Android.
 Add `flutter_ffmpeg` as a dependency in your `pubspec.yaml file`.
   ```
 dependencies:
-    flutter_ffmpeg: ^0.2.5
+    flutter_ffmpeg: ^0.2.6
   ```
 
 #### 2.1 Packages
@@ -83,7 +83,7 @@ Installation of `FlutterFFmpeg` using `pub` enables the default package, which i
       flutter_ffmpeg:
         git:
           url: git://github.com/tanersener/flutter-ffmpeg.git
-          ref: v0.2.5
+          ref: v0.2.6
           path: packages/flutter_ffmpeg_<package_name>
 
     ```
@@ -307,17 +307,10 @@ In order to install the `LTS` variant, install the `flutter_ffmpeg_https_lts` pa
 
 ### 4. Tips
 
-- You should not use double quotes (") to define your complex filters or map definitions.
-    ```
-     -filter_complex [0:v]scale=1280:-1[v] -map [v]
-    ```
-
-- If your commands include unnecessary quotes or space characters, your command will fail with `No such filter: ' '` errors. Please check your command and remove them.
-
-- `flutter_ffmpeg` uses file system paths, it does not know what an assets folder or project folder is. So you can't use resources on those folders directly, you need to provide full paths of those resources.
+- `flutter_ffmpeg` uses file system paths, it does not know what an `assets` folder or a `project` folder is. So you can't use resources on those folders directly, you need to provide full paths of those resources.
 
 - `flutter_ffmpeg` requires ios deployment target to be at least `9.3`. 
-  So if you don't specify a deployment target or set a value smaller than `9.3` then your build will fail with the following error.
+  If you don't specify a deployment target or set a value smaller than `9.3` then your build will fail with the following error.
    
    ```
     Resolving dependencies of `Podfile`
@@ -349,11 +342,6 @@ In order to install the `LTS` variant, install the `flutter_ffmpeg_https_lts` pa
     
     <img src="https://github.com/tanersener/flutter-ffmpeg/raw/development/doc/assets/tip_runner_deployment_target.png" width="480">
 
-- `execute` method is overloaded and has an optional delimiter parameter. Delimiter defines how the command string will be split into arguments. 
-When delimiter is not specified the space character is used as the default delimiter. 
-Based on this, if one or more of your command arguments include a space character, in filename path or in `-filter_complex` block, then your command string will be split into invalid arguments and execution will fail.  
-You can fix this error by splitting your command string into array yourself and calling `executeWithArguments` method or using a different delimiter character in your command string and specifying it in the `execute` call.
-
 - Enabling `ProGuard` on releases older than `v0.2.4` causes linking errors. Please add the following rule inside your `proguard-rules.pro` file to preserve necessary method names and prevent linking errors.
 
     ```

+ 1 - 1
android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 135 - 18
example/lib/flutter_ffmpeg_example.dart

@@ -67,17 +67,17 @@ class VideoUtil {
   }
 
   static String generateEncodeVideoScript(String image1Path, String image2Path, String image3Path, String videoFilePath, String videoCodec, String customOptions) {
-    return "-hide_banner -y -loop 1 -i " +
+    return "-hide_banner    -y -loop   1 -i '" +
         image1Path +
-        " " +
-        "-loop 1 -i " +
+        "' " +
+        "-loop   1 -i \"" +
         image2Path +
-        " " +
-        "-loop 1 -i " +
+        "\" " +
+        "-loop 1   -i \"" +
         image3Path +
-        " " +
+        "\" " +
         "-filter_complex " +
-        "[0:v]setpts=PTS-STARTPTS,scale=w=\'if(gte(iw/ih,640/427),min(iw,640),-1)\':h=\'if(gte(iw/ih,640/427),-1,min(ih,427))\',scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=sar=1/1,split=2[stream1out1][stream1out2];" +
+        "\"[0:v]setpts=PTS-STARTPTS,scale=w=\'if(gte(iw/ih,640/427),min(iw,640),-1)\':h=\'if(gte(iw/ih,640/427),-1,min(ih,427))\',scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=sar=1/1,split=2[stream1out1][stream1out2];" +
         "[1:v]setpts=PTS-STARTPTS,scale=w=\'if(gte(iw/ih,640/427),min(iw,640),-1)\':h=\'if(gte(iw/ih,640/427),-1,min(ih,427))\',scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=sar=1/1,split=2[stream2out1][stream2out2];" +
         "[2:v]setpts=PTS-STARTPTS,scale=w=\'if(gte(iw/ih,640/427),min(iw,640),-1)\':h=\'if(gte(iw/ih,640/427),-1,min(ih,427))\',scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=sar=1/1,split=2[stream3out1][stream3out2];" +
         "[stream1out1]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#00000000,trim=duration=3,select=lte(n\\,90)[stream1overlaid];" +
@@ -88,7 +88,7 @@ class VideoUtil {
         "[stream3out2]pad=width=640:height=427:x=(640-iw)/2:y=(427-ih)/2:color=#00000000,trim=duration=1,select=lte(n\\,30)[stream3starting];" +
         "[stream2starting][stream1ending]blend=all_expr=\'if(gte(X,(W/2)*T/1)*lte(X,W-(W/2)*T/1),B,A)\':shortest=1[stream2blended];" +
         "[stream3starting][stream2ending]blend=all_expr=\'if(gte(X,(W/2)*T/1)*lte(X,W-(W/2)*T/1),B,A)\':shortest=1[stream3blended];" +
-        "[stream1overlaid][stream2blended][stream2overlaid][stream3blended][stream3overlaid]concat=n=5:v=1:a=0,scale=w=640:h=424,format=yuv420p[video]" +
+        "[stream1overlaid][stream2blended][stream2overlaid][stream3blended][stream3overlaid]concat=n=5:v=1:a=0,scale=w=640:h=424,format=yuv420p[video]\"" +
         " -map [video] -vsync 2 -async 1 " +
         customOptions +
         "-c:v " +
@@ -147,10 +147,21 @@ class FlutterFFmpegTestAppState extends State<MainPage> with TickerProviderState
     VideoUtil.copyFileAssets('assets/tajmahal.jpg', ASSET_3).then((path) => print('Loaded asset $path.'));
   }
 
+  void testParseArguments() {
+    testParseSimpleCommand();
+    testParseSingleQuotesInCommand();
+    testParseDoubleQuotesInCommand();
+    testParseDoubleQuotesAndEscapesInCommand();
+  }
+
   void testRunCommand() {
     getLastReturnCode().then((rc) => print("Last rc: $rc"));
     getLastCommandOutput().then((output) => print("Last command output: $output"));
 
+    print("Testing ParseArguments.");
+
+    testParseArguments();
+
     print("Testing COMMAND.");
 
     // ENABLE LOG CALLBACK ON EACH CALL
@@ -176,9 +187,8 @@ class FlutterFFmpegTestAppState extends State<MainPage> with TickerProviderState
     // disableLogs();
     // enableLogs();
 
-    // execute(_commandController.text).then((rc) => print("FFmpeg process exited with rc $rc"));
-    // executeWithDelimiter(_commandController.text, "_").then((rc) => print("FFmpeg process exited with rc $rc") );
-    executeWithArguments(_commandController.text.split(" ")).then((rc) => print("FFmpeg process exited with rc $rc"));
+    execute(_commandController.text).then((rc) => print("FFmpeg process exited with rc $rc"));
+    // executeWithArguments(_commandController.text.split(" ")).then((rc) => print("FFmpeg process exited with rc $rc"));
 
     setState(() {});
   }
@@ -275,9 +285,6 @@ class FlutterFFmpegTestAppState extends State<MainPage> with TickerProviderState
               }
             });
 
-            // COMMENT OPTIONAL TESTS
-            // execute(VideoUtil.generateEncodeVideoScript(image1Path, image2Path, image3Path, videoPath, _currentCodec, "")).timeout(Duration(milliseconds: 1300), onTimeout: () { cancel(); });
-
             // resetStatistics();
 
             getLastReceivedStatistics().then((lastStatistics) {
@@ -336,10 +343,6 @@ class FlutterFFmpegTestAppState extends State<MainPage> with TickerProviderState
     return await _flutterFFmpeg.execute(command);
   }
 
-  Future<int> executeWithDelimiter(String command, String delimiter) async {
-    return await _flutterFFmpeg.execute(command, delimiter);
-  }
-
   Future<void> cancel() async {
     return await _flutterFFmpeg.cancel();
   }
@@ -641,4 +644,118 @@ class FlutterFFmpegTestAppState extends State<MainPage> with TickerProviderState
     super.dispose();
     _commandController.dispose();
   }
+
+  void testParseSimpleCommand() {
+    var argumentArray = _flutterFFmpeg.parseArguments("-hide_banner   -loop 1  -i file.jpg  -filter_complex  [0:v]setpts=PTS-STARTPTS[video] -map [video] -vsync 2 -async 1  video.mp4");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 14);
+
+    assert("-hide_banner" == argumentArray[0]);
+    assert("-loop" == argumentArray[1]);
+    assert("1" == argumentArray[2]);
+    assert("-i" == argumentArray[3]);
+    assert("file.jpg" == argumentArray[4]);
+    assert("-filter_complex" == argumentArray[5]);
+    assert("[0:v]setpts=PTS-STARTPTS[video]" == argumentArray[6]);
+    assert("-map" == argumentArray[7]);
+    assert("[video]" == argumentArray[8]);
+    assert("-vsync" == argumentArray[9]);
+    assert("2" == argumentArray[10]);
+    assert("-async" == argumentArray[11]);
+    assert("1" == argumentArray[12]);
+    assert("video.mp4" == argumentArray[13]);
+  }
+
+  void testParseSingleQuotesInCommand() {
+    var argumentArray = _flutterFFmpeg.parseArguments("-loop 1 'file one.jpg'  -filter_complex  '[0:v]setpts=PTS-STARTPTS[video]'  -map  [video]  video.mp4 ");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 8);
+
+    assert("-loop" == argumentArray[0]);
+    assert("1" == argumentArray[1]);
+    assert("file one.jpg" == argumentArray[2]);
+    assert("-filter_complex" == argumentArray[3]);
+    assert("[0:v]setpts=PTS-STARTPTS[video]" == argumentArray[4]);
+    assert("-map" == argumentArray[5]);
+    assert("[video]" == argumentArray[6]);
+    assert("video.mp4" == argumentArray[7]);
+  }
+
+  void testParseDoubleQuotesInCommand() {
+    var argumentArray = _flutterFFmpeg.parseArguments("-loop  1 \"file one.jpg\"   -filter_complex \"[0:v]setpts=PTS-STARTPTS[video]\"  -map  [video]  video.mp4 ");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 8);
+
+    assert("-loop" == argumentArray[0]);
+    assert("1" == argumentArray[1]);
+    assert("file one.jpg" == argumentArray[2]);
+    assert("-filter_complex" == argumentArray[3]);
+    assert("[0:v]setpts=PTS-STARTPTS[video]" == argumentArray[4]);
+    assert("-map" == argumentArray[5]);
+    assert("[video]" == argumentArray[6]);
+    assert("video.mp4" == argumentArray[7]);
+
+    argumentArray = _flutterFFmpeg.parseArguments(" -i   file:///tmp/input.mp4 -vcodec libx264 -vf \"scale=1024:1024,pad=width=1024:height=1024:x=0:y=0:color=black\"  -acodec copy  -q:v 0  -q:a   0 video.mp4");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 13);
+
+    assert("-i" == argumentArray[0]);
+    assert("file:///tmp/input.mp4" == argumentArray[1]);
+    assert("-vcodec" == argumentArray[2]);
+    assert("libx264" == argumentArray[3]);
+    assert("-vf" == argumentArray[4]);
+    assert("scale=1024:1024,pad=width=1024:height=1024:x=0:y=0:color=black" == argumentArray[5]);
+    assert("-acodec" == argumentArray[6]);
+    assert("copy" == argumentArray[7]);
+    assert("-q:v" == argumentArray[8]);
+    assert("0" == argumentArray[9]);
+    assert("-q:a" == argumentArray[10]);
+    assert("0" == argumentArray[11]);
+    assert("video.mp4" == argumentArray[12]);
+  }
+
+  void testParseDoubleQuotesAndEscapesInCommand() {
+    var argumentArray = _flutterFFmpeg.parseArguments("  -i   file:///tmp/input.mp4 -vf \"subtitles=file:///tmp/subtitles.srt:force_style=\'FontSize=16,PrimaryColour=&HFFFFFF&\'\" -vcodec libx264   -acodec copy  -q:v 0 -q:a  0  video.mp4");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 13);
+
+    assert("-i" == argumentArray[0]);
+    assert("file:///tmp/input.mp4" == argumentArray[1]);
+    assert("-vf" == argumentArray[2]);
+    assert("subtitles=file:///tmp/subtitles.srt:force_style='FontSize=16,PrimaryColour=&HFFFFFF&'" == argumentArray[3]);
+    assert("-vcodec" == argumentArray[4]);
+    assert("libx264" == argumentArray[5]);
+    assert("-acodec" == argumentArray[6]);
+    assert("copy" == argumentArray[7]);
+    assert("-q:v" == argumentArray[8]);
+    assert("0" == argumentArray[9]);
+    assert("-q:a" == argumentArray[10]);
+    assert("0" == argumentArray[11]);
+    assert("video.mp4" == argumentArray[12]);
+
+    argumentArray = _flutterFFmpeg.parseArguments("  -i   file:///tmp/input.mp4 -vf \"subtitles=file:///tmp/subtitles.srt:force_style=\\\"FontSize=16,PrimaryColour=&HFFFFFF&\\\"\" -vcodec libx264   -acodec copy  -q:v 0 -q:a  0  video.mp4");
+
+    assert(argumentArray != null);
+    assert(argumentArray.length == 13);
+
+    assert("-i" == argumentArray[0]);
+    assert("file:///tmp/input.mp4" == argumentArray[1]);
+    assert("-vf" == argumentArray[2]);
+    assert("subtitles=file:///tmp/subtitles.srt:force_style=\\\"FontSize=16,PrimaryColour=&HFFFFFF&\\\"" == argumentArray[3]);
+    assert("-vcodec" == argumentArray[4]);
+    assert("libx264" == argumentArray[5]);
+    assert("-acodec" == argumentArray[6]);
+    assert("copy" == argumentArray[7]);
+    assert("-q:v" == argumentArray[8]);
+    assert("0" == argumentArray[9]);
+    assert("-q:a" == argumentArray[10]);
+    assert("0" == argumentArray[11]);
+    assert("video.mp4" == argumentArray[12]);
+  }
+
 }

+ 1 - 1
example/pubspec.lock

@@ -47,7 +47,7 @@ packages:
       name: flutter_ffmpeg
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.5"
+    version: "0.2.6"
   flutter_test:
     dependency: "direct dev"
     description: flutter

+ 1 - 1
example/pubspec.yaml

@@ -11,7 +11,7 @@ dependencies:
   cupertino_icons: ^0.1.2
   path: ^1.6.2
   path_provider: ^0.5.0+1
-  flutter_ffmpeg: ^0.2.5
+  flutter_ffmpeg: 0.2.6
 
 dev_dependencies:
   flutter_test:

+ 1 - 1
ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_audio/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_audio/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_audio/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_audio/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_audio_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_audio_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_audio_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_audio_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_full-gpl/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_full-gpl/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_full-gpl/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_full-gpl/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_full-gpl_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_full-gpl_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_full-gpl_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_full-gpl_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_full/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_full/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_full/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_full/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_full_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_full_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_full_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_full_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_https-gpl/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_https-gpl/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_https-gpl/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_https-gpl/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_https-gpl_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_https-gpl_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_https-gpl_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_https-gpl_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_https/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_https/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_https/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_https/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_https_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_https_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_https_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_https_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_min-gpl/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_min-gpl/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_min-gpl/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_min-gpl/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_min-gpl_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_min-gpl_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_min-gpl_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_min-gpl_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_min/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_min/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_min/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_min/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_min_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_min_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_min_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_min_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_video/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_video/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_video/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_video/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
packages/flutter_ffmpeg_video_lts/android/build.gradle

@@ -1,5 +1,5 @@
 group 'com.arthenica.flutter.ffmpeg'
-version '0.2.5'
+version '0.2.6'
 
 buildscript {
     repositories {

+ 1 - 1
packages/flutter_ffmpeg_video_lts/ios/flutter_ffmpeg.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name             = 'flutter_ffmpeg'
-  s.version          = '0.2.5'
+  s.version          = '0.2.6'
   s.summary          = 'FFmpeg plugin for Flutter.'
   s.description      = 'FFmpeg plugin based on mobile-ffmpeg for Flutter.'
   s.homepage         = 'https://github.com/tanersener/flutter-ffmpeg'

+ 56 - 3
packages/flutter_ffmpeg_video_lts/lib/flutter_ffmpeg.dart

@@ -144,11 +144,11 @@ class FlutterFFmpeg {
     }
   }
 
-  /// Executes FFmpeg [command] provided. Command is split into arguments using provided [delimiter].
-  Future<int> execute(String command, [String delimiter = ' ']) async {
+  /// Executes FFmpeg [command] provided.
+  Future<int> execute(String command) async {
     try {
       final Map<dynamic, dynamic> result = await _methodChannel.invokeMethod(
-          'execute', {'command': command, 'delimiter': delimiter});
+          'executeWithArguments', {'arguments': parseArguments(command)});
       return result['rc'];
     } on PlatformException catch (e) {
       print("Plugin error: ${e.message}");
@@ -379,4 +379,57 @@ class FlutterFFmpeg {
       return null;
     }
   }
+
+  /// Parses the given [command] into arguments.
+  List<String> parseArguments(String command) {
+    List<String> argumentList = new List();
+    StringBuffer currentArgument = new StringBuffer();
+
+    bool singleQuoteStarted = false;
+    bool doubleQuoteStarted = false;
+
+    for (int i = 0; i < command.length; i++) {
+      var previousChar;
+      if (i > 0) {
+        previousChar = command.codeUnitAt(i - 1);
+      } else {
+        previousChar = null;
+      }
+      var currentChar = command.codeUnitAt(i);
+
+      if (currentChar == ' '.codeUnitAt(0)) {
+        if (singleQuoteStarted || doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else if (currentArgument.length > 0) {
+          argumentList.add(currentArgument.toString());
+          currentArgument = new StringBuffer();
+        }
+      } else if (currentChar == '\''.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (singleQuoteStarted) {
+          singleQuoteStarted = false;
+        } else if (doubleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          singleQuoteStarted = true;
+        }
+      } else if (currentChar == '\"'.codeUnitAt(0) && (previousChar == null || previousChar != '\\'.codeUnitAt(0))) {
+        if (doubleQuoteStarted) {
+          doubleQuoteStarted = false;
+        } else if (singleQuoteStarted) {
+          currentArgument.write(String.fromCharCode(currentChar));
+        } else {
+          doubleQuoteStarted = true;
+        }
+      } else {
+        currentArgument.write(String.fromCharCode(currentChar));
+      }
+    }
+
+    if (currentArgument.length > 0) {
+      argumentList.add(currentArgument.toString());
+    }
+
+    return argumentList;
+  }
+
 }

+ 1 - 1
packages/flutter_ffmpeg_video_lts/pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg
 

+ 1 - 1
pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ffmpeg
 description: Flutter plugin to run FFmpeg on mobile platforms. Supports iOS and Android.
-version: 0.2.5
+version: 0.2.6
 author: Taner Sener <tanersener@gmail.com>
 homepage: https://github.com/tanersener/flutter-ffmpeg