react-native-video-trim 1.0.23 → 2.0.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 +22 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/videotrim/VideoTrimModule.java +17 -2
- package/android/src/main/java/com/videotrim/interfaces/VideoTrimListener.java +5 -1
- package/android/src/main/java/com/videotrim/utils/VideoTrimmerUtil.java +38 -3
- package/android/src/main/java/com/videotrim/widgets/VideoTrimmerView.java +406 -295
- 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/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/yellow_border.xml +9 -0
- package/android/src/main/res/layout/video_trimmer_view.xml +148 -76
- package/android/src/main/res/values/colors.xml +15 -13
- package/ios/VideoTrim.swift +41 -5
- package/ios/VideoTrimmerViewController.swift +1 -1
- package/package.json +1 -1
- 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/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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="14.531dp"
|
|
3
|
+
android:height="53.086dp"
|
|
4
|
+
android:viewportWidth="14.531"
|
|
5
|
+
android:viewportHeight="53.086">
|
|
6
|
+
<path
|
|
7
|
+
android:fillColor="#FF000000"
|
|
8
|
+
android:pathData="M0,0h14.531v53.086h-14.531z"
|
|
9
|
+
android:strokeAlpha="0"
|
|
10
|
+
android:fillAlpha="0"/>
|
|
11
|
+
<path
|
|
12
|
+
android:pathData="M9.398,51.328C9.797,52.336 10.664,52.945 11.578,52.945C13.055,52.945 14.18,51.844 14.18,50.367C14.18,49.594 13.758,48.609 13.523,47.953L4.289,24.703L4.289,28.219L13.523,4.969C13.758,4.313 14.18,3.305 14.18,2.578C14.18,1.102 13.055,0 11.578,0C10.664,0 9.797,0.609 9.398,1.594L1.008,22.758C0.539,23.906 0,25.359 0,26.461C0,27.586 0.539,28.992 1.008,30.164Z"
|
|
13
|
+
android:fillColor="#ffffff"
|
|
14
|
+
android:fillAlpha="0.85"/>
|
|
15
|
+
</vector>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="14.531dp"
|
|
3
|
+
android:height="53.086dp"
|
|
4
|
+
android:viewportWidth="14.531"
|
|
5
|
+
android:viewportHeight="53.086">
|
|
6
|
+
<path
|
|
7
|
+
android:fillColor="#FF000000"
|
|
8
|
+
android:pathData="M0,0h14.531v53.086h-14.531z"
|
|
9
|
+
android:strokeAlpha="0"
|
|
10
|
+
android:fillAlpha="0"/>
|
|
11
|
+
<path
|
|
12
|
+
android:pathData="M4.781,51.328L13.172,30.164C13.641,28.992 14.18,27.586 14.18,26.461C14.18,25.359 13.641,23.906 13.172,22.758L4.781,1.594C4.383,0.609 3.516,0 2.602,0C1.125,0 0,1.102 0,2.578C0,3.305 0.398,4.313 0.656,4.969L9.867,28.219L9.867,24.703L0.656,47.953C0.398,48.609 0,49.594 0,50.367C0,51.844 1.125,52.945 2.602,52.945C3.516,52.945 4.383,52.336 4.781,51.328Z"
|
|
13
|
+
android:fillColor="#ffffff"
|
|
14
|
+
android:fillAlpha="0.85"/>
|
|
15
|
+
</vector>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
<item android:drawable="@drawable/rounded_yellow_right_background"/>
|
|
3
|
+
<item>
|
|
4
|
+
<inset
|
|
5
|
+
android:insetLeft="8dp"
|
|
6
|
+
android:insetTop="8dp"
|
|
7
|
+
android:insetRight="8dp"
|
|
8
|
+
android:insetBottom="8dp"
|
|
9
|
+
android:drawable="@drawable/chevron_compact_right">
|
|
10
|
+
</inset>
|
|
11
|
+
</item>
|
|
12
|
+
</layer-list>
|
|
13
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="35.953dp"
|
|
3
|
+
android:height="48.586dp"
|
|
4
|
+
android:viewportWidth="35.953"
|
|
5
|
+
android:viewportHeight="48.586">
|
|
6
|
+
<path
|
|
7
|
+
android:fillColor="#FF000000"
|
|
8
|
+
android:pathData="M0,0h35.953v48.586h-35.953z"
|
|
9
|
+
android:strokeAlpha="0"
|
|
10
|
+
android:fillAlpha="0"/>
|
|
11
|
+
<path
|
|
12
|
+
android:pathData="M3.75,48.563L10.5,48.563C13.008,48.563 14.25,47.32 14.25,44.813L14.25,3.75C14.25,1.172 13.008,0 10.5,0L3.75,0C1.242,0 0,1.266 0,3.75L0,44.813C0,47.32 1.242,48.563 3.75,48.563ZM25.102,48.563L31.852,48.563C34.359,48.563 35.602,47.32 35.602,44.813L35.602,3.75C35.602,1.172 34.359,0 31.852,0L25.102,0C22.594,0 21.352,1.266 21.352,3.75L21.352,44.813C21.352,47.32 22.594,48.563 25.102,48.563Z"
|
|
13
|
+
android:fillColor="#ffffff"
|
|
14
|
+
android:fillAlpha="1"/>
|
|
15
|
+
</vector>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:width="51.82dp"
|
|
3
|
+
android:height="50.977dp"
|
|
4
|
+
android:viewportWidth="51.82"
|
|
5
|
+
android:viewportHeight="50.977">
|
|
6
|
+
<path
|
|
7
|
+
android:fillColor="#FF000000"
|
|
8
|
+
android:pathData="M0,0h51.82v50.977h-51.82z"
|
|
9
|
+
android:strokeAlpha="0"
|
|
10
|
+
android:fillAlpha="0"/>
|
|
11
|
+
<path
|
|
12
|
+
android:pathData="M9.867,50.977C10.969,50.977 11.859,50.602 12.984,49.945L48.773,29.133C51,27.867 51.82,26.977 51.82,25.5C51.82,24.047 51,23.156 48.773,21.867L12.984,1.078C11.859,0.422 10.969,0.023 9.867,0.023C7.852,0.023 6.586,1.547 6.586,3.961L6.586,47.063C6.586,49.453 7.852,50.977 9.867,50.977Z"
|
|
13
|
+
android:fillColor="#ffffff"
|
|
14
|
+
android:fillAlpha="1"/>
|
|
15
|
+
</vector>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
<!-- Shadow -->
|
|
3
|
+
<item>
|
|
4
|
+
<shape android:shape="rectangle">
|
|
5
|
+
<corners android:radius="5dp"/>
|
|
6
|
+
<solid android:color="#80000000"/> <!-- semi-transparent black for shadow -->
|
|
7
|
+
</shape>
|
|
8
|
+
</item>
|
|
9
|
+
<!-- Rounded corners -->
|
|
10
|
+
<item android:right="2dp" android:left="2dp" android:top="2dp" android:bottom="2dp">
|
|
11
|
+
<shape android:shape="rectangle">
|
|
12
|
+
<corners android:radius="5dp"/>
|
|
13
|
+
<solid android:color="@android:color/white"/>
|
|
14
|
+
</shape>
|
|
15
|
+
</item>
|
|
16
|
+
</layer-list>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
+
android:insetLeft="-4dp" android:insetRight="-4dp" >
|
|
3
|
+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
|
4
|
+
<solid android:color="@android:color/transparent" />
|
|
5
|
+
<stroke
|
|
6
|
+
android:width="4dp"
|
|
7
|
+
android:color="@color/trim_color" />
|
|
8
|
+
</shape>
|
|
9
|
+
</inset>
|
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<RelativeLayout
|
|
3
|
-
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
4
|
-
xmlns:tools="http://schemas.android.com/tools"
|
|
2
|
+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
5
3
|
android:layout_width="match_parent"
|
|
6
4
|
android:layout_height="match_parent"
|
|
7
|
-
android:orientation="vertical"
|
|
8
|
-
>
|
|
5
|
+
android:orientation="vertical">
|
|
9
6
|
|
|
10
7
|
<RelativeLayout
|
|
11
|
-
android:id="@+id/layout_surface_view"
|
|
12
8
|
android:layout_width="match_parent"
|
|
13
9
|
android:layout_height="match_parent"
|
|
14
10
|
android:layout_above="@+id/layout"
|
|
15
11
|
android:background="@android:color/black"
|
|
16
|
-
android:gravity="center"
|
|
17
|
-
>
|
|
12
|
+
android:gravity="center">
|
|
18
13
|
|
|
19
|
-
<
|
|
14
|
+
<VideoView
|
|
20
15
|
android:id="@+id/video_loader"
|
|
21
16
|
android:layout_width="match_parent"
|
|
22
|
-
android:layout_height="match_parent"
|
|
23
|
-
android:layout_centerInParent="true" />
|
|
17
|
+
android:layout_height="match_parent" />
|
|
24
18
|
|
|
25
19
|
</RelativeLayout>
|
|
26
20
|
|
|
@@ -29,87 +23,165 @@
|
|
|
29
23
|
android:layout_width="match_parent"
|
|
30
24
|
android:layout_height="wrap_content"
|
|
31
25
|
android:layout_alignParentBottom="true"
|
|
32
|
-
android:background="@android:color/black"
|
|
33
|
-
>
|
|
34
|
-
|
|
35
|
-
<!-- <TextView-->
|
|
36
|
-
<!-- android:id="@+id/video_shoot_tip"-->
|
|
37
|
-
<!-- android:layout_width="match_parent"-->
|
|
38
|
-
<!-- android:layout_height="30dp"-->
|
|
39
|
-
<!-- android:layout_alignParentLeft="true"-->
|
|
40
|
-
<!-- android:layout_alignParentStart="true"-->
|
|
41
|
-
<!-- android:layout_alignParentTop="true"-->
|
|
42
|
-
<!-- android:gravity="center"-->
|
|
43
|
-
<!-- android:textColor="@android:color/white"-->
|
|
44
|
-
<!-- android:textSize="12dp"-->
|
|
45
|
-
<!-- tools:text="拖动选择你要发表的10秒以内片段"-->
|
|
46
|
-
<!-- />-->
|
|
47
|
-
<FrameLayout
|
|
48
|
-
android:id="@+id/video_frames_layout"
|
|
49
|
-
android:layout_width="match_parent"
|
|
50
|
-
android:layout_height="60dp"
|
|
51
|
-
>
|
|
26
|
+
android:background="@android:color/black">
|
|
52
27
|
|
|
53
|
-
<androidx.recyclerview.widget.RecyclerView
|
|
54
|
-
android:id="@+id/video_frames_recyclerView"
|
|
55
|
-
android:layout_width="match_parent"
|
|
56
|
-
android:layout_height="50dp"
|
|
57
|
-
android:layout_gravity="bottom"
|
|
58
|
-
tools:background="@android:color/holo_green_light"
|
|
59
|
-
/>
|
|
60
28
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
android:layout_marginLeft="35dp"
|
|
67
|
-
android:contentDescription="@null"
|
|
68
|
-
android:src="@drawable/icon_seek_bar"
|
|
69
|
-
/>
|
|
29
|
+
<RelativeLayout
|
|
30
|
+
android:id="@+id/trimmerView"
|
|
31
|
+
android:layout_width="match_parent"
|
|
32
|
+
android:layout_height="50dp"
|
|
33
|
+
android:layout_margin="8dp">
|
|
70
34
|
|
|
71
35
|
<LinearLayout
|
|
36
|
+
android:id="@+id/thumbnailContainer"
|
|
72
37
|
android:layout_width="match_parent"
|
|
73
|
-
android:layout_height="
|
|
74
|
-
android:
|
|
38
|
+
android:layout_height="match_parent"
|
|
39
|
+
android:layout_marginHorizontal="20dp"
|
|
75
40
|
android:orientation="horizontal"
|
|
76
|
-
|
|
41
|
+
android:padding="4dp" />
|
|
77
42
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
android:background="@color/shadow_color"
|
|
83
|
-
/>
|
|
84
|
-
|
|
85
|
-
<LinearLayout
|
|
86
|
-
android:id="@+id/seekBarLayout"
|
|
87
|
-
android:layout_width="0dp"
|
|
88
|
-
android:layout_height="60dp"
|
|
89
|
-
android:layout_gravity="bottom"
|
|
90
|
-
android:layout_weight="1"
|
|
91
|
-
android:gravity="bottom"
|
|
92
|
-
android:orientation="vertical"
|
|
93
|
-
/>
|
|
43
|
+
<RelativeLayout
|
|
44
|
+
android:id="@+id/trimmerContainerWrapper"
|
|
45
|
+
android:layout_width="match_parent"
|
|
46
|
+
android:layout_height="match_parent">
|
|
94
47
|
|
|
95
48
|
<View
|
|
96
|
-
android:
|
|
49
|
+
android:id="@+id/trimmerContainerBg"
|
|
50
|
+
android:layout_width="match_parent"
|
|
51
|
+
android:layout_height="match_parent"
|
|
52
|
+
android:layout_toStartOf="@id/trailingHandle"
|
|
53
|
+
android:layout_toEndOf="@id/leadingHandle" />
|
|
54
|
+
|
|
55
|
+
<RelativeLayout
|
|
56
|
+
android:layout_width="match_parent"
|
|
57
|
+
android:layout_height="match_parent">
|
|
58
|
+
|
|
59
|
+
<View
|
|
60
|
+
android:id="@+id/leadingOverlay"
|
|
61
|
+
android:layout_width="20dp"
|
|
62
|
+
android:layout_height="match_parent"
|
|
63
|
+
android:layout_alignParentStart="true"
|
|
64
|
+
android:background="@color/shadow_color" />
|
|
65
|
+
|
|
66
|
+
<View
|
|
67
|
+
android:id="@+id/trimmerContainer"
|
|
68
|
+
android:layout_width="match_parent"
|
|
69
|
+
android:layout_height="match_parent"
|
|
70
|
+
android:layout_toStartOf="@id/trailingOverlay"
|
|
71
|
+
android:layout_toEndOf="@id/leadingOverlay"
|
|
72
|
+
android:background="@drawable/yellow_border" />
|
|
73
|
+
|
|
74
|
+
<View
|
|
75
|
+
android:id="@+id/progressIndicator"
|
|
76
|
+
android:layout_width="10dp"
|
|
77
|
+
android:layout_height="match_parent"
|
|
78
|
+
android:layout_marginHorizontal="20dp"
|
|
79
|
+
android:background="@drawable/rounded_progress_indicator" />
|
|
80
|
+
|
|
81
|
+
<View
|
|
82
|
+
android:id="@+id/trailingOverlay"
|
|
83
|
+
android:layout_width="20dp"
|
|
84
|
+
android:layout_height="match_parent"
|
|
85
|
+
android:layout_alignParentEnd="true"
|
|
86
|
+
android:background="@color/shadow_color" />
|
|
87
|
+
</RelativeLayout>
|
|
88
|
+
|
|
89
|
+
<FrameLayout
|
|
90
|
+
android:id="@+id/leadingHandle"
|
|
91
|
+
android:layout_width="20dp"
|
|
97
92
|
android:layout_height="match_parent"
|
|
98
|
-
android:
|
|
99
|
-
android:
|
|
100
|
-
|
|
101
|
-
|
|
93
|
+
android:layout_alignParentStart="true"
|
|
94
|
+
android:layout_centerVertical="true"
|
|
95
|
+
android:background="@drawable/rounded_yellow_left_background"
|
|
96
|
+
android:paddingVertical="10dp">
|
|
97
|
+
|
|
98
|
+
<ImageView
|
|
99
|
+
android:layout_width="20dp"
|
|
100
|
+
android:layout_height="match_parent"
|
|
101
|
+
android:contentDescription="LeadingHandle"
|
|
102
|
+
android:src="@drawable/chevron_compact_left"
|
|
103
|
+
android:tint="@color/black" />
|
|
104
|
+
</FrameLayout>
|
|
105
|
+
|
|
106
|
+
<FrameLayout
|
|
107
|
+
android:id="@+id/trailingHandle"
|
|
108
|
+
android:layout_width="20dp"
|
|
109
|
+
android:layout_height="match_parent"
|
|
110
|
+
android:layout_alignParentEnd="true"
|
|
111
|
+
android:layout_centerVertical="true"
|
|
112
|
+
android:background="@drawable/rounded_yellow_right_background"
|
|
113
|
+
android:paddingVertical="10dp">
|
|
114
|
+
|
|
115
|
+
<ImageView
|
|
116
|
+
android:layout_width="20dp"
|
|
117
|
+
android:layout_height="match_parent"
|
|
118
|
+
android:contentDescription="TrailingHandle"
|
|
119
|
+
android:src="@drawable/chevron_compact_right"
|
|
120
|
+
android:tint="@color/black" />
|
|
121
|
+
</FrameLayout>
|
|
122
|
+
|
|
123
|
+
</RelativeLayout>
|
|
124
|
+
|
|
125
|
+
</RelativeLayout>
|
|
126
|
+
|
|
127
|
+
<FrameLayout
|
|
128
|
+
android:id="@+id/timingStackView"
|
|
129
|
+
android:layout_width="match_parent"
|
|
130
|
+
android:layout_height="50dp"
|
|
131
|
+
android:layout_below="@+id/trimmerView"
|
|
132
|
+
android:layout_marginHorizontal="16dp"
|
|
133
|
+
android:orientation="horizontal"
|
|
134
|
+
android:visibility="visible">
|
|
135
|
+
|
|
136
|
+
<TextView
|
|
137
|
+
android:id="@+id/startTime"
|
|
138
|
+
android:layout_width="wrap_content"
|
|
139
|
+
android:layout_height="match_parent"
|
|
140
|
+
android:layout_gravity="left"
|
|
141
|
+
android:clickable="true"
|
|
142
|
+
android:focusable="true"
|
|
143
|
+
android:gravity="center"
|
|
144
|
+
android:padding="10dp"
|
|
145
|
+
android:text="00:00.00"
|
|
146
|
+
android:textColor="@android:color/white"
|
|
147
|
+
android:textSize="16sp" />
|
|
148
|
+
|
|
149
|
+
<TextView
|
|
150
|
+
android:id="@+id/currentTime"
|
|
151
|
+
android:layout_width="wrap_content"
|
|
152
|
+
android:layout_height="match_parent"
|
|
153
|
+
android:layout_gravity="center"
|
|
154
|
+
android:clickable="true"
|
|
155
|
+
android:focusable="true"
|
|
156
|
+
android:gravity="center"
|
|
157
|
+
android:padding="10dp"
|
|
158
|
+
android:text="00:00.00"
|
|
159
|
+
android:textColor="@android:color/white"
|
|
160
|
+
android:textSize="16sp" />
|
|
161
|
+
|
|
162
|
+
<TextView
|
|
163
|
+
android:id="@+id/endTime"
|
|
164
|
+
android:layout_width="wrap_content"
|
|
165
|
+
android:layout_height="match_parent"
|
|
166
|
+
android:layout_gravity="right"
|
|
167
|
+
android:clickable="true"
|
|
168
|
+
android:focusable="true"
|
|
169
|
+
android:gravity="center"
|
|
170
|
+
android:padding="10dp"
|
|
171
|
+
android:text="00:00.00"
|
|
172
|
+
android:textColor="@android:color/white"
|
|
173
|
+
android:textSize="16sp" />
|
|
174
|
+
|
|
102
175
|
</FrameLayout>
|
|
103
176
|
|
|
104
177
|
<FrameLayout
|
|
105
178
|
android:layout_width="match_parent"
|
|
106
179
|
android:layout_height="50dp"
|
|
107
|
-
android:layout_below="@+id/
|
|
180
|
+
android:layout_below="@+id/timingStackView"
|
|
108
181
|
android:layout_marginLeft="10dp"
|
|
109
182
|
android:layout_marginRight="10dp"
|
|
110
183
|
android:orientation="horizontal"
|
|
111
|
-
android:visibility="visible"
|
|
112
|
-
>
|
|
184
|
+
android:visibility="visible">
|
|
113
185
|
|
|
114
186
|
<TextView
|
|
115
187
|
android:id="@+id/cancelBtn"
|
|
@@ -128,8 +200,8 @@
|
|
|
128
200
|
android:layout_height="match_parent"
|
|
129
201
|
android:layout_gravity="center"
|
|
130
202
|
android:padding="12dp"
|
|
131
|
-
android:src="@drawable/
|
|
132
|
-
/>
|
|
203
|
+
android:src="@drawable/play_fill"
|
|
204
|
+
android:tint="@color/white"/>
|
|
133
205
|
|
|
134
206
|
<TextView
|
|
135
207
|
android:id="@+id/saveBtn"
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
|
2
2
|
<resources>
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<color name="colorPrimary">#3F51B5</color>
|
|
4
|
+
<color name="colorPrimaryDark">#303F9F</color>
|
|
5
|
+
<color name="colorAccent">#FF4081</color>
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
<color name="white">#ffffffff</color>
|
|
8
|
+
<color name="red">#aacc0000</color>
|
|
9
|
+
<color name="background_video_color">#2f3031</color>
|
|
10
|
+
<color name="background_progress_color">#6C6D6D</color>
|
|
11
|
+
<color name="progress_color">#aacc0000</color>
|
|
12
|
+
<color name="line_color">#FF15FF00</color>
|
|
13
|
+
<color name="shadow_color">#7F000000</color>
|
|
14
|
+
<color name="line_button">#565758</color>
|
|
15
|
+
<color name="black_translucent">#50000000</color>
|
|
16
|
+
<color name="top_bottom">#42BAF8</color>
|
|
17
|
+
<color name="trim_color">#f1d247</color>
|
|
18
|
+
<color name="black">#000000</color>
|
|
17
19
|
</resources>
|
package/ios/VideoTrim.swift
CHANGED
|
@@ -281,8 +281,6 @@ class VideoTrim: RCTEventEmitter {
|
|
|
281
281
|
formatter.timeZone = TimeZone(identifier: "UTC")
|
|
282
282
|
let dateTime = formatter.string(from: Date())
|
|
283
283
|
|
|
284
|
-
let cmd = "-ss \(startTime * 1000)ms -to \(endTime * 1000)ms -i \(inputFile) -c copy -metadata creation_time=\(dateTime) \(outputFile)";
|
|
285
|
-
|
|
286
284
|
self.emitEventToJS("onStartTrimming", eventData: nil)
|
|
287
285
|
|
|
288
286
|
// Create Alert
|
|
@@ -304,14 +302,28 @@ class VideoTrim: RCTEventEmitter {
|
|
|
304
302
|
})
|
|
305
303
|
}
|
|
306
304
|
|
|
307
|
-
|
|
305
|
+
let cmds = [
|
|
306
|
+
"-ss",
|
|
307
|
+
"\(startTime * 1000)ms",
|
|
308
|
+
"-to",
|
|
309
|
+
"\(endTime * 1000)ms",
|
|
310
|
+
"-i",
|
|
311
|
+
"\(inputFile)",
|
|
312
|
+
"-c",
|
|
313
|
+
"copy",
|
|
314
|
+
"-metadata",
|
|
315
|
+
"creation_time=\(dateTime)",
|
|
316
|
+
outputFile
|
|
317
|
+
]
|
|
318
|
+
|
|
319
|
+
FFmpegKit.execute(withArgumentsAsync: cmds, withCompleteCallback: { session in
|
|
308
320
|
let _ = self.deleteFile(url: inputFile) // remove the file we just copied to document directory
|
|
309
321
|
|
|
310
322
|
let state = session?.getState()
|
|
311
323
|
let returnCode = session?.getReturnCode()
|
|
312
324
|
|
|
313
325
|
if ReturnCode.isSuccess(returnCode) {
|
|
314
|
-
let eventPayload: [String: Any] = ["outputPath": outputFile]
|
|
326
|
+
let eventPayload: [String: Any] = ["outputPath": outputFile, "startTime": startTime, "endTime": endTime, "duration": videoDuration]
|
|
315
327
|
self.emitEventToJS("onFinishTrimming", eventData: eventPayload)
|
|
316
328
|
|
|
317
329
|
if (self.saveToPhoto) {
|
|
@@ -356,15 +368,39 @@ class VideoTrim: RCTEventEmitter {
|
|
|
356
368
|
})
|
|
357
369
|
}
|
|
358
370
|
}, withLogCallback: { log in
|
|
371
|
+
guard let log = log else { return }
|
|
372
|
+
|
|
373
|
+
print("FFmpeg process started with log " + (log.getMessage()));
|
|
374
|
+
|
|
375
|
+
let eventPayload: [String: Any] = [
|
|
376
|
+
"level": log.getLevel(),
|
|
377
|
+
"message": log.getMessage() ?? "",
|
|
378
|
+
"sessionId": log.getSessionId(),
|
|
379
|
+
]
|
|
380
|
+
self.emitEventToJS("onLog", eventData: eventPayload)
|
|
359
381
|
|
|
360
382
|
}, withStatisticsCallback: { statistics in
|
|
361
|
-
let
|
|
383
|
+
guard let statistics = statistics else { return }
|
|
384
|
+
|
|
385
|
+
let timeInMilliseconds = statistics.getTime()
|
|
362
386
|
if timeInMilliseconds > 0 {
|
|
363
387
|
let completePercentage = timeInMilliseconds / (videoDuration * 1000); // from 0 -> 1
|
|
364
388
|
DispatchQueue.main.async {
|
|
365
389
|
progressView.setProgress(Float(completePercentage), animated: true)
|
|
366
390
|
}
|
|
367
391
|
}
|
|
392
|
+
|
|
393
|
+
let eventPayload: [String: Any] = [
|
|
394
|
+
"sessionId": statistics.getSessionId(),
|
|
395
|
+
"videoFrameNumber": statistics.getVideoFrameNumber(),
|
|
396
|
+
"videoFps": statistics.getVideoFps(),
|
|
397
|
+
"videoQuality": statistics.getVideoQuality(),
|
|
398
|
+
"size": statistics.getSize(),
|
|
399
|
+
"time": statistics.getTime(),
|
|
400
|
+
"bitrate": statistics.getBitrate(),
|
|
401
|
+
"speed": statistics.getSpeed()
|
|
402
|
+
]
|
|
403
|
+
self.emitEventToJS("onStatistics", eventData: eventPayload)
|
|
368
404
|
})
|
|
369
405
|
}
|
|
370
406
|
}
|
|
@@ -169,7 +169,7 @@ class VideoTrimmerViewController: UIViewController {
|
|
|
169
169
|
|
|
170
170
|
private func setupButtons() {
|
|
171
171
|
cancelBtn = UIButton.createButton(title: cancelBtnText, font: .systemFont(ofSize: 18), titleColor: .white, target: self, action: #selector(onCancelBtnClicked))
|
|
172
|
-
playBtn = UIButton.createButton(image: playIcon, tintColor: .
|
|
172
|
+
playBtn = UIButton.createButton(image: playIcon, tintColor: .white, target: self, action: #selector(togglePlay(sender:)))
|
|
173
173
|
saveBtn = UIButton.createButton(title: saveButtonText, font: .systemFont(ofSize: 18), titleColor: .systemBlue, target: self, action: #selector(onSaveBtnClicked))
|
|
174
174
|
|
|
175
175
|
btnStackView = UIStackView(arrangedSubviews: [cancelBtn, playBtn, saveBtn])
|
package/package.json
CHANGED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
package com.videotrim.adapters;
|
|
2
|
-
|
|
3
|
-
import android.content.Context;
|
|
4
|
-
import android.graphics.Bitmap;
|
|
5
|
-
import android.view.LayoutInflater;
|
|
6
|
-
import android.view.View;
|
|
7
|
-
import android.view.ViewGroup;
|
|
8
|
-
import android.widget.ImageView;
|
|
9
|
-
import android.widget.LinearLayout;
|
|
10
|
-
import androidx.annotation.NonNull;
|
|
11
|
-
import androidx.recyclerview.widget.RecyclerView;
|
|
12
|
-
import com.videotrim.R;
|
|
13
|
-
import com.videotrim.utils.VideoTrimmerUtil;
|
|
14
|
-
import java.util.ArrayList;
|
|
15
|
-
import java.util.List;
|
|
16
|
-
|
|
17
|
-
public class VideoTrimmerAdapter extends RecyclerView.Adapter {
|
|
18
|
-
private final List<Bitmap> mBitmaps = new ArrayList<>();
|
|
19
|
-
private final LayoutInflater mInflater;
|
|
20
|
-
|
|
21
|
-
public VideoTrimmerAdapter(Context context) {
|
|
22
|
-
this.mInflater = LayoutInflater.from(context);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
26
|
-
return new TrimmerViewHolder(mInflater.inflate(R.layout.video_thumb_item_layout, parent, false));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
|
30
|
-
((TrimmerViewHolder) holder).thumbImageView.setImageBitmap(mBitmaps.get(position));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@Override public int getItemCount() {
|
|
34
|
-
return mBitmaps.size();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public void addBitmaps(Bitmap bitmap) {
|
|
38
|
-
mBitmaps.add(bitmap);
|
|
39
|
-
notifyItemInserted(mBitmaps.size() - 1);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private static final class TrimmerViewHolder extends RecyclerView.ViewHolder {
|
|
43
|
-
ImageView thumbImageView;
|
|
44
|
-
|
|
45
|
-
TrimmerViewHolder(View itemView) {
|
|
46
|
-
super(itemView);
|
|
47
|
-
thumbImageView = itemView.findViewById(R.id.thumb);
|
|
48
|
-
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) thumbImageView.getLayoutParams();
|
|
49
|
-
layoutParams.width = VideoTrimmerUtil.VIDEO_FRAMES_WIDTH / VideoTrimmerUtil.MAX_COUNT_RANGE;
|
|
50
|
-
thumbImageView.setLayoutParams(layoutParams);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|