无法在android上将mp4文件与FFmpeg合并

时间:2014-12-01 03:03:13

标签: android android-ndk ffmpeg mp4

我在需要将多个mp4文件合并为一个应用程序的应用程序中使用https://github.com/hiteshsondhi88/ffmpeg-android-java

这是一个命令

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();
    }

}

和getRandomFile()

    public File getRandomFile() {
        if (captureDir != null) {
            if (captureDir.exists()) {

                SecureRandom random = new SecureRandom();
                File file = new File(captureDir, new BigInteger(130, random).toString(32) + ".mp4");
                return file;
            }
        }
        return null;
    }

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

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

任何想法?

3 个答案:

答案 0 :(得分:1)

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

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

file '/sdcard/blabla/v0.mp4'
file '/sdcard/blabla/v1.mp4'
file '/sdcard/blabla/v2.mp4'

然后你需要添加-safe 0 flag。

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()
    {
    }
}

答案 1 :(得分:0)

我刚刚完成了这件事。命令

ffmpeg -i "concat:file1.mp4|file2.mp4" 

不起作用。您必须将文件列表保存到文本文件中,然后触发:

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

尝试一下 - 我使用的是相同的库。

答案 2 :(得分:0)

很晚:但这个概念可能对寻求解决此类问题的人有所帮助 可能的原因可能是两个视频具有不同的采样率和帧速率。因此,您需要先将其转换或转码为相同的速率。之后您可以连接相应的视频。