diff --git a/android-ffmpeg/build.gradle b/android-ffmpeg/build.gradle index ad8a65e..b39f76d 100644 --- a/android-ffmpeg/build.gradle +++ b/android-ffmpeg/build.gradle @@ -22,11 +22,11 @@ ext { } android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 17 versionName "1.1.7" } diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArch.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArch.java deleted file mode 100644 index 77ddd8f..0000000 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArch.java +++ /dev/null @@ -1,5 +0,0 @@ -package nl.bravobit.ffmpeg; - -public enum CpuArch { - ARMv7, x86, NONE -} diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArchHelper.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArchHelper.java deleted file mode 100644 index ed63c82..0000000 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/CpuArchHelper.java +++ /dev/null @@ -1,25 +0,0 @@ -package nl.bravobit.ffmpeg; - -import android.os.Build; - -public class CpuArchHelper { - public static final String X86_CPU = "x86"; - public static final String X86_64_CPU = "x86_64"; - public static final String ARM_64_CPU = "arm64-v8a"; - public static final String ARM_V7_CPU = "armeabi-v7a"; - - public static CpuArch getCpuArch() { - Log.d("Build.CPU_ABI : " + Build.CPU_ABI); - - switch (Build.CPU_ABI) { - case X86_CPU: - case X86_64_CPU: - return CpuArch.x86; - case ARM_64_CPU: - case ARM_V7_CPU: - return CpuArch.ARMv7; - default: - return CpuArch.NONE; - } - } -} diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFmpeg.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFmpeg.java index 0adb87e..e5555c7 100644 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFmpeg.java +++ b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFmpeg.java @@ -11,9 +11,6 @@ import java.util.Map; public class FFmpeg implements FFbinaryInterface { - private static final int VERSION = 17; // up this version when you add a new ffmpeg build - private static final String KEY_PREF_VERSION = "ffmpeg_version"; - private final FFbinaryContextProvider context; private static final long MINIMUM_TIMEOUT = 10 * 1000; @@ -40,79 +37,21 @@ public Context provide() { @Override public boolean isSupported() { - // check if arch is supported - CpuArch cpuArch = CpuArchHelper.getCpuArch(); - if (cpuArch == CpuArch.NONE) { - Log.e("arch not supported"); - return false; - } - - // get ffmpeg file File ffmpeg = FileUtils.getFFmpeg(context.provide()); - - SharedPreferences settings = context.provide().getSharedPreferences("ffmpeg_prefs", Context.MODE_PRIVATE); - int version = settings.getInt(KEY_PREF_VERSION, 0); - - // check if ffmpeg file exists - if (!ffmpeg.exists() || version < VERSION) { - String prefix = "arm/"; - if (cpuArch == CpuArch.x86) { - prefix = "x86/"; - } - Log.d("file does not exist, creating it..."); - - try { - InputStream inputStream = context.provide().getAssets().open(prefix + "ffmpeg"); - if (!FileUtils.inputStreamToFile(inputStream, ffmpeg)) { - return false; - } - - Log.d("successfully wrote ffmpeg file!"); - - settings.edit().putInt(KEY_PREF_VERSION, VERSION).apply(); - } catch (IOException e) { - Log.e("error while opening assets", e); - return false; - } - } - - // check if ffmpeg can be executed if (!ffmpeg.canExecute()) { - // try to make executable - try { - try { - Runtime.getRuntime().exec("chmod -R 777 " + ffmpeg.getAbsolutePath()).waitFor(); - } catch (InterruptedException e) { - Log.e("interrupted exception", e); - return false; - } catch (IOException e) { - Log.e("io exception", e); - return false; - } - - if (!ffmpeg.canExecute()) { - // our last hope! - if (!ffmpeg.setExecutable(true)) { - Log.e("unable to make executable"); - return false; - } - } - } catch (SecurityException e) { - Log.e("security exception", e); - return false; - } + Log.e("ffmpeg cannot execute"); + return false; } - Log.d("ffmpeg is ready!"); - return true; } @Override public FFtask execute(Map environvenmentVars, String[] cmd, FFcommandExecuteResponseHandler ffmpegExecuteResponseHandler) { if (cmd.length != 0) { - String[] ffmpegBinary = new String[]{FileUtils.getFFmpeg(context.provide()).getAbsolutePath()}; - String[] command = concatenate(ffmpegBinary, cmd); + final String[] command = new String[cmd.length + 1]; + command[0] = FileUtils.getFFmpeg(context.provide()).getAbsolutePath(); + System.arraycopy(cmd, 0, command, 1, cmd.length); FFcommandExecuteAsyncTask task = new FFcommandExecuteAsyncTask(command, environvenmentVars, timeout, ffmpegExecuteResponseHandler); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); return task; @@ -121,18 +60,6 @@ public FFtask execute(Map environvenmentVars, String[] cmd, FFco } } - private static T[] concatenate(T[] a, T[] b) { - int aLen = a.length; - int bLen = b.length; - - @SuppressWarnings("unchecked") - T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen + bLen); - System.arraycopy(a, 0, c, 0, aLen); - System.arraycopy(b, 0, c, aLen, bLen); - - return c; - } - @Override public FFtask execute(String[] cmd, FFcommandExecuteResponseHandler ffmpegExecuteResponseHandler) { return execute(null, cmd, ffmpegExecuteResponseHandler); diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFprobe.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFprobe.java index b1002d2..0b66637 100644 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFprobe.java +++ b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFprobe.java @@ -11,8 +11,6 @@ import java.util.Map; public class FFprobe implements FFbinaryInterface { - private static final int VERSION = 17; // up this version when you add a new ffprobe build - private static final String KEY_PREF_VERSION = "ffprobe_version"; private final FFbinaryContextProvider context; @@ -40,79 +38,21 @@ public Context provide() { @Override public boolean isSupported() { - // check if arch is supported - CpuArch cpuArch = CpuArchHelper.getCpuArch(); - if (cpuArch == CpuArch.NONE) { - Log.e("arch not supported"); + File fFprobe = FileUtils.getFFprobe(context.provide()); + if (!fFprobe.canExecute()) { + Log.e("ffprobe cannot execute"); return false; } - - // get ffprobe file - File ffprobe = FileUtils.getFFprobe(context.provide()); - - SharedPreferences settings = context.provide().getSharedPreferences("ffmpeg_prefs", Context.MODE_PRIVATE); - int version = settings.getInt(KEY_PREF_VERSION, 0); - - // check if ffprobe file exists - if (!ffprobe.exists() || version < VERSION) { - String prefix = "arm/"; - if (cpuArch == CpuArch.x86) { - prefix = "x86/"; - } - Log.d("file does not exist, creating it..."); - - try { - InputStream inputStream = context.provide().getAssets().open(prefix + "ffprobe"); - if (!FileUtils.inputStreamToFile(inputStream, ffprobe)) { - return false; - } - - Log.d("successfully wrote ffprobe file!"); - - settings.edit().putInt(KEY_PREF_VERSION, VERSION).apply(); - } catch (IOException e) { - Log.e("error while opening assets", e); - return false; - } - } - - // check if ffprobe can be executed - if (!ffprobe.canExecute()) { - // try to make executable - try { - try { - Runtime.getRuntime().exec("chmod -R 777 " + ffprobe.getAbsolutePath()).waitFor(); - } catch (InterruptedException e) { - Log.e("interrupted exception", e); - return false; - } catch (IOException e) { - Log.e("io exception", e); - return false; - } - - if (!ffprobe.canExecute()) { - // our last hope! - if (!ffprobe.setExecutable(true)) { - Log.e("unable to make executable"); - return false; - } - } - } catch (SecurityException e) { - Log.e("security exception", e); - return false; - } - } - Log.d("ffprobe is ready!"); - return true; } @Override public FFtask execute(Map environvenmentVars, String[] cmd, FFcommandExecuteResponseHandler ffcommandExecuteResponseHandler) { if (cmd.length != 0) { - String[] ffprobeBinary = new String[]{FileUtils.getFFprobe(context.provide()).getAbsolutePath()}; - String[] command = concatenate(ffprobeBinary, cmd); + final String[] command = new String[cmd.length + 1]; + command[0] = FileUtils.getFFmpeg(context.provide()).getAbsolutePath(); + System.arraycopy(cmd, 0, command, 1, cmd.length); FFcommandExecuteAsyncTask task = new FFcommandExecuteAsyncTask(command, environvenmentVars, timeout, ffcommandExecuteResponseHandler); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); return task; @@ -121,18 +61,6 @@ public FFtask execute(Map environvenmentVars, String[] cmd, FFco } } - private static T[] concatenate(T[] a, T[] b) { - int aLen = a.length; - int bLen = b.length; - - @SuppressWarnings("unchecked") - T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen + bLen); - System.arraycopy(a, 0, c, 0, aLen); - System.arraycopy(b, 0, c, aLen, bLen); - - return c; - } - @Override public FFtask execute(String[] cmd, FFcommandExecuteResponseHandler ffcommandExecuteResponseHandler) { return execute(null, cmd, ffcommandExecuteResponseHandler); diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FileUtils.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FileUtils.java index b0c40bc..a3ca23c 100644 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FileUtils.java +++ b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FileUtils.java @@ -14,31 +14,12 @@ class FileUtils { private static final String FFPROBE_FILE_NAME = "ffprobe"; static File getFFmpeg(Context context) { - File folder = context.getFilesDir(); + File folder = new File(context.getApplicationInfo().nativeLibraryDir); return new File(folder, FFMPEG_FILE_NAME); } static File getFFprobe(Context context) { - File folder = context.getFilesDir(); + File folder = new File(context.getApplicationInfo().nativeLibraryDir); return new File(folder, FFPROBE_FILE_NAME); } - - static boolean inputStreamToFile(InputStream stream, File file) { - try { - InputStream input = new BufferedInputStream(stream); - OutputStream output = new FileOutputStream(file); - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { - output.write(buffer, 0, bytesRead); - } - output.flush(); - output.close(); - input.close(); - return true; - } catch (IOException e) { - Log.e("error while writing ff binary file", e); - } - return false; - } } \ No newline at end of file diff --git a/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffmpeg b/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffmpeg new file mode 100755 index 0000000..903d3d0 Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffmpeg differ diff --git a/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffprobe b/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffprobe new file mode 100755 index 0000000..7f5d928 Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/arm64-v8a/ffprobe differ diff --git a/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffmpeg b/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffmpeg new file mode 100755 index 0000000..903d3d0 Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffmpeg differ diff --git a/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffprobe b/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffprobe new file mode 100755 index 0000000..7f5d928 Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/armeabi-v7a/ffprobe differ diff --git a/android-ffmpeg/src/main/resources/lib/x86/ffmpeg b/android-ffmpeg/src/main/resources/lib/x86/ffmpeg new file mode 100755 index 0000000..1f3d135 Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/x86/ffmpeg differ diff --git a/android-ffmpeg/src/main/resources/lib/x86/ffprobe b/android-ffmpeg/src/main/resources/lib/x86/ffprobe new file mode 100755 index 0000000..b9d6b8a Binary files /dev/null and b/android-ffmpeg/src/main/resources/lib/x86/ffprobe differ diff --git a/sample/build.gradle b/sample/build.gradle index 00149f5..15448dc 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "nl.bravobit.ffmpeg.example" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 1 versionName "1.0.1" }