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.
- package/README.md +55 -9
- package/android/src/main/AndroidManifest.xml +15 -0
- package/android/src/main/java/com/videotrim/VideoTrimModule.java +191 -63
- package/android/src/main/java/com/videotrim/enums/ErrorCode.java +11 -0
- package/android/src/main/java/com/videotrim/interfaces/VideoTrimListener.java +6 -1
- package/android/src/main/java/com/videotrim/utils/MediaMetadataUtil.java +75 -0
- package/android/src/main/java/com/videotrim/utils/StorageUtil.java +2 -2
- package/android/src/main/java/com/videotrim/utils/VideoTrimmerUtil.java +36 -8
- package/android/src/main/java/com/videotrim/widgets/VideoTrimmerView.java +588 -308
- package/android/src/main/res/drawable/airpodsmax.xml +19 -0
- package/android/src/main/res/drawable/chevron_compact_left.xml +15 -0
- package/android/src/main/res/drawable/chevron_compact_right.xml +15 -0
- package/android/src/main/res/drawable/chevron_right_with_bg.xml +13 -0
- package/android/src/main/res/drawable/exclamationmark_triangle_fill.xml +15 -0
- package/android/src/main/res/drawable/pause_fill.xml +15 -0
- package/android/src/main/res/drawable/play_fill.xml +15 -0
- package/android/src/main/res/drawable/rounded_progress_indicator.xml +16 -0
- package/android/src/main/res/drawable/rounded_yellow_left_background.xml +8 -0
- package/android/src/main/res/drawable/rounded_yellow_right_background.xml +8 -0
- package/android/src/main/res/drawable/thumb_container_bg.xml +8 -0
- package/android/src/main/res/drawable/yellow_border.xml +9 -0
- package/android/src/main/res/layout/video_trimmer_view.xml +194 -75
- package/android/src/main/res/values/colors.xml +15 -13
- package/android/src/main/res/xml/file_paths.xml +5 -0
- package/ios/AssetLoader.swift +99 -0
- package/ios/ErrorCode.swift +16 -0
- package/ios/VideoTrim.mm +4 -2
- package/ios/VideoTrim.swift +405 -168
- package/ios/VideoTrimmer.swift +16 -10
- package/ios/VideoTrimmerViewController.swift +79 -13
- package/lib/commonjs/index.js +20 -57
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +19 -57
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +47 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +56 -66
- package/android/src/main/java/com/videotrim/adapters/VideoTrimmerAdapter.java +0 -54
- package/android/src/main/java/com/videotrim/widgets/RangeSeekBarView.java +0 -534
- package/android/src/main/java/com/videotrim/widgets/SpacesItemDecoration2.java +0 -33
- package/android/src/main/java/com/videotrim/widgets/ZVideoView.java +0 -48
- package/android/src/main/java/iknow/android/utils/BuildConfig.java +0 -18
- package/android/src/main/java/iknow/android/utils/DateUtil.java +0 -64
- package/android/src/main/res/drawable/ic_video_pause_black.png +0 -0
- package/android/src/main/res/drawable/ic_video_play_black.png +0 -0
- package/android/src/main/res/drawable/ic_video_thumb_handle.png +0 -0
- package/android/src/main/res/drawable/icon_seek_bar.png +0 -0
- 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
|
|
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
|
-
|
|
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
|
}
|