react-native-video-trim 1.0.24 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +55 -9
  2. package/android/src/main/AndroidManifest.xml +15 -0
  3. package/android/src/main/java/com/videotrim/VideoTrimModule.java +191 -63
  4. package/android/src/main/java/com/videotrim/enums/ErrorCode.java +11 -0
  5. package/android/src/main/java/com/videotrim/interfaces/VideoTrimListener.java +6 -1
  6. package/android/src/main/java/com/videotrim/utils/MediaMetadataUtil.java +75 -0
  7. package/android/src/main/java/com/videotrim/utils/StorageUtil.java +2 -2
  8. package/android/src/main/java/com/videotrim/utils/VideoTrimmerUtil.java +36 -8
  9. package/android/src/main/java/com/videotrim/widgets/VideoTrimmerView.java +588 -308
  10. package/android/src/main/res/drawable/airpodsmax.xml +19 -0
  11. package/android/src/main/res/drawable/chevron_compact_left.xml +15 -0
  12. package/android/src/main/res/drawable/chevron_compact_right.xml +15 -0
  13. package/android/src/main/res/drawable/chevron_right_with_bg.xml +13 -0
  14. package/android/src/main/res/drawable/exclamationmark_triangle_fill.xml +15 -0
  15. package/android/src/main/res/drawable/pause_fill.xml +15 -0
  16. package/android/src/main/res/drawable/play_fill.xml +15 -0
  17. package/android/src/main/res/drawable/rounded_progress_indicator.xml +16 -0
  18. package/android/src/main/res/drawable/rounded_yellow_left_background.xml +8 -0
  19. package/android/src/main/res/drawable/rounded_yellow_right_background.xml +8 -0
  20. package/android/src/main/res/drawable/thumb_container_bg.xml +8 -0
  21. package/android/src/main/res/drawable/yellow_border.xml +9 -0
  22. package/android/src/main/res/layout/video_trimmer_view.xml +194 -75
  23. package/android/src/main/res/values/colors.xml +15 -13
  24. package/android/src/main/res/xml/file_paths.xml +5 -0
  25. package/ios/AssetLoader.swift +99 -0
  26. package/ios/ErrorCode.swift +16 -0
  27. package/ios/VideoTrim.mm +4 -2
  28. package/ios/VideoTrim.swift +405 -168
  29. package/ios/VideoTrimmer.swift +16 -10
  30. package/ios/VideoTrimmerViewController.swift +79 -13
  31. package/lib/commonjs/index.js +20 -57
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/module/index.js +19 -57
  34. package/lib/module/index.js.map +1 -1
  35. package/lib/typescript/index.d.ts +47 -9
  36. package/lib/typescript/index.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/src/index.tsx +56 -66
  39. package/android/src/main/java/com/videotrim/adapters/VideoTrimmerAdapter.java +0 -54
  40. package/android/src/main/java/com/videotrim/widgets/RangeSeekBarView.java +0 -534
  41. package/android/src/main/java/com/videotrim/widgets/SpacesItemDecoration2.java +0 -33
  42. package/android/src/main/java/com/videotrim/widgets/ZVideoView.java +0 -48
  43. package/android/src/main/java/iknow/android/utils/BuildConfig.java +0 -18
  44. package/android/src/main/java/iknow/android/utils/DateUtil.java +0 -64
  45. package/android/src/main/res/drawable/ic_video_pause_black.png +0 -0
  46. package/android/src/main/res/drawable/ic_video_play_black.png +0 -0
  47. package/android/src/main/res/drawable/ic_video_thumb_handle.png +0 -0
  48. package/android/src/main/res/drawable/icon_seek_bar.png +0 -0
  49. package/android/src/main/res/layout/video_thumb_item_layout.xml +0 -16
@@ -1,12 +1,13 @@
1
1
  package com.videotrim.utils;
2
2
 
3
- import android.content.Context;
4
3
  import android.graphics.Bitmap;
5
4
  import android.media.MediaMetadataRetriever;
6
- import android.net.Uri;
7
5
  import com.arthenica.ffmpegkit.FFmpegKit;
8
6
  import com.arthenica.ffmpegkit.ReturnCode;
9
7
  import com.arthenica.ffmpegkit.SessionState;
8
+ import com.facebook.react.bridge.Arguments;
9
+ import com.facebook.react.bridge.WritableMap;
10
+ import com.videotrim.enums.ErrorCode;
10
11
  import com.videotrim.interfaces.VideoTrimListener;
11
12
 
12
13
  import java.text.SimpleDateFormat;
@@ -29,6 +30,7 @@ public class VideoTrimmerUtil {
29
30
  public static int MAX_COUNT_RANGE = 10; // how many images in the highlight range of seek bar
30
31
  public static int SCREEN_WIDTH_FULL = DeviceUtil.getDeviceWidth();
31
32
  public static final int RECYCLER_VIEW_PADDING = UnitConverter.dpToPx(35);
33
+ public static String DEFAULT_AUDIO_EXTENSION = ".wav";
32
34
  public static int VIDEO_FRAMES_WIDTH = SCREEN_WIDTH_FULL - RECYCLER_VIEW_PADDING * 2;
33
35
  // public static final int THUMB_WIDTH = (SCREEN_WIDTH_FULL - RECYCLER_VIEW_PADDING * 2) / VIDEO_MAX_TIME;
34
36
  public static int mThumbWidth = 0; // make it automatic
@@ -63,6 +65,7 @@ public class VideoTrimmerUtil {
63
65
  "creation_time=" + formattedDateTime,
64
66
  outputFile
65
67
  };
68
+ System.out.println("Commandddddd: " + String.join(",", cmds));
66
69
 
67
70
  FFmpegKit.executeWithArgumentsAsync(cmds, session -> {
68
71
  SessionState state = session.getState();
@@ -75,10 +78,17 @@ public class VideoTrimmerUtil {
75
78
  else {
76
79
  // CANCEL + FAILURE
77
80
  String errorMessage = String.format("Command failed with state %s and rc %s.%s", state, returnCode, session.getFailStackTrace());
78
- callback.onError(errorMessage);
81
+ callback.onError(errorMessage, ErrorCode.TRIMMING_FAILED);
79
82
  }
80
83
  }, log -> {
81
84
  System.out.println("FFmpeg process started with log " + log.getMessage());
85
+
86
+ WritableMap map = Arguments.createMap();
87
+ map.putInt("level", log.getLevel().getValue());
88
+ map.putString("message", log.getMessage());
89
+ map.putDouble("sessionId", log.getSessionId());
90
+ map.putString("logStr", log.toString());
91
+ callback.onLog(map);
82
92
  }, statistics -> {
83
93
  int timeInMilliseconds = (int) statistics.getTime();
84
94
  if (timeInMilliseconds > 0) {
@@ -86,21 +96,40 @@ public class VideoTrimmerUtil {
86
96
  (timeInMilliseconds * 100) / videoDuration;
87
97
  callback.onTrimmingProgress(Math.min(Math.max(completePercentage, 0), 100));
88
98
  }
99
+
100
+ WritableMap map = Arguments.createMap();
101
+ map.putDouble("sessionId", statistics.getSessionId());
102
+ map.putInt("videoFrameNumber", statistics.getVideoFrameNumber());
103
+ map.putDouble("videoFps", statistics.getVideoFps());
104
+ map.putDouble("videoQuality", statistics.getVideoQuality());
105
+ map.putDouble("size", statistics.getSize());
106
+ map.putDouble("time", statistics.getTime());
107
+ map.putDouble("bitrate", statistics.getBitrate());
108
+ map.putDouble("speed", statistics.getSpeed());
109
+ map.putString("statisticsStr", statistics.toString());
110
+ callback.onStatistics(map);
89
111
  });
90
112
  }
91
113
 
92
- public static void shootVideoThumbInBackground(final Context context, final Uri videoUri, final int totalThumbsCount, final long startPosition,
114
+ public static void shootVideoThumbInBackground(final MediaMetadataRetriever mediaMetadataRetriever, final int totalThumbsCount, final long startPosition,
93
115
  final long endPosition, final SingleCallback<Bitmap, Integer> callback) {
94
116
  BackgroundExecutor.execute(new BackgroundExecutor.Task("", 0L, "") {
95
117
  @Override public void execute() {
96
118
  try {
97
- MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
98
- mediaMetadataRetriever.setDataSource(context, videoUri);
99
119
  // Retrieve media data use microsecond
100
120
  long interval = (endPosition - startPosition) / (totalThumbsCount - 1);
101
121
  for (long i = 0; i < totalThumbsCount; ++i) {
102
122
  long frameTime = startPosition + interval * i;
103
- Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(frameTime * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
123
+
124
+ Bitmap bitmap;
125
+ try {
126
+ bitmap = mediaMetadataRetriever.getFrameAtTime(frameTime * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
127
+ } catch (final Throwable t) {
128
+ // this can happen while thumbnails are being generated in background and we press Cancel
129
+ t.printStackTrace();
130
+ break;
131
+ }
132
+
104
133
  if(bitmap == null) continue;
105
134
  try {
106
135
  bitmap = Bitmap.createScaledBitmap(bitmap, mThumbWidth * THUMB_RESOLUTION_RES, THUMB_HEIGHT * THUMB_RESOLUTION_RES, false);
@@ -109,7 +138,6 @@ public class VideoTrimmerUtil {
109
138
  }
110
139
  callback.onSingleCallback(bitmap, (int) interval);
111
140
  }
112
- mediaMetadataRetriever.release();
113
141
  } catch (final Throwable e) {
114
142
  Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
115
143
  }