FFMPEG命令在Android Q中不起作用

时间:2019-09-28 04:32:58

标签: android ffmpeg android-ffprobe

尝试使用此命令合并两个音频文件,但在定位sdk 29 时,该命令在Android 10.0(Q)中不起作用。 但是,此命令完全可以用于将sdk 24定位为28

我正在使用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

为上述问题提供解决方案。

3 个答案:

答案 0 :(得分:5)

现在,如果您正在寻找用于ANDROID Q的FFMPEG,这是FFMPEG Build下面的链接使用。将此添加到您的 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'
}

OnePlus 7T 中进行了测试
Android Q

答案 1 :(得分:0)

没有官方文档。

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

但是您可以使用以下方法测试您的应用

看来linux DAC和SE-Android都在阻止您的应用程序进程访问“ su”可执行文件。

检查系统是否在强制模式下运行,这表示已启用SE-Android。如果确实如此,可以通过运行以下命令暂时将其禁用:

adb root

   adb shell setenforce 0

这将禁用SE-Android,并且不会阻止应用进程执行'su'。

因此您可以执行ffmpeg

此外,您的应用可能没有以root用户身份启动“ su”所需的DAC权限。您可以执行以下命令:

adb shell ps

有关设备上所有正在运行的进程的列表。找到您的应用程序(通过搜索其程序包名称),然后检查其组和uid。可能都不是根。

请注意,构建自定义的userdebug映像与生根标准的Android设备完全不同。调试版本的目的是允许访问设备的内部,同时仍然在启用所有默认安全机制的情况下模拟真实功能的设备。

答案 2 :(得分:0)

该库仅支持最大sdk 28,请参见以下链接:

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

因此,在该库中,由于targetSdkVersion 28compileSdkVersion 28不能在SDK 29中运行。如果您想更改此东西,它将为您工作。希望对您有帮助。