Can';t在android上将mp4文件与FFmpeg合并

Can';t在android上将mp4文件与FFmpeg合并,android,android-ndk,ffmpeg,mp4,Android,Android Ndk,Ffmpeg,Mp4,我在一个需要将多个mp4文件合并为一个文件的应用程序中使用 这是命令 ffmpeg -i concat:"/data/data/com.testapp.app/cache:temp/lds82df9skov65i15k3ct16cik.mp4|/data/data/com.testapp.app/cache:temp/qm5s0utmb8c1gbhch6us2tnilo.mp4" -codec copy /data/data/com.testapp.app/cache:temp/4egqallu

我在一个需要将多个mp4文件合并为一个文件的应用程序中使用

这是命令

ffmpeg -i concat:"/data/data/com.testapp.app/cache:temp/lds82df9skov65i15k3ct16cik.mp4|/data/data/com.testapp.app/cache:temp/qm5s0utmb8c1gbhch6us2tnilo.mp4" -codec copy /data/data/com.testapp.app/cache:temp/4egqalludvs03tnfleu5dgb6iv.mp4
java方法来附加文件,电影文件是一个数组,它包含我想要组合的文件

public void appendFiles() {

    showProgressDialog();

    movieFile = getRandomFile();

    StringBuilder b = new StringBuilder();

    try {

        for (int i = 0; i < movieFiles.size(); i++) {

            File f = movieFiles.get(i);

            if (!f.exists()) {
                continue;
            }

            if(i != 0){
                b.append("|");
            }

            b.append(f.getPath());


        }

        final String command = "-i concat:\""+b.toString() + "\" -codec copy " + movieFile.getPath();



        try {
            ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
                @Override
                public void onFailure(String s) {
                    app.log("FAILED with output : " + s);
                }

                @Override
                public void onSuccess(String s) {
                    app.log("SUCCESS with output : " + s);

                    createThumbnail();

                    stopProgressDialog();

                    startReview();
                }

                @Override
                public void onProgress(String s) {
                    app.log("Started command : ffmpeg " + command);

                }

                @Override
                public void onStart() {

                    app.log("Started command : ffmpeg " + command);

                }

                @Override
                public void onFinish() {
                    app.log("Finished command : ffmpeg " + command);

                }
            });
        }
        catch (FFmpegCommandAlreadyRunningException e) {
            e.printStackTrace();
        }


    }

    catch (Exception e) {
        e.printStackTrace();
    }

}
但我一直看到错误,没有这样的文件或目录

concat:“/data/data/com.testapp.app/cache:temp/lds82df9skov65i15k3ct16cik.mp4 |/data/data/com.testapp.app/cache:temp/qm5s0utmb8c1gbhch6us2tnilo.mp4”:没有这样的文件或目录


有什么想法吗?

我刚做完这件事。命令

ffmpeg -i "concat:file1.mp4|file2.mp4" 
不行。您必须将文件列表保存到文本文件中,然后启动:

ffmpeg -f concat -i list.txt -c:v copy -c:a copy result.mp4

试试看-我使用的是同一个库。

您可以使用以下命令。 ffmpeg-f concat-i list.txt-c:v copy-c:a copy result.mp4

但如果您将文件的完整路径存储在list.txt文件中,如

file '/sdcard/blabla/v0.mp4'
file '/sdcard/blabla/v1.mp4'
file '/sdcard/blabla/v2.mp4'
然后需要添加-safe0标志

ffmpeg -f concat -safe 0 -i list.txt -c:v copy -c:a copy result.mp4
在您使用的库中的用法如下:

String[] cmd = new String[]{"-f", "concat", "-safe", "0", "-i", "list.txt", "-c", "copy", "-preset", "ultrafast", outFile};

ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler()
{

    @Override
    public void onFailure(String message)
    {
    }
    @Override
    public void onSuccess(String message)
    {
    }
    @Override
    public void onProgress(String message)
    {
    }

    @Override
    public void onStart()
    {
    }

    @Override
    public void onFinish()
    {
    }
}

已经很晚了:但这个概念可能对寻求此类问题解决方案的人有所帮助。

可能的原因可能是这两个视频的采样率和帧速率不同。因此,您需要首先将其转换或转码为相同的速率。之后,您可以连接相应的视频。

您是否碰巧使其工作正常?请查看我的答案
String[] cmd = new String[]{"-f", "concat", "-safe", "0", "-i", "list.txt", "-c", "copy", "-preset", "ultrafast", outFile};

ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler()
{

    @Override
    public void onFailure(String message)
    {
    }
    @Override
    public void onSuccess(String message)
    {
    }
    @Override
    public void onProgress(String message)
    {
    }

    @Override
    public void onStart()
    {
    }

    @Override
    public void onFinish()
    {
    }
}