web-dev-qa-db-fra.com

Les commandes FFMPEG ne fonctionnent pas dans Android Q

Essayez cette commande pour fusionner deux fichiers audio, mais cela ne fonctionne pas dans Android 10.0 (Q) tandis que ciblant sdk 29. Mais, cette commande fonctionne complètement sur - ciblant les SDK 24 à 28.

J'utilise cette bibliothèque d'implémentation FFMPEG 'nl.bravobit: Android-ffmpeg: 1.1.7'

"-y", "-i", path1, "-i", path2, "-filter_complex", "[0:0][1:0] amix=inputs=2:duration=longest", "-c:a", "libmp3lame", savedPath

my Error log:
2019-09-28 13:48:32.037 16041-16166/com.merger.cut E/FFmpeg: Exception while trying to run: [/data/user/0/com..merger.cut/files/ffmpeg, -y, -i, /storage/emulated/0/Music/song1.mp3, -i, /storage/emulated/0/Music/song2.mp3, -filter_complex, [0:0][1:0] amix=inputs=2:duration=longest, -c:a, libmp3lame, /storage/emulated/0/merger/Merge_1569658695254.mp3]
    Java.io.IOException: Cannot run program "/data/user/0/com.merger.cut/files/ffmpeg": error=13, Permission denied
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1050)
        at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.Java:15)
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:43)
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:12)
        at Android.os.AsyncTask$3.call(AsyncTask.Java:378)
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1167)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:641)
        at Java.lang.Thread.run(Thread.Java:919)
     Caused by: Java.io.IOException: error=13, Permission denied
        at Java.lang.UNIXProcess.forkAndExec(Native Method)
        at Java.lang.UNIXProcess.<init>(UNIXProcess.Java:133)
        at Java.lang.ProcessImpl.start(ProcessImpl.Java:141)
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1029)
        at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.Java:15) 
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:43) 
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:12) 
        at Android.os.AsyncTask$3.call(AsyncTask.Java:378) 
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:266) 
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1167) 
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:641) 
        at Java.lang.Thread.run(Thread.Java:919) 
2019-09-28 13:48:32.146 16041-16041/com.merger.cut E/FFMPEG :: on finish

Donnez-moi une solution au problème ci-dessus.

6
Krupali Shingala

Maintenant, si vous cherchez FFMPEG pour Android Q Voici l'utilisation du lien ci-dessous FFMPEG Build. Incluez-le dans votre app/build.gradle

Min SDK 24

  dependencies {
        implementation 'com.arthenica:mobile-ffmpeg-full:4.3'
    }

Min SDK 16

dependencies {
    implementation 'com.arthenica:mobile-ffmpeg-full:4.2.2.LTS'
}

testé dans OnePlus 7T
Android Q

2
Vinesh Chauhan

Il n'y a pas de documentation officielle.

https://www.reddit.com/r/androiddev/comments/b2inbu/psa_Android_q_blocks_executing_binaries_in_your/

Mais vous pouvez utiliser la méthode ci-dessous pour tester votre application

Il semble que Linux DAC et SE-Android bloquent le processus de votre application d'accéder à l'exécutable "su".

Vérifiez si votre système fonctionne en mode forcé, ce qui signifie que SE-Android est activé. Si tel est effectivement le cas, vous pouvez le désactiver temporairement en exécutant:

adb root

   adb Shell setenforce 0

Cela désactivera SE-Android et n'empêchera pas le processus des applications d'exécuter "su".

Vous pouvez donc exécuter ffmpeg

En outre, votre application peut ne pas disposer des autorisations DAC nécessaires pour lancer "su" en tant que root. Vous pouvez exécuter la commande suivante:

adb Shell ps

Pour une liste de tous les processus en cours d'exécution sur votre appareil. localisez votre application (en recherchant son nom de package) et vérifiez son groupe et son uid. Probablement ni l'un ni l'autre ne sont root.

Veuillez noter que la création d'une image de userdebug personnalisée n'est pas tout à fait comme le rootage d'un appareil standard Android. La version de débogage est destinée à permettre l'accès aux composants internes de l'appareil tout en simulant un appareil fonctionnant réellement avec tous ses mécanismes de sécurité par défaut activés.

0
Vinesh Chauhan

Pour cette bibliothèque ne prend en charge que le maximum de SDK 28, voir le lien ci-dessous:

https://github.com/bravobit/FFmpeg-Android/blob/master/Android-ffmpeg/build.gradle

Donc, dans cette bibliothèque pas exécuté dans le SDK 29 parce que le targetSdkVersion 28 et compileSdkVersion 28. Si vous voulez changer cette chose, cela fonctionnera pour vous. J'espère que cela vous aidera ..!

0
Viral Patel