From 966958cb6e809228ffd6bfca01d5f78ad9d771fd Mon Sep 17 00:00:00 2001 From: bayu Date: Thu, 30 Dec 2021 16:56:28 +0700 Subject: [PATCH] - add percent progress - using min-gpl library --- README.md | 8 +- .../compressingvideo/MainActivity.kt | 5 +- inno-video-converter/build.gradle | 3 +- .../innovideoconverter/InnoVideoConverter.kt | 108 ++++++++++-------- .../innovideoconverter/InnoVideoScale.kt | 6 +- 5 files changed, 73 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index eaaf9ad..3f83324 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ class MainActivity : AppCompatActivity() { private fun initInnoVideoConverter() { innoVideoConverter = InnoVideoConverter(this, object : InnoVideoConverterCallback { - override fun onProgress(progress: Boolean) { + override fun onProgress(progress: Boolean, percent: Double) { } override fun onSuccessConverted(message: String, newUriFileConverted: String) { @@ -78,7 +78,11 @@ class MainActivity : AppCompatActivity() { 2. Call the function of convert filter as you need from object innoVideoConverter. ```kotlin - innoVideoConverter.convertFilterPixelFormat(fileUriVideo, "yuv444p") + innoVideoConverter.compressVideoQuality( + fileUriVideo, + QualityOption.LOW, + InnoVideoScale(-2, 720) + ) ``` ## License diff --git a/app/src/main/java/id/mncinnovation/compressingvideo/MainActivity.kt b/app/src/main/java/id/mncinnovation/compressingvideo/MainActivity.kt index 2f0c4a2..dac7269 100644 --- a/app/src/main/java/id/mncinnovation/compressingvideo/MainActivity.kt +++ b/app/src/main/java/id/mncinnovation/compressingvideo/MainActivity.kt @@ -120,7 +120,7 @@ class MainActivity : AppCompatActivity() { innoVideoConverter.compressVideoQuality( fileUriVideo, QualityOption.LOW, - InnoVideoScale(-1, 720) + InnoVideoScale(-2, 720) ) } } @@ -135,7 +135,8 @@ class MainActivity : AppCompatActivity() { private fun initInnoVideoConverter() { innoVideoConverter = InnoVideoConverter(this, object : InnoVideoConverterCallback { - override fun onProgress(progress: Boolean) { + override fun onProgress(progress: Boolean, percent : Double) { + Log.e(InnoVideoConverter.TAG, "percentProgress $percent") if (progress) { binding.btnCancel.visibility = View.VISIBLE binding.tvStateProcess.text = "Compressing file" diff --git a/inno-video-converter/build.gradle b/inno-video-converter/build.gradle index 2ef1841..7450186 100644 --- a/inno-video-converter/build.gradle +++ b/inno-video-converter/build.gradle @@ -35,7 +35,8 @@ android { } dependencies { - implementation 'com.arthenica:ffmpeg-kit-full:4.5.LTS' + implementation 'com.arthenica:ffmpeg-kit-min-gpl:4.5.LTS' + implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'com.google.android.material:material:1.4.0' diff --git a/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoConverter.kt b/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoConverter.kt index 625b877..141d383 100644 --- a/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoConverter.kt +++ b/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoConverter.kt @@ -1,6 +1,7 @@ package com.mncgroup.innovideoconverter import android.app.Activity +import android.media.MediaPlayer import android.net.Uri import android.util.Log import com.arthenica.ffmpegkit.FFmpegKit @@ -30,16 +31,15 @@ class InnoVideoConverter( val inputFile = FFmpegKitConfig.getSafParameterForRead(activity, fileUriVideo) val file = getFileCacheDir() val crf = when (qualityOption) { - QualityOption.ULTRA_HIGH -> "0" - QualityOption.VERY_HIGH -> "10" - QualityOption.HIGH -> "18" + QualityOption.VERY_HIGH -> "17" + QualityOption.HIGH -> "20" QualityOption.MEDIUM -> "23" - QualityOption.LOW -> "28" - QualityOption.VERY_LOW -> "33" + QualityOption.LOW -> "25" + QualityOption.VERY_LOW -> "28" } val exe = "-y -i " + inputFile + " -vf scale=${scale.width}:${scale.height} -preset veryfast -crf $crf " + file.absolutePath - executeCommandAsync(exe, file.absolutePath) + executeCommandAsync(fileUriVideo, exe, file.absolutePath) } /** @@ -54,60 +54,72 @@ class InnoVideoConverter( return File(folder, System.currentTimeMillis().toString() + ".mp4") } - private fun executeCommandAsync(command: String, filePath: String) { - callback.onProgress(true) - FFmpegKit.executeAsync(command, - { session -> - val state = session.state - val returnCode = session.returnCode - // CALLED WHEN SESSION IS EXECUTED - Log.d( - TAG, - java.lang.String.format( - "FFmpeg process exited with state %s and rc %s.%s", - state, - returnCode, - session.failStackTrace + private fun executeCommandAsync(fileUriVideo: Uri, command: String, filePath: String) { + try { + val duration = MediaPlayer.create(activity, fileUriVideo).duration.toDouble() + + callback.onProgress(true, 0.0) + FFmpegKit.executeAsync(command, + { session -> + val state = session.state + val returnCode = session.returnCode + // CALLED WHEN SESSION IS EXECUTED + Log.d( + TAG, + java.lang.String.format( + "FFmpeg process exited with state %s and rc %s.%s", + state, + returnCode, + session.failStackTrace + ) ) - ) - activity.runOnUiThread { - callback.onProgress(false) + activity.runOnUiThread { + callback.onProgress(false, 100.0) - when { - returnCode.isSuccess -> { - callback.onSuccessConverted( - "Success compressed", - filePath - ) - } - returnCode.isError -> { - callback.onErrorConvert( - "Error compress. ${session.logsAsString}" - ) - } - else -> { - callback.onCanceledConvert( - "Canceled compress by user" - ) + when { + returnCode.isSuccess -> { + callback.onSuccessConverted( + "Success compressed", + filePath + ) + } + returnCode.isError -> { + callback.onErrorConvert( + "Error compress. ${session.logsAsString}" + ) + } + else -> { + callback.onCanceledConvert( + "Canceled compress by user" + ) + } } } + }, { + // CALLED WHEN SESSION PRINTS LOGS + if (BuildConfig.DEBUG) { + Log.i(TAG, "LOG : ${it.message}") + } + }) { + // CALLED WHEN SESSION GENERATES STATISTICS + activity.runOnUiThread { + val percent: Double = (it.time.toDouble() / duration) * 100 + callback.onProgress(true, percent) } - }, { - // CALLED WHEN SESSION PRINTS LOGS if (BuildConfig.DEBUG) { - Log.i(TAG, "LOG : ${it.message}") + Log.i(TAG, "STATS : $it") } - }) { - // CALLED WHEN SESSION GENERATES STATISTICS - if (BuildConfig.DEBUG) { - Log.i(TAG, "STATS : $it") } + } catch (e: Exception) { + callback.onErrorConvert(e.message ?: e.localizedMessage ?: e.toString()) + e.printStackTrace() } + } } interface InnoVideoConverterCallback { - fun onProgress(progress: Boolean) + fun onProgress(progress: Boolean, percent: Double) fun onSuccessConverted(message: String, newUriFileConverted: String) fun onErrorConvert(message: String) fun onCanceledConvert(message: String) @@ -120,10 +132,8 @@ interface InnoVideoConverterCallback { * [MEDIUM] for medium quality of video * [HIGH] for high quality of video. * [VERY_HIGH] for very high quality of video. - * [ULTRA_HIGH] for ultra high quality of video. */ enum class QualityOption { - ULTRA_HIGH, VERY_HIGH, HIGH, MEDIUM, diff --git a/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoScale.kt b/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoScale.kt index 948f387..f733636 100644 --- a/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoScale.kt +++ b/inno-video-converter/src/main/java/com/mncgroup/innovideoconverter/InnoVideoScale.kt @@ -2,11 +2,11 @@ package com.mncgroup.innovideoconverter /** * scale video - * @property width scale widht of video, set -1 will tell app to automatically choose the correct width. - * @property height scale height of video, set -1 will tell app to automatically choose the correct height. + * @property width scale widht of video, set -2 will tell app to automatically choose the correct width. + * @property height scale height of video, set -2 will tell app to automatically choose the correct height. * * Example scale: - * -1:720 : will tell app to scale height to 720 and thw width will automatically choose the correct width + * -2:720 : will tell app to scale height to 720 and thw width will automatically choose the correct width */ class InnoVideoScale( var width: Int,