Skip to content

Commit 04a975c

Browse files
committed
moved to internal storage -> no permission required
1 parent 3e8668f commit 04a975c

File tree

6 files changed

+72
-609
lines changed

6 files changed

+72
-609
lines changed

app/src/main/AndroidManifest.xml

-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
6-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
7-
85
<application
96
android:icon="@mipmap/ic_launcher"
107
android:label="@string/app_name"

app/src/main/java/net/kibotu/androidffmpegtranscoder/demo/DemoActivity.kt

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.kibotu.androidffmpegtranscoder.demo
22

3+
import android.content.Context
34
import android.net.Uri
45
import android.os.Bundle
56
import android.os.Environment
@@ -24,9 +25,9 @@ class DemoActivity : FragmentActivity() {
2425
binding = ActivityDemoBinding.inflate(layoutInflater)
2526
setContentView(binding.root)
2627

27-
val frameFolder = "Download/process/".parseExternalStorageFile()
28-
val inputVideo = "Download/walkaround.mp4".parseExternalStorageFile()
29-
val outputVideo = "Download/output_${System.currentTimeMillis()}.mp4".parseExternalStorageFile()
28+
val frameFolder = "transcoding/process/".parseInternalStorageFile(this)
29+
val inputVideo = "example/source_video.mp4".parseInternalStorageFile(this)
30+
val outputVideo = "transcoding/output/output_${System.currentTimeMillis()}.mp4".parseInternalStorageFile(this)
3031

3132
val increment = 63f / 120f
3233
val times = (0..120).map {
@@ -106,4 +107,9 @@ class DemoActivity : FragmentActivity() {
106107
}
107108

108109
fun String.parseExternalStorageFile(): Uri =
109-
Uri.parse("${Environment.getExternalStorageDirectory()}/$this")
110+
Uri.parse("${Environment.getExternalStorageDirectory()}/$this")
111+
112+
fun String.parseAssetFile(): Uri = Uri.parse("file:///android_asset/$this")
113+
114+
fun String.parseInternalStorageFile(context: Context): Uri =
115+
Uri.parse("${context.filesDir.absolutePath}/$this")

app/src/main/java/net/kibotu/androidffmpegtranscoder/demo/FFmpegActivity.kt

+62-67
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package net.kibotu.androidffmpegtranscoder.demo
22

3-
import android.Manifest
43
import android.content.Context
54
import android.net.Uri
65
import android.os.Bundle
76
import android.util.Log
87
import androidx.appcompat.app.AppCompatActivity
98
import androidx.core.view.isVisible
10-
import net.kibotu.androidffmpegtranscoder.mcvideoeditor.MediaCodecTranscoder
11-
import net.kibotu.androidffmpegtranscoder.mcvideoeditor.MediaConfig
12-
import net.kibotu.androidffmpegtranscoder.ffmpeg.EncodingConfig
13-
import net.kibotu.androidffmpegtranscoder.ffmpeg.FFMpegTranscoder
14-
import net.kibotu.androidffmpegtranscoder.ffmpeg.Progress
159
import io.reactivex.android.schedulers.AndroidSchedulers
1610
import io.reactivex.disposables.CompositeDisposable
1711
import io.reactivex.schedulers.Schedulers
1812
import net.kibotu.androidffmpegtranscoder.demo.databinding.ActivityMainBinding
19-
import net.kibotu.androidffmpegtranscoder.demo.permissions.RxPermissions
13+
import net.kibotu.androidffmpegtranscoder.ffmpeg.EncodingConfig
14+
import net.kibotu.androidffmpegtranscoder.ffmpeg.FFMpegTranscoder
15+
import net.kibotu.androidffmpegtranscoder.ffmpeg.Progress
16+
import net.kibotu.androidffmpegtranscoder.mcvideoeditor.MediaCodecTranscoder
17+
import net.kibotu.androidffmpegtranscoder.mcvideoeditor.MediaConfig
2018
import net.kibotu.logger.Logger
2119
import net.kibotu.logger.TAG
2220
import java.io.File
@@ -26,42 +24,28 @@ import kotlin.math.roundToInt
2624

2725

2826
class FFmpegActivity : AppCompatActivity() {
29-
30-
private lateinit var binding : ActivityMainBinding
27+
28+
private lateinit var binding: ActivityMainBinding
3129

3230
var subscription: CompositeDisposable = CompositeDisposable()
3331

3432
override fun onCreate(savedInstanceState: Bundle?) {
3533
super.onCreate(savedInstanceState)
3634
binding = ActivityMainBinding.inflate(layoutInflater)
3735
setContentView(binding.root)
38-
39-
checkWriteExternalStoragePermission()
36+
run()
4037
}
4138

4239
// region location permission
4340

44-
protected fun checkWriteExternalStoragePermission() {
45-
RxPermissions(this)
46-
.requestEachCombined(
47-
Manifest.permission.WRITE_EXTERNAL_STORAGE
48-
)
49-
.subscribe({
50-
if (it.granted)
51-
onWritePermissionGranted()
52-
}, {
53-
Logger.v("permission $it" )
54-
})
55-
.addTo(subscription)
56-
}
41+
private fun run() {
5742

58-
private fun onWritePermissionGranted() {
43+
binding.initFfmpeg.text =
44+
"FFmpeg is ${if (FFMpegTranscoder.isSupported(this)) "" else "not"} supported."
5945

60-
binding.initFfmpeg.text = "FFmpeg is ${if (FFMpegTranscoder.isSupported(this)) "" else "not"} supported."
61-
62-
val frameFolder = "Download/process/".parseExternalStorageFile()
63-
val inputVideo = "Download/walkaround.mp4".parseExternalStorageFile()
64-
val outputVideo = "Download/stabilizedOutput_${System.currentTimeMillis()}.mp4".parseExternalStorageFile()
46+
val frameFolder = "transcoding/process".parseInternalStorageFile(this)
47+
val inputVideo = "input/source_video.mp4".parseInternalStorageFile(this)
48+
val outputVideo = "transcoding/output/output_${System.currentTimeMillis()}.mp4".parseInternalStorageFile(this)
6549

6650
extractFrames(inputVideo, frameFolder)
6751

@@ -76,11 +60,11 @@ class FFmpegActivity : AppCompatActivity() {
7660
}
7761

7862
binding.deleteFolder.setOnClickListener {
79-
Logger.v("delete folder = ${FFMpegTranscoder.deleteExtractedFrameFolder(frameFolder)}" )
63+
Logger.v("delete folder = ${FFMpegTranscoder.deleteExtractedFrameFolder(frameFolder)}")
8064
}
8165

8266
binding.deleteAll.setOnClickListener {
83-
Logger.v( "delete all = ${FFMpegTranscoder.deleteAllProcessFiles(this)}" )
67+
Logger.v("delete all = ${FFMpegTranscoder.deleteAllProcessFiles(this)}")
8468
}
8569
}
8670

@@ -97,15 +81,16 @@ class FFmpegActivity : AppCompatActivity() {
9781
extractFramesProgress.isVisible = true
9882
extractFramesProgress.setProgress(it.progress)
9983

100-
Logger.v( "Analyze $it" )
84+
Logger.v("Analyze $it")
10185

102-
output.text = "${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${output.text}"
86+
output.text =
87+
"${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${output.text}"
10388

10489
}, {
105-
Logger.v( "transcode fails ${it.message}")
90+
Logger.v("transcode fails ${it.message}")
10691
it.printStackTrace()
10792
}, {
108-
Logger.v( "transcode on complete ")
93+
Logger.v("transcode on complete ")
10994

11095
FFMpegTranscoder.stabilize(
11196
context = this@FFmpegActivity,
@@ -116,17 +101,18 @@ class FFmpegActivity : AppCompatActivity() {
116101
.observeOn(AndroidSchedulers.mainThread())
117102
.subscribe({
118103

119-
extractFramesProgress.isVisible =true
104+
extractFramesProgress.isVisible = true
120105
extractFramesProgress.setProgress(it.progress)
121106

122-
Logger.v( "Stabilize $it")
107+
Logger.v("Stabilize $it")
123108

124-
output.text = "${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${output.text}"
109+
output.text =
110+
"${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${output.text}"
125111

126112
}, {
127-
Logger.v( "transcode fails ${it.message}")
113+
Logger.v("transcode fails ${it.message}")
128114
it.printStackTrace()
129-
}, { Logger.v( "transcode on complete ") })
115+
}, { Logger.v("transcode on complete ") })
130116
.addTo(subscription)
131117
})
132118
.addTo(subscription)
@@ -136,7 +122,7 @@ class FFmpegActivity : AppCompatActivity() {
136122

137123
private fun extractFrames(inputVideo: Uri, frameFolder: Uri) {
138124

139-
Logger.v( "uri=${inputVideo.assetFileExists}")
125+
Logger.v("uri=${inputVideo.assetFileExists}")
140126

141127
binding.extractFrames.setOnClickListener {
142128

@@ -146,8 +132,10 @@ class FFmpegActivity : AppCompatActivity() {
146132
increment * it.toDouble()
147133
}
148134

149-
150-
extractByFFMpeg(inputVideo,frameFolder) //Uri.parse(copyAssetFileToCache("walkaround.mp4")!!.path)
135+
extractByFFMpeg(
136+
inputVideo,
137+
frameFolder
138+
) //Uri.parse(copyAssetFileToCache("walkaround.mp4")!!.path)
151139
//extactByMediaCodec(times, inputVideo, frameFolder)
152140

153141
}
@@ -156,16 +144,16 @@ class FFmpegActivity : AppCompatActivity() {
156144
private fun mergeFrames(frameFolder: Uri, outputVideo: Uri) {
157145

158146
binding.makeVideo.setOnClickListener {
159-
mergeByFFMpeg(frameFolder,outputVideo)
147+
mergeByFFMpeg(frameFolder, outputVideo)
160148
//mergeByMediaCodec(frameFolder, outputVideo)
161149
}
162150
}
163151

164152
private fun transcode(inputVideo: Uri, outputVideo: Uri) {
165153

166-
binding.transcodeVideo.setOnClickListener() {
154+
binding.transcodeVideo.setOnClickListener {
167155

168-
Logger.v( "transcode $inputVideo -> $outputVideo")
156+
Logger.v("transcode $inputVideo -> $outputVideo")
169157

170158
binding.output.text = ""
171159

@@ -177,20 +165,20 @@ class FFmpegActivity : AppCompatActivity() {
177165
.observeOn(AndroidSchedulers.mainThread())
178166
.subscribe({
179167

180-
Logger.v( "transcode $it")
168+
Logger.v("transcode $it")
181169

182170
}, {
183-
Logger.v( "transcode fails ${it.message}")
171+
Logger.v("transcode fails ${it.message}")
184172
it.printStackTrace()
185-
}, { Logger.v( "transcode on complete ") })
173+
}, { Logger.v("transcode on complete ") })
186174
.addTo(subscription)
187175
}
188176
}
189177

190178
//region ffmpeg
191179

192180
private fun extractByFFMpeg(inputVideo: Uri, frameFolder: Uri) {
193-
Logger.v( "extractFramesFromVideo $inputVideo -> $frameFolder")
181+
Logger.v("extractFramesFromVideo $inputVideo -> $frameFolder")
194182

195183
val increment = 63f / 120f
196184

@@ -200,31 +188,36 @@ class FFmpegActivity : AppCompatActivity() {
200188

201189
binding.output.text = ""
202190

203-
FFMpegTranscoder.extractFramesFromVideo(context = this, frameTimes = times.map { it.toString() }, inputVideo = inputVideo, id = "12345", outputDir = frameFolder)
191+
FFMpegTranscoder.extractFramesFromVideo(
192+
context = this,
193+
frameTimes = times.map { it.toString() },
194+
inputVideo = inputVideo,
195+
id = "12345",
196+
outputDir = frameFolder
197+
)
204198
.subscribeOn(Schedulers.io())
205199
.observeOn(AndroidSchedulers.mainThread())
206200
.subscribe({
207201

208202
binding.extractFramesProgress.isVisible = true
209203
binding.extractFramesProgress.setProgress(it.progress)
210204

211-
Logger.v( "extract frames $it")
212-
213-
binding.output.text = "${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
214-
205+
Logger.v("extract frames $it")
215206

207+
binding.output.text =
208+
"${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
216209
}, {
217-
Logger.v( "extracting frames fail ${it.message}")
210+
Logger.v("extracting frames fail ${it.message}")
218211

219212
it.printStackTrace()
220213
}, {
221-
Logger.v( "extractFramesFromVideo on complete")
214+
Logger.v("extractFramesFromVideo on complete")
222215
})
223216
.addTo(subscription)
224217
}
225218

226219
private fun mergeByFFMpeg(frameFolder: Uri, outputVideo: Uri) {
227-
Logger.v( "mergeFrames $frameFolder -> $outputVideo")
220+
Logger.v("mergeFrames $frameFolder -> $outputVideo")
228221

229222
binding.output.text = ""
230223

@@ -243,13 +236,14 @@ class FFmpegActivity : AppCompatActivity() {
243236
binding.mergeFramesProgress.isVisible = true
244237
binding.mergeFramesProgress.setProgress(it.progress)
245238

246-
Logger.v( "extract frames $it")
239+
Logger.v("extract frames $it")
247240

248-
binding.output.text = "${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
241+
binding.output.text =
242+
"${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
249243

250244
}, {
251-
Logger.v( "creating video fails ${it.message}")
252-
}, { Logger.v( "createVideoFromFrames on complete ") })
245+
Logger.v("creating video fails ${it.message}")
246+
}, { Logger.v("createVideoFromFrames on complete ") })
253247
.addTo(subscription)
254248
}
255249
//endregion
@@ -305,15 +299,16 @@ class FFmpegActivity : AppCompatActivity() {
305299
binding.mergeFramesProgress.isVisible = true
306300
binding.mergeFramesProgress.setProgress(it.progress)
307301

308-
Logger.v( "merge frames $it")
302+
Logger.v("merge frames $it")
309303

310-
binding.output.text = "${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
304+
binding.output.text =
305+
"${(it.duration / 1000f).roundToInt()} s ${it.message?.trimMargin()}\n${binding.output.text}"
311306

312307
}, {
313-
Logger.v( "creating video fails ${it.message}")
308+
Logger.v("creating video fails ${it.message}")
314309

315310
}, {
316-
Logger.v( "createVideoFromFrames on complete ")
311+
Logger.v("createVideoFromFrames on complete ")
317312
})
318313
.addTo(subscription)
319314

0 commit comments

Comments
 (0)