在Android Q中,FFMPEG命令无法正常工作。

11
尝试使用此命令合并两个音频文件,但在针对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:9192019-09-28 13:48:32.146 16041-16041/com.merger.cut E/FFMPEG :: on finish

请给我解决上述问题的方案。


如果有人有解决方案,请帮忙解决相同的问题。 - Makvin
您可能会受到新的托管作用域访问的影响。https://developer.android.com/training/data-storage/files/external-scoped - Stephen Quan
1
你是否正在使用这个库:nl.bravobit:android-ffmpeg:1.1.1 或其他,请在此处提及。 - Viral Patel
有错误日志吗?请在此处发布您的FFmpeg错误日志。 - Vinesh Chauhan
我已经发布了一个修复程序,但它不能解决所有在Android 10及更高版本上的问题。 - Alex Cohn
显示剩余2条评论
4个回答

9

如果您正在寻找适用于Android Q的FFMPEG,请使用以下FFMPEG构建链接。将其包含到app/build.gradle中。

最低SDK版本为24。

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

最低SDK版本为16

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

OnePlus 7T上进行测试
运行Android Q操作系统


1
库的大小太大。 - Tushar Lathiya
@TusharLathiya 你可以使用aab文件来生成apk。 - Vinesh Chauhan
目前,我们没有替代方案。 - Vinesh Chauhan
1
你可以使用其中一个较小的软件包代替-full - Alex Cohn
我正在使用 'com.arthenica:mobile-ffmpeg-full:4.2.2.LTS',但在构建时出现以下错误:'Manifest merger failed : Attribute application@appComponentFactory value=(androidx) from AndroidManifest.xml:10:9-47 在 [androidx.core:core:1.3.2] AndroidManifest.xml:24:18-86 value=(androidx.core.app.CoreComponentFactory) 中也存在。建议:在 AndroidManifest.xml 的 <application> 元素中添加 'tools:replace="android:appComponentFactory"' 以覆盖。' - Morteza Khodaie
请在应用程序标签中添加此行代码:tools:replace="android:appComponentFactory"。 - Vinesh Chauhan

0

1
我已经尝试过了,但是当目标指向29时它不起作用,而我想要在29中起作用。 - Krupali Shingala

0

使用这个代替 链接

implementation 'com.arthenica:ffmpeg-kit-video:5.1.LTS'

0

请使用这个库

implementation 'com.arthenica:mobile-ffmpeg-full-gpl:4.2.2.LTS'

它的效果很好。如果有任何疑问,请告诉我。谢谢

这就是我使用它的方式

private class CompressVideo extends AsyncTask<String, String, Integer> {

    String oldPath;
    File newFile;
    int videoLength;

    CompressVideo(String oldPath, File newFile, int VideoLength) {
        this.newFile = newFile;
        this.oldPath = oldPath;
        this.videoLength = VideoLength;
        rvProgressBar.setVisibility(View.VISIBLE);
        tvProgressPercentage.setVisibility(View.VISIBLE);
        Config.enableStatisticsCallback(statistics -> {
            runOnUiThread(() -> tvProgressPercentage.setText((statistics.getTime() * 100) / videoLength + "%"));
        });
    }

    @Override
    protected void onPreExecute() {
        setClickable(rlMainLayout, false);
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(String... strings) {
        String cmd = "-y -i " + oldPath + " -c:a copy -r 30 -vcodec libx264 -crf 28 -preset ultrafast " + newFile.getPath();
        int rc = FFmpeg.execute(cmd);
        return rc;
    }

    @Override
    protected void onPostExecute(Integer rc) {
        setClickable(rlMainLayout, true);
        if (rc == RETURN_CODE_SUCCESS) {
            videoCount++;
            path.add(newFile.getPath());
            mediaType.add(Constants.TAG_VIDEO);
            al.add(Uri.fromFile(newFile));
            vehicleNewImageAdapter.notifyDataSetChanged();
            rvProgressBar.setVisibility(View.GONE);
            tvProgressPercentage.setVisibility(View.GONE);
        } else if (rc == RETURN_CODE_CANCEL) {
            rvProgressBar.setVisibility(View.GONE);
            tvProgressPercentage.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), getString(R.string.oops_something_went_wrong), Toast.LENGTH_SHORT).show();
        } else {
            rvProgressBar.setVisibility(View.GONE);
            tvProgressPercentage.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), getString(R.string.oops_something_went_wrong), Toast.LENGTH_SHORT).show();
        }
        super.onPostExecute(rc);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接