react-native-compressor 0.5.9 → 0.5.14
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/android/.gradle/6.1.1/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/6.1.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/6.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/{6.1.1 → 6.9}/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/6.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +1 -1
- package/android/.gradle/checksums/checksums.lock +0 -0
- package/android/.gradle/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/checksums/sha1-checksums.bin +0 -0
- package/android/.idea/jarRepositories.xml +10 -0
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml +13 -0
- package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_0_2_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_asynclayoutinflater_asynclayoutinflater_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +16 -0
- package/android/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_0_0_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_core_core_1_1_0_aar.xml +16 -0
- package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_0_0_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_ui_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_slidingpanelayout_slidingpanelayout_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +4 -0
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_0_1_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml +13 -0
- package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +3 -0
- package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_java_only_0_2_2.xml +13 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +18 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +18 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +18 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +18 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +15 -0
- package/android/.idea/libraries/{Gradle__com_facebook_infer_annotation_infer_annotation_0_11_2.xml → Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml} +4 -4
- package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_66_1_aar.xml +14 -0
- package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_1.xml +13 -0
- package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_1.xml +13 -0
- package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_1_aar.xml +15 -0
- package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +13 -0
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_1.xml +13 -0
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_1.xml +13 -0
- package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +13 -0
- package/android/.idea/libraries/Gradle__io_github_lizhangqu_coreprogress_1_0_2_aar.xml +5 -2
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +13 -0
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_4_10.xml +13 -0
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_4_10.xml +13 -0
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_4_10.xml +13 -0
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_4_10.xml +13 -0
- package/android/.idea/modules/android.iml +34 -26
- package/android/build.gradle +43 -44
- package/android/src/main/java/com/reactnativecompressor/.DS_Store +0 -0
- package/android/src/main/java/com/reactnativecompressor/Audio/AudioCompressor.java +3 -4
- package/android/src/main/java/com/reactnativecompressor/CompressorModule.java +1 -33
- package/android/src/main/java/com/reactnativecompressor/Utils/Utils.java +74 -0
- package/android/src/main/java/com/reactnativecompressor/Video/AutoVideoCompression/AutoVideoCompression.java +24 -58
- package/android/src/main/java/com/reactnativecompressor/Video/VideoCompressorHelper.java +6 -42
- package/android/src/main/java/com/reactnativecompressor/Video/VideoModule.java +19 -17
- package/ios/Compressor.m +2 -1
- package/ios/Video/VideoCompressor.swift +32 -25
- package/lib/commonjs/Audio/index.js +3 -1
- package/lib/commonjs/Audio/index.js.map +1 -1
- package/lib/commonjs/Video/index.js +47 -34
- package/lib/commonjs/Video/index.js.map +1 -1
- package/lib/commonjs/index.js +17 -10
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/index.js +15 -2
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/Audio/index.js +3 -1
- package/lib/module/Audio/index.js.map +1 -1
- package/lib/module/Video/index.js +39 -31
- package/lib/module/Video/index.js.map +1 -1
- package/lib/module/index.js +5 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/index.js +11 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/Video/index.d.ts +4 -1
- package/lib/typescript/index.d.ts +3 -2
- package/lib/typescript/utils/index.d.ts +1 -0
- package/package.json +2 -7
- package/react-native-compressor.podspec +1 -1
- package/src/Audio/index.tsx +1 -1
- package/src/Video/index.tsx +49 -38
- package/src/index.tsx +3 -1
- package/src/utils/index.tsx +17 -0
- package/android/.gradle/6.1.1/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_0_0.xml +0 -13
- package/android/.idea/libraries/Gradle__androidx_core_core_1_0_1_aar.xml +0 -20
- package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_0_0_aar.xml +0 -16
- package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_java_only_0_0_3.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_0_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_0_0_aar.xml +0 -22
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_0_0_aar.xml +0 -22
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_0_0_aar.xml +0 -22
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_0_0_aar.xml +0 -22
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_0_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_0_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_0_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_63_4_aar.xml +0 -22
- package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_9_0.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_9_0.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_9_0_aar.xml +0 -18
- package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_14_1.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_12_12.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_3_12_12.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okio_okio_1_15_0.xml +0 -13
- package/android/.idea/libraries/Gradle__com_zolad_videoslimmer_1_0_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_4_0.xml +0 -13
- package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_4_0.xml +0 -13
|
@@ -14,9 +14,7 @@ import android.os.Build;
|
|
|
14
14
|
|
|
15
15
|
import androidx.annotation.RequiresApi;
|
|
16
16
|
|
|
17
|
-
import
|
|
18
|
-
import com.zolad.videoslimmer.listner.SlimProgressListener;
|
|
19
|
-
import com.zolad.videoslimmer.muxer.CodecInputSurface;
|
|
17
|
+
import numan.dev.videocompressor.codecinputsurface.CodecInputSurface;
|
|
20
18
|
|
|
21
19
|
import java.io.File;
|
|
22
20
|
import java.io.IOException;
|
|
@@ -46,7 +44,7 @@ public class AudioCompressor {
|
|
|
46
44
|
* */
|
|
47
45
|
@SuppressLint("LongLogTag")
|
|
48
46
|
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
|
|
49
|
-
public boolean CompressAudio(final String sourcePath, String destinationPath, int nbitrate
|
|
47
|
+
public boolean CompressAudio(final String sourcePath, String destinationPath, int nbitrate) {
|
|
50
48
|
|
|
51
49
|
this.path = sourcePath;
|
|
52
50
|
this.outputPath = destinationPath;
|
|
@@ -350,6 +348,7 @@ public class AudioCompressor {
|
|
|
350
348
|
}
|
|
351
349
|
|
|
352
350
|
|
|
351
|
+
@SuppressLint("WrongConstant")
|
|
353
352
|
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
|
|
354
353
|
private long simpleReadAndWriteTrack(MediaExtractor extractor, MediaMuxer mediaMuxer, MediaCodec.BufferInfo info, long start, long end, File file, boolean isAudio) throws Exception {
|
|
355
354
|
int trackIndex = selectTrack(extractor, isAudio);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
package com.reactnativecompressor;
|
|
2
2
|
|
|
3
|
-
import android.graphics.Bitmap;
|
|
4
3
|
import android.media.MediaMetadataRetriever;
|
|
5
4
|
import android.net.Uri;
|
|
6
5
|
import android.os.Build;
|
|
@@ -10,7 +9,6 @@ import androidx.annotation.NonNull;
|
|
|
10
9
|
import androidx.annotation.Nullable;
|
|
11
10
|
import androidx.annotation.RequiresApi;
|
|
12
11
|
|
|
13
|
-
import com.facebook.react.bridge.Arguments;
|
|
14
12
|
import com.facebook.react.bridge.Promise;
|
|
15
13
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
16
14
|
import com.facebook.react.bridge.ReactContext;
|
|
@@ -23,10 +21,8 @@ import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
|
23
21
|
import com.reactnativecompressor.Image.ImageCompressor;
|
|
24
22
|
import com.reactnativecompressor.Image.utils.ImageCompressorOptions;
|
|
25
23
|
import com.reactnativecompressor.Video.VideoCompressorHelper;
|
|
26
|
-
import com.zolad.videoslimmer.VideoSlimmer;
|
|
27
24
|
|
|
28
25
|
import static com.reactnativecompressor.Utils.Utils.generateCacheFilePath;
|
|
29
|
-
import java.io.ByteArrayOutputStream;
|
|
30
26
|
import com.reactnativecompressor.Audio.AudioCompressor;
|
|
31
27
|
|
|
32
28
|
@ReactModule(name = CompressorModule.NAME)
|
|
@@ -93,35 +89,7 @@ public class CompressorModule extends ReactContextBaseJavaModule {
|
|
|
93
89
|
|
|
94
90
|
float bitrate = options.bitrate;
|
|
95
91
|
Log.d("nomi onStart", destinationPath+"onProgress: "+bitrate);
|
|
96
|
-
new AudioCompressor().CompressAudio(srcPath, destinationPath, (int) bitrate*1000
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
@Override
|
|
100
|
-
public void onStart() {
|
|
101
|
-
//convert start
|
|
102
|
-
Log.d("nomi onStart", "onProgress: ");
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
@Override
|
|
107
|
-
public void onFinish(boolean result) {
|
|
108
|
-
//convert finish,result(true is success,false is fail)
|
|
109
|
-
promise.resolve(destinationPath);
|
|
110
|
-
Log.d("nomi onFinish", "onProgress: ");
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@Override
|
|
115
|
-
public void onProgress(float percent) {
|
|
116
|
-
WritableMap params = Arguments.createMap();
|
|
117
|
-
WritableMap data = Arguments.createMap();
|
|
118
|
-
params.putString("uuid", options.uuid);
|
|
119
|
-
data.putDouble("progress", percent/100);
|
|
120
|
-
params.putMap("data", data);
|
|
121
|
-
Log.d("nomi onProgress", "onProgress: "+percent);
|
|
122
|
-
sendEvent(reactContext, "videoCompressProgress", params);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
92
|
+
new AudioCompressor().CompressAudio(srcPath, destinationPath, (int) bitrate*1000);
|
|
125
93
|
|
|
126
94
|
} catch (Exception ex) {
|
|
127
95
|
promise.reject(ex);
|
|
@@ -1,15 +1,89 @@
|
|
|
1
1
|
package com.reactnativecompressor.Utils;
|
|
2
2
|
|
|
3
|
+
import androidx.annotation.Nullable;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.bridge.Arguments;
|
|
6
|
+
import com.facebook.react.bridge.Promise;
|
|
3
7
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
8
|
+
import com.facebook.react.bridge.ReactContext;
|
|
9
|
+
import com.facebook.react.bridge.WritableMap;
|
|
10
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
11
|
+
import numan.dev.videocompressor.VideoCompressTask;
|
|
12
|
+
import numan.dev.videocompressor.VideoCompressor;
|
|
4
13
|
|
|
5
14
|
import java.io.File;
|
|
15
|
+
import java.util.HashMap;
|
|
16
|
+
import java.util.Map;
|
|
6
17
|
import java.util.UUID;
|
|
7
18
|
|
|
8
19
|
public class Utils {
|
|
20
|
+
static int videoCompressionThreshold=10;
|
|
21
|
+
static Map<String, VideoCompressTask> compressorExports = new HashMap<>();
|
|
22
|
+
|
|
9
23
|
public static String generateCacheFilePath(String extension, ReactApplicationContext reactContext){
|
|
10
24
|
File outputDir = reactContext.getCacheDir();
|
|
11
25
|
|
|
12
26
|
String outputUri = String.format("%s/%s." + extension, outputDir.getPath(), UUID.randomUUID().toString());
|
|
13
27
|
return outputUri;
|
|
14
28
|
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
public static void compressVideo(String srcPath, String destinationPath, int resultWidth, int resultHeight, float videoBitRate, String uuid, Promise promise, ReactApplicationContext reactContext){
|
|
32
|
+
final int[] currentVideoCompression = {0};
|
|
33
|
+
try{
|
|
34
|
+
VideoCompressTask export=VideoCompressor.convertVideo(srcPath, destinationPath, resultWidth, resultHeight, (int) videoBitRate, new VideoCompressor.ProgressListener() {
|
|
35
|
+
@Override
|
|
36
|
+
public void onStart() {
|
|
37
|
+
//convert start
|
|
38
|
+
}
|
|
39
|
+
@Override
|
|
40
|
+
public void onFinish(boolean result) {
|
|
41
|
+
//convert finish,result(true is success,false is fail)
|
|
42
|
+
promise.resolve("file:/"+destinationPath);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Override
|
|
46
|
+
public void onError(String errorMessage) {
|
|
47
|
+
promise.reject("Compression has canncelled");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Override
|
|
51
|
+
public void onProgress(float percent) {
|
|
52
|
+
int roundProgress=Math.round(percent);
|
|
53
|
+
if(roundProgress%videoCompressionThreshold==0&&roundProgress> currentVideoCompression[0]) {
|
|
54
|
+
WritableMap params = Arguments.createMap();
|
|
55
|
+
WritableMap data = Arguments.createMap();
|
|
56
|
+
params.putString("uuid", uuid);
|
|
57
|
+
data.putDouble("progress", percent / 100);
|
|
58
|
+
params.putMap("data", data);
|
|
59
|
+
sendEvent(reactContext, "videoCompressProgress", params);
|
|
60
|
+
currentVideoCompression[0] =roundProgress;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
compressorExports.put(uuid, export);
|
|
65
|
+
} catch (Exception ex) {
|
|
66
|
+
promise.reject(ex);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
currentVideoCompression[0] =0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public static void cancelCompressionHelper(String uuid){
|
|
74
|
+
try{
|
|
75
|
+
VideoCompressTask export=compressorExports.get(uuid);
|
|
76
|
+
export.cancel(true);
|
|
77
|
+
}
|
|
78
|
+
catch (Exception ex) {
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private static void sendEvent(ReactContext reactContext,
|
|
83
|
+
String eventName,
|
|
84
|
+
@Nullable WritableMap params) {
|
|
85
|
+
reactContext
|
|
86
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
|
87
|
+
.emit(eventName, params);
|
|
88
|
+
}
|
|
15
89
|
}
|
|
@@ -1,94 +1,60 @@
|
|
|
1
1
|
package com.reactnativecompressor.Video.AutoVideoCompression;
|
|
2
2
|
|
|
3
|
-
import android.media.MediaCodecInfo;
|
|
4
3
|
import android.media.MediaMetadataRetriever;
|
|
5
|
-
import android.media.session.MediaController;
|
|
6
4
|
import android.net.Uri;
|
|
7
|
-
import android.os.Build;
|
|
8
5
|
|
|
9
6
|
import androidx.annotation.Nullable;
|
|
10
7
|
|
|
11
|
-
import com.facebook.react.bridge.Arguments;
|
|
12
8
|
import com.facebook.react.bridge.Promise;
|
|
13
9
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
14
10
|
import com.facebook.react.bridge.ReactContext;
|
|
15
11
|
import com.facebook.react.bridge.WritableMap;
|
|
16
12
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
17
13
|
import com.reactnativecompressor.Video.VideoCompressorHelper;
|
|
18
|
-
import com.
|
|
14
|
+
import static com.reactnativecompressor.Utils.Utils.compressVideo;
|
|
19
15
|
|
|
20
16
|
import java.io.File;
|
|
21
17
|
|
|
22
18
|
import static com.reactnativecompressor.Utils.Utils.generateCacheFilePath;
|
|
23
19
|
|
|
24
20
|
public class AutoVideoCompression {
|
|
25
|
-
static int videoCompressionThreshold=10;
|
|
26
|
-
static int currentVideoCompression=0;
|
|
27
|
-
|
|
28
21
|
public static void createCompressionSettings(String fileUrl,VideoCompressorHelper options,Promise promise, ReactApplicationContext reactContext) {
|
|
29
22
|
float maxSize = options.maxSize;
|
|
30
23
|
float minimumFileSizeForCompress=options.minimumFileSizeForCompress;
|
|
31
24
|
try{
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
float scale = actualWidth > actualHeight ? maxSize / actualWidth : maxSize / actualHeight;
|
|
47
|
-
int resultWidth = Math.round(actualWidth * scale / 2) * 2;
|
|
48
|
-
int resultHeight = Math.round(actualHeight * scale / 2) * 2;
|
|
49
|
-
|
|
50
|
-
float videoBitRate = makeVideoBitrate(
|
|
51
|
-
actualHeight, actualWidth,
|
|
52
|
-
bitrate,
|
|
53
|
-
resultHeight, resultWidth
|
|
54
|
-
);
|
|
25
|
+
Uri uri= Uri.parse(fileUrl);
|
|
26
|
+
String srcPath = uri.getPath();
|
|
27
|
+
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
|
|
28
|
+
metaRetriever.setDataSource(srcPath);
|
|
29
|
+
File file=new File(srcPath);
|
|
30
|
+
float sizeInBytes = file.length();
|
|
31
|
+
float sizeInMb = sizeInBytes / (1024 * 1024);
|
|
32
|
+
if(sizeInMb>minimumFileSizeForCompress)
|
|
33
|
+
{
|
|
34
|
+
String destinationPath = generateCacheFilePath("mp4", reactContext);
|
|
35
|
+
int actualHeight =Integer.parseInt(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
|
|
36
|
+
int actualWidth = Integer.parseInt(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
|
|
37
|
+
int bitrate = Integer.parseInt(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE));
|
|
55
38
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
//convert start
|
|
60
|
-
}
|
|
61
|
-
@Override
|
|
62
|
-
public void onFinish(boolean result) {
|
|
63
|
-
//convert finish,result(true is success,false is fail)
|
|
64
|
-
promise.resolve("file:/"+destinationPath);
|
|
65
|
-
}
|
|
66
|
-
@Override
|
|
67
|
-
public void onProgress(float percent) {
|
|
68
|
-
int roundProgress=Math.round(percent);
|
|
69
|
-
if(roundProgress%videoCompressionThreshold==0&&roundProgress>currentVideoCompression) {
|
|
70
|
-
WritableMap params = Arguments.createMap();
|
|
71
|
-
WritableMap data = Arguments.createMap();
|
|
72
|
-
params.putString("uuid", options.uuid);
|
|
73
|
-
data.putDouble("progress", percent / 100);
|
|
74
|
-
params.putMap("data", data);
|
|
75
|
-
sendEvent(reactContext, "videoCompressProgress", params);
|
|
76
|
-
currentVideoCompression=roundProgress;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
});
|
|
39
|
+
float scale = actualWidth > actualHeight ? maxSize / actualWidth : maxSize / actualHeight;
|
|
40
|
+
int resultWidth = Math.round(actualWidth * scale / 2) * 2;
|
|
41
|
+
int resultHeight = Math.round(actualHeight * scale / 2) * 2;
|
|
80
42
|
|
|
43
|
+
float videoBitRate = makeVideoBitrate(
|
|
44
|
+
actualHeight, actualWidth,
|
|
45
|
+
bitrate,
|
|
46
|
+
resultHeight, resultWidth
|
|
47
|
+
);
|
|
48
|
+
compressVideo(srcPath, destinationPath, resultWidth, resultHeight, videoBitRate,options.uuid,promise,reactContext);
|
|
81
49
|
}
|
|
82
50
|
else
|
|
83
51
|
{
|
|
84
52
|
promise.resolve(fileUrl);
|
|
85
53
|
}
|
|
54
|
+
|
|
86
55
|
} catch (Exception ex) {
|
|
87
56
|
promise.reject(ex);
|
|
88
57
|
}
|
|
89
|
-
finally {
|
|
90
|
-
currentVideoCompression=0;
|
|
91
|
-
}
|
|
92
58
|
}
|
|
93
59
|
|
|
94
60
|
public static int makeVideoBitrate(int originalHeight, int originalWidth, int originalBitrate, int height, int width) {
|
|
@@ -8,7 +8,6 @@ import android.os.PowerManager;
|
|
|
8
8
|
|
|
9
9
|
import androidx.annotation.Nullable;
|
|
10
10
|
|
|
11
|
-
import com.facebook.react.bridge.Arguments;
|
|
12
11
|
import com.facebook.react.bridge.LifecycleEventListener;
|
|
13
12
|
import com.facebook.react.bridge.Promise;
|
|
14
13
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
@@ -17,13 +16,12 @@ import com.facebook.react.bridge.ReadableMap;
|
|
|
17
16
|
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
18
17
|
import com.facebook.react.bridge.WritableMap;
|
|
19
18
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
20
|
-
import com.reactnativecompressor.Image.utils.ImageCompressorOptions;
|
|
21
19
|
import com.reactnativecompressor.Utils.FileUplaoder.FileUploader;
|
|
22
20
|
import com.reactnativecompressor.Video.AutoVideoCompression.AutoVideoCompression;
|
|
23
|
-
import com.zolad.videoslimmer.VideoSlimmer;
|
|
24
21
|
|
|
25
22
|
import java.util.UUID;
|
|
26
23
|
|
|
24
|
+
import static com.reactnativecompressor.Utils.Utils.compressVideo;
|
|
27
25
|
import static com.reactnativecompressor.Utils.Utils.generateCacheFilePath;
|
|
28
26
|
|
|
29
27
|
public class VideoCompressorHelper {
|
|
@@ -50,8 +48,8 @@ public class VideoCompressorHelper {
|
|
|
50
48
|
};
|
|
51
49
|
|
|
52
50
|
private static void sendEventString(ReactContext reactContext,
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
String eventName,
|
|
52
|
+
@Nullable String params) {
|
|
55
53
|
reactContext
|
|
56
54
|
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
|
57
55
|
.emit(eventName, params);
|
|
@@ -118,7 +116,7 @@ public class VideoCompressorHelper {
|
|
|
118
116
|
case "maxSize":
|
|
119
117
|
options.maxSize = (float) map.getDouble(key);
|
|
120
118
|
break;
|
|
121
|
-
|
|
119
|
+
case "uuid":
|
|
122
120
|
options.uuid = map.getString(key);
|
|
123
121
|
break;
|
|
124
122
|
case "minimumFileSizeForCompress":
|
|
@@ -166,44 +164,10 @@ public class VideoCompressorHelper {
|
|
|
166
164
|
}
|
|
167
165
|
}
|
|
168
166
|
float videoBitRate = (options.bitrate>0)?options.bitrate: (float) (height * width * 1.5);
|
|
169
|
-
|
|
170
|
-
VideoSlimmer.convertVideo(srcPath, destinationPath, width, height, (int) videoBitRate, new VideoSlimmer.ProgressListener() {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
@Override
|
|
174
|
-
public void onStart() {
|
|
175
|
-
//convert start
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
@Override
|
|
180
|
-
public void onFinish(boolean result) {
|
|
181
|
-
//convert finish,result(true is success,false is fail)
|
|
182
|
-
promise.resolve("file:/"+destinationPath);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
@Override
|
|
187
|
-
public void onProgress(float percent) {
|
|
188
|
-
int roundProgress=Math.round(percent);
|
|
189
|
-
if(roundProgress%videoCompressionThreshold==0&&roundProgress>currentVideoCompression) {
|
|
190
|
-
WritableMap params = Arguments.createMap();
|
|
191
|
-
WritableMap data = Arguments.createMap();
|
|
192
|
-
params.putString("uuid", options.uuid);
|
|
193
|
-
data.putDouble("progress", percent / 100);
|
|
194
|
-
params.putMap("data", data);
|
|
195
|
-
sendEvent(reactContext, "videoCompressProgress", params);
|
|
196
|
-
currentVideoCompression=roundProgress;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
167
|
+
compressVideo(srcPath, destinationPath, width, height, videoBitRate,options.uuid,promise,reactContext);
|
|
201
168
|
} catch (Exception ex) {
|
|
202
169
|
promise.reject(ex);
|
|
203
170
|
}
|
|
204
|
-
finally {
|
|
205
|
-
currentVideoCompression=0;
|
|
206
|
-
}
|
|
207
171
|
}
|
|
208
172
|
|
|
209
173
|
|
|
@@ -212,4 +176,4 @@ public class VideoCompressorHelper {
|
|
|
212
176
|
}
|
|
213
177
|
|
|
214
178
|
|
|
215
|
-
|
|
179
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
package com.reactnativecompressor.Video;
|
|
2
2
|
|
|
3
|
-
import android.
|
|
4
|
-
import android.net.Uri;
|
|
3
|
+
import android.util.Log;
|
|
5
4
|
|
|
6
5
|
import androidx.annotation.NonNull;
|
|
7
6
|
import androidx.annotation.Nullable;
|
|
8
7
|
|
|
9
|
-
import com.facebook.react.bridge.Arguments;
|
|
10
8
|
import com.facebook.react.bridge.Promise;
|
|
11
9
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
12
10
|
import com.facebook.react.bridge.ReactContext;
|
|
@@ -16,16 +14,13 @@ import com.facebook.react.bridge.ReadableMap;
|
|
|
16
14
|
import com.facebook.react.bridge.WritableMap;
|
|
17
15
|
import com.facebook.react.module.annotations.ReactModule;
|
|
18
16
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
19
|
-
import com.reactnativecompressor.Image.utils.ImageCompressorOptions;
|
|
20
|
-
import com.zolad.videoslimmer.VideoSlimmer;
|
|
21
17
|
|
|
22
|
-
import static com.reactnativecompressor.Utils.Utils.generateCacheFilePath;
|
|
23
18
|
import static com.reactnativecompressor.Video.VideoCompressorHelper.video_activateBackgroundTask_helper;
|
|
24
19
|
import static com.reactnativecompressor.Video.VideoCompressorHelper.video_deactivateBackgroundTask_helper;
|
|
25
20
|
import static com.reactnativecompressor.Video.VideoCompressorHelper.video_upload_helper;
|
|
26
|
-
|
|
21
|
+
import static com.reactnativecompressor.Utils.Utils.cancelCompressionHelper;
|
|
27
22
|
@ReactModule(name = VideoModule.NAME)
|
|
28
|
-
public class
|
|
23
|
+
public class VideoModule extends ReactContextBaseJavaModule {
|
|
29
24
|
public static final String NAME = "VideoCompressor";
|
|
30
25
|
private final ReactApplicationContext reactContext;
|
|
31
26
|
public VideoModule(ReactApplicationContext reactContext) {
|
|
@@ -53,18 +48,25 @@ public class VideoModule extends ReactContextBaseJavaModule {
|
|
|
53
48
|
String fileUrl,
|
|
54
49
|
ReadableMap optionMap,
|
|
55
50
|
Promise promise) {
|
|
56
|
-
|
|
51
|
+
final VideoCompressorHelper options = VideoCompressorHelper.fromMap(optionMap);
|
|
52
|
+
|
|
53
|
+
if(options.compressionMethod==VideoCompressorHelper.CompressionMethod.auto)
|
|
54
|
+
{
|
|
55
|
+
VideoCompressorHelper.VideoCompressAuto(fileUrl,options,promise,reactContext);
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
{
|
|
59
|
+
VideoCompressorHelper.VideoCompressManual(fileUrl,options,promise,reactContext);
|
|
60
|
+
}
|
|
57
61
|
|
|
58
|
-
if(options.compressionMethod==VideoCompressorHelper.CompressionMethod.auto)
|
|
59
|
-
{
|
|
60
|
-
VideoCompressorHelper.VideoCompressAuto(fileUrl,options,promise,reactContext);
|
|
61
|
-
}
|
|
62
|
-
else
|
|
63
|
-
{
|
|
64
|
-
VideoCompressorHelper.VideoCompressManual(fileUrl,options,promise,reactContext);
|
|
65
|
-
}
|
|
66
62
|
|
|
63
|
+
}
|
|
67
64
|
|
|
65
|
+
@ReactMethod
|
|
66
|
+
public void cancelCompression(
|
|
67
|
+
String uuid) {
|
|
68
|
+
cancelCompressionHelper(uuid);
|
|
69
|
+
Log.d("cancelCompression", uuid);
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
@ReactMethod
|
package/ios/Compressor.m
CHANGED
|
@@ -34,8 +34,9 @@ class VideoCompressor: RCTEventEmitter, URLSessionTaskDelegate {
|
|
|
34
34
|
var hasListener: Bool=false
|
|
35
35
|
var uploadResolvers: [String: RCTPromiseResolveBlock] = [:]
|
|
36
36
|
var uploadRejectors: [String: RCTPromiseRejectBlock] = [:]
|
|
37
|
+
var compressorExports: [String: NextLevelSessionExporter] = [:]
|
|
37
38
|
let videoCompressionThreshold:Int=7
|
|
38
|
-
|
|
39
|
+
|
|
39
40
|
|
|
40
41
|
override static func requiresMainQueueSetup() -> Bool {
|
|
41
42
|
return false
|
|
@@ -71,7 +72,7 @@ class VideoCompressor: RCTEventEmitter, URLSessionTaskDelegate {
|
|
|
71
72
|
@objc(compress:withOptions:withResolver:withRejecter:)
|
|
72
73
|
func compress(fileUrl: String, options: [String: Any], resolve:@escaping RCTPromiseResolveBlock, reject:@escaping RCTPromiseRejectBlock) -> Void {
|
|
73
74
|
compressVideo(url: URL(string: fileUrl)!, options:options,
|
|
74
|
-
onProgress: { progress in
|
|
75
|
+
onProgress: { progress in
|
|
75
76
|
print("Progress", progress)
|
|
76
77
|
if(self.hasListener){
|
|
77
78
|
self.sendEvent(withName: "videoCompressProgress", body: ["uuid": options["uuid"], "data": ["progress": progress]])
|
|
@@ -83,6 +84,11 @@ class VideoCompressor: RCTEventEmitter, URLSessionTaskDelegate {
|
|
|
83
84
|
})
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
@objc(cancelCompression:)
|
|
88
|
+
func cancelCompression(uuid: String) -> Void {
|
|
89
|
+
compressorExports[uuid]?.cancelExport()
|
|
90
|
+
}
|
|
91
|
+
|
|
86
92
|
func makeValidUri(filePath: String) -> String {
|
|
87
93
|
let fileWithUrl = URL(fileURLWithPath: filePath)
|
|
88
94
|
let absoluteUrl = fileWithUrl.deletingLastPathComponent()
|
|
@@ -219,7 +225,7 @@ func makeValidUri(filePath: String) -> String {
|
|
|
219
225
|
}
|
|
220
226
|
else
|
|
221
227
|
{
|
|
222
|
-
manualCompressionHelper(url: url,
|
|
228
|
+
manualCompressionHelper(url: url, options:options) { progress in
|
|
223
229
|
onProgress(progress)
|
|
224
230
|
} onCompletion: { outputURL in
|
|
225
231
|
onCompletion(outputURL)
|
|
@@ -247,7 +253,7 @@ func makeValidUri(filePath: String) -> String {
|
|
|
247
253
|
let maxBitrate:Int = 1669000
|
|
248
254
|
let minValue:Float=min(Float(originalHeight)/Float(height),Float(originalWidth)/Float(width))
|
|
249
255
|
var remeasuredBitrate:Int = Int(Float(originalBitrate) / minValue)
|
|
250
|
-
remeasuredBitrate = remeasuredBitrate*
|
|
256
|
+
remeasuredBitrate = Int(Float(remeasuredBitrate)*compressFactor)
|
|
251
257
|
let minBitrate:Int = self.getVideoBitrateWithFactor(f: minCompressFactor) / (1280 * 720 / (width * height))
|
|
252
258
|
if (originalBitrate < minBitrate) {
|
|
253
259
|
return remeasuredBitrate;
|
|
@@ -263,6 +269,7 @@ func makeValidUri(filePath: String) -> String {
|
|
|
263
269
|
|
|
264
270
|
func autoCompressionHelper(url: URL, options: [String: Any], onProgress: @escaping (Float) -> Void, onCompletion: @escaping (URL) -> Void, onFailure: @escaping (Error) -> Void){
|
|
265
271
|
let maxSize:Float = options["maxSize"] as! Float;
|
|
272
|
+
let uuid:String = options["uuid"] as! String
|
|
266
273
|
|
|
267
274
|
let asset = AVAsset(url: url)
|
|
268
275
|
guard asset.tracks.count >= 1 else {
|
|
@@ -286,8 +293,8 @@ func makeValidUri(filePath: String) -> String {
|
|
|
286
293
|
originalBitrate: Int(bitrate),
|
|
287
294
|
height: Int(resultHeight), width: Int(resultWidth)
|
|
288
295
|
);
|
|
289
|
-
|
|
290
|
-
exportVideoHelper(url: url, asset: asset, bitRate: videoBitRate, resultWidth: resultWidth, resultHeight: resultHeight) { progress in
|
|
296
|
+
|
|
297
|
+
exportVideoHelper(url: url, asset: asset, bitRate: videoBitRate, resultWidth: resultWidth, resultHeight: resultHeight,uuid: uuid) { progress in
|
|
291
298
|
onProgress(progress)
|
|
292
299
|
} onCompletion: { outputURL in
|
|
293
300
|
onCompletion(outputURL)
|
|
@@ -296,9 +303,9 @@ func makeValidUri(filePath: String) -> String {
|
|
|
296
303
|
}
|
|
297
304
|
}
|
|
298
305
|
|
|
299
|
-
func manualCompressionHelper(url: URL,
|
|
300
|
-
|
|
301
|
-
var
|
|
306
|
+
func manualCompressionHelper(url: URL, options: [String: Any], onProgress: @escaping (Float) -> Void, onCompletion: @escaping (URL) -> Void, onFailure: @escaping (Error) -> Void){
|
|
307
|
+
let uuid:String = options["uuid"] as! String
|
|
308
|
+
var bitRate=options["bitrate"] as! Float?;
|
|
302
309
|
let asset = AVAsset(url: url)
|
|
303
310
|
guard asset.tracks.count >= 1 else {
|
|
304
311
|
let error = CompressionError(message: "Invalid video URL, no track found")
|
|
@@ -321,12 +328,12 @@ func makeValidUri(filePath: String) -> String {
|
|
|
321
328
|
}
|
|
322
329
|
else
|
|
323
330
|
{
|
|
324
|
-
|
|
331
|
+
bitRate=bitRate ?? Float(abs(track.estimatedDataRate))*0.8
|
|
325
332
|
}
|
|
326
333
|
|
|
327
|
-
let videoBitRate =
|
|
334
|
+
let videoBitRate = bitRate ?? height*width*1.5
|
|
328
335
|
|
|
329
|
-
exportVideoHelper(url: url, asset: asset, bitRate: Int(videoBitRate), resultWidth: width, resultHeight: height) { progress in
|
|
336
|
+
exportVideoHelper(url: url, asset: asset, bitRate: Int(videoBitRate), resultWidth: width, resultHeight: height,uuid: uuid) { progress in
|
|
330
337
|
onProgress(progress)
|
|
331
338
|
} onCompletion: { outputURL in
|
|
332
339
|
onCompletion(outputURL)
|
|
@@ -335,7 +342,8 @@ func makeValidUri(filePath: String) -> String {
|
|
|
335
342
|
}
|
|
336
343
|
}
|
|
337
344
|
|
|
338
|
-
func exportVideoHelper(url: URL,asset: AVAsset, bitRate: Int,resultWidth:Float,resultHeight:Float, onProgress: @escaping (Float) -> Void, onCompletion: @escaping (URL) -> Void, onFailure: @escaping (Error) -> Void){
|
|
345
|
+
func exportVideoHelper(url: URL,asset: AVAsset, bitRate: Int,resultWidth:Float,resultHeight:Float,uuid:String, onProgress: @escaping (Float) -> Void, onCompletion: @escaping (URL) -> Void, onFailure: @escaping (Error) -> Void){
|
|
346
|
+
var videoCompressionCounter:Int=0
|
|
339
347
|
var tmpURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
|
|
340
348
|
.appendingPathComponent(ProcessInfo().globallyUniqueString)
|
|
341
349
|
.appendingPathExtension("mp4")
|
|
@@ -364,31 +372,28 @@ func makeValidUri(filePath: String) -> String {
|
|
|
364
372
|
AVSampleRateKey: NSNumber(value: Float(44100))
|
|
365
373
|
]
|
|
366
374
|
|
|
367
|
-
|
|
375
|
+
compressorExports[uuid] = exporter
|
|
368
376
|
exporter.export(progressHandler: { (progress) in
|
|
369
377
|
let _progress:Float=progress*100;
|
|
370
|
-
if(Int(_progress)==
|
|
378
|
+
if(Int(_progress)==videoCompressionCounter)
|
|
371
379
|
{
|
|
372
|
-
|
|
380
|
+
videoCompressionCounter=Int(_progress)+self.videoCompressionThreshold
|
|
373
381
|
onProgress(progress)
|
|
374
382
|
}
|
|
375
383
|
|
|
376
384
|
}, completionHandler: { result in
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
case .success(let status):
|
|
380
|
-
switch status {
|
|
385
|
+
videoCompressionCounter=0;
|
|
386
|
+
switch exporter.status {
|
|
381
387
|
case .completed:
|
|
382
388
|
onCompletion(exporter.outputURL!)
|
|
383
389
|
break
|
|
390
|
+
case .cancelled:
|
|
391
|
+
let error = CompressionError(message: "Compression has canncelled")
|
|
392
|
+
onFailure(error)
|
|
393
|
+
break
|
|
384
394
|
default:
|
|
385
395
|
onCompletion(url)
|
|
386
396
|
break
|
|
387
|
-
}
|
|
388
|
-
break
|
|
389
|
-
case .failure(let error):
|
|
390
|
-
onCompletion(url)
|
|
391
|
-
break
|
|
392
397
|
}
|
|
393
398
|
})
|
|
394
399
|
}
|
|
@@ -406,4 +411,6 @@ func makeValidUri(filePath: String) -> String {
|
|
|
406
411
|
let track = asset.tracks[videoTrackIndex];
|
|
407
412
|
return track;
|
|
408
413
|
}
|
|
414
|
+
|
|
415
|
+
|
|
409
416
|
}
|
|
@@ -11,7 +11,9 @@ var _utils = require("../utils");
|
|
|
11
11
|
|
|
12
12
|
const NativeAudio = _reactNative.NativeModules.Compressor;
|
|
13
13
|
const Audio = {
|
|
14
|
-
compress: async (url
|
|
14
|
+
compress: async function (url) {
|
|
15
|
+
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.DEFAULT_COMPRESS_AUDIO_OPTIONS;
|
|
16
|
+
|
|
15
17
|
try {
|
|
16
18
|
const checkUrlAndOptionsResult = await (0, _utils.checkUrlAndOptions)(url, options);
|
|
17
19
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["NativeAudio","NativeModules","Compressor","Audio","compress","url","options","DEFAULT_COMPRESS_AUDIO_OPTIONS","checkUrlAndOptionsResult","isCorrect","message","mediaDetails","bitrate","i","AUDIO_BITRATE","length","quality","compress_audio","error"],"mappings":";;;;;;;AAAA;;AACA;;AAOA,MAAMA,WAAW,GAAGC,2BAAcC,UAAlC;AAEA,MAAMC,KAAgB,GAAG;AACvBC,EAAAA,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["NativeAudio","NativeModules","Compressor","Audio","compress","url","options","DEFAULT_COMPRESS_AUDIO_OPTIONS","checkUrlAndOptionsResult","isCorrect","message","mediaDetails","bitrate","i","AUDIO_BITRATE","length","quality","compress_audio","error"],"mappings":";;;;;;;AAAA;;AACA;;AAOA,MAAMA,WAAW,GAAGC,2BAAcC,UAAlC;AAEA,MAAMC,KAAgB,GAAG;AACvBC,EAAAA,QAAQ,EAAE,gBAAOC,GAAP,EAAyD;AAAA,QAA7CC,OAA6C,uEAAnCC,qCAAmC;;AACjE,QAAI;AACF,YAAMC,wBAA2C,GAC/C,MAAM,+BAAmBH,GAAnB,EAAwBC,OAAxB,CADR;;AAEA,UAAI,CAACE,wBAAwB,CAACC,SAA9B,EAAyC;AACvC,cAAMD,wBAAwB,CAACE,OAA/B;AACD,OAFD,MAEO;AACL;AAEA;AACA;AACA,cAAMC,YAAiB,GAAG;AACxBC,UAAAA,OAAO,EAAE;AADe,SAA1B,CALK,CASL;;AACA,YAAIA,OAAY,GAAGL,sCAA+BK,OAAlD;;AAEA,YAAID,YAAY,IAAIA,YAAY,CAACC,OAAjC,EAA0C;AACxC;AACA,eAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGC,qBAAcC,MAAlC,EAA0CF,CAAC,EAA3C,EAA+C;AAC7C;AACA,gBAAIF,YAAY,CAACC,OAAb,GAAuBE,qBAAcD,CAAd,CAA3B,EAA6C;AAC3C,kBAAIA,CAAC,GAAG,CAAJ,GAAQC,qBAAcC,MAA1B,EAAkC;AAChC,oBAAIT,OAAO,CAACU,OAAR,KAAoB,KAAxB,EAA+BJ,OAAO,GAAGE,qBAAcD,CAAC,GAAG,CAAlB,CAAV,CAA/B,KACK,IAAIP,OAAO,CAACU,OAAR,KAAoB,QAAxB,EACHJ,OAAO,GAAGE,qBAAcD,CAAC,GAAG,CAAlB,CAAV,CADG,KAEAD,OAAO,GAAGE,qBAAcD,CAAd,CAAV;AACN,eALD,MAKO,IAAIA,CAAC,GAAG,CAAJ,GAAQC,qBAAcC,MAA1B,EAAkC;AACvC,oBAAIT,OAAO,CAACU,OAAR,KAAoB,KAAxB,EAA+BJ,OAAO,GAAGE,qBAAcD,CAAC,GAAG,CAAlB,CAAV,CAA/B,KACKD,OAAO,GAAGE,qBAAcD,CAAd,CAAV;AACN,eAHM,MAGAD,OAAO,GAAGE,qBAAcD,CAAd,CAAV;;AACP;AACD,aAb4C,CAe7C;;;AACA,gBACEF,YAAY,CAACC,OAAb,IAAwBE,qBAAcA,qBAAcC,MAAd,GAAuB,CAArC,CAD1B,EAEE;AACAH,cAAAA,OAAO,GAAGE,qBAAcA,qBAAcC,MAAd,GAAuB,CAArC,CAAV;AACA;AACD;AACF;AACF;;AAED,eAAOf,WAAW,CAACiB,cAAZ,CAA2BZ,GAA3B,EAAgC;AACrCO,UAAAA,OADqC;AAErCI,UAAAA,OAAO,EAAEV,OAAO,CAACU;AAFoB,SAAhC,CAAP;AAID;AACF,KAjDD,CAiDE,OAAOE,KAAP,EAAmB;AACnB,YAAMA,KAAK,CAACR,OAAZ;AACD;AACF;AAtDsB,CAAzB;eAyDeP,K","sourcesContent":["import { NativeModules } from 'react-native';\nimport {\n AUDIO_BITRATE,\n AudioType,\n DEFAULT_COMPRESS_AUDIO_OPTIONS,\n defaultResultType,\n checkUrlAndOptions,\n} from '../utils';\nconst NativeAudio = NativeModules.Compressor;\n\nconst Audio: AudioType = {\n compress: async (url, options = DEFAULT_COMPRESS_AUDIO_OPTIONS) => {\n try {\n const checkUrlAndOptionsResult: defaultResultType =\n await checkUrlAndOptions(url, options);\n if (!checkUrlAndOptionsResult.isCorrect) {\n throw checkUrlAndOptionsResult.message;\n } else {\n // Get resulting output file path\n\n // Get media details\n // const mediaDetails: any = await getDetails(url).catch(() => null);\n const mediaDetails: any = {\n bitrate: 0,\n };\n\n // Initialize bitrate\n let bitrate: any = DEFAULT_COMPRESS_AUDIO_OPTIONS.bitrate;\n\n if (mediaDetails && mediaDetails.bitrate) {\n // Check and return the appropriate bitrate according to quality expected\n for (let i = 0; i < AUDIO_BITRATE.length; i++) {\n // Check a particular bitrate to return its nearest lower according to quality\n if (mediaDetails.bitrate > AUDIO_BITRATE[i]) {\n if (i + 2 < AUDIO_BITRATE.length) {\n if (options.quality === 'low') bitrate = AUDIO_BITRATE[i + 2];\n else if (options.quality === 'medium')\n bitrate = AUDIO_BITRATE[i + 1];\n else bitrate = AUDIO_BITRATE[i];\n } else if (i + 1 < AUDIO_BITRATE.length) {\n if (options.quality === 'low') bitrate = AUDIO_BITRATE[i + 1];\n else bitrate = AUDIO_BITRATE[i];\n } else bitrate = AUDIO_BITRATE[i];\n break;\n }\n\n // Check if the matching bitrate is the last in the array\n if (\n mediaDetails.bitrate <= AUDIO_BITRATE[AUDIO_BITRATE.length - 1]\n ) {\n bitrate = AUDIO_BITRATE[AUDIO_BITRATE.length - 1];\n break;\n }\n }\n }\n\n return NativeAudio.compress_audio(url, {\n bitrate,\n quality: options.quality,\n });\n }\n } catch (error: any) {\n throw error.message;\n }\n },\n};\n\nexport default Audio;\n"]}
|