【问题标题】:Concat video files with ffmpeg-android使用 ffmpeg-android 连接视频文件
【发布时间】:2019-01-04 12:27:02
【问题描述】:

我正在使用ffmpeg-android 连接两个视频文件,但是连接需要很长时间,我猜是因为使用了"-filter_complex",但这是我在互联网上找到的唯一命令,请有人简化以下命令?我只想拼接camera2 api 捕获的两个视频文件,不做任何修改。

 String command[] = new String[]{
                        "-y",
                        "-i", firstPath,
                        "-i", secondPath,
                        "-strict",
                        "experimental",
                        "-filter_complex",
                        "[0:v]scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
                                "pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih)," +
                                "pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
                        "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264", "-crf", "27", "-q", "4", "-preset", "ultrafast", getVideoFilePath(getActivity())};
                commandFFMPEG(command);


 private void commandFFMPEG(String command[]) {
        FFmpeg ffmpeg = FFmpeg.getInstance(getActivity());
        try {
            ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {

                @Override
                public void onStart() {
                    startTime = System.currentTimeMillis();
                }

                @Override
                public void onProgress(String message) {

                }

                @Override
                public void onFailure(String message) {

                }

                @Override
                public void onSuccess(String message) {
                    long endTime = System.currentTimeMillis();
                    long result = endTime - startTime;
                    Toast.makeText(getActivity(), "Videos are merged", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFinish() {

                }
            });
        } catch (FFmpegCommandAlreadyRunningException e) {
            // Handle if FFmpeg is already running
        }
    }

【问题讨论】:

标签: android ffmpeg android-ffmpeg


【解决方案1】:

Idk 会帮助你,但是当我想用 ffmpeg 连接视频时,我使用了这个命令:

StringBuilder builder = new StringBuilder();
builder.append("-f ");
builder.append("concat ");
builder.append("-safe 0 ");
builder.append("-i ");
final String tempFile = getTextFile().getAbsolutePath();//it is text file with video files paths
builder.append(tempFile);
builder.append(" ");
builder.append("-c ");
builder.append("copy ");
builder.append(saveFile);// saveFile - it is your output file

无论如何,总时长为 20 秒的串联视频需要大约 20 秒来处理。你可以看一下here,我写了它是为了串联几个视频,但是代码质量很糟糕,我不知道,你会明白那里的东西。 希望对你有帮助)

【讨论】:

  • 谢谢你的回答,但我在 onFailure 中得到[concat @ 0xf4627000] Impossible to open '/storage/emulated/0/Android/data/com.example.user.camerademo/files/null' /storage/emulated/0/Android/data/com.example.user.camerademo/files/inputFiles.txt: No such file or directory
  • 你看到我在 git repo 中是如何做 getTextFile() 的了吗?或者像以前一样尝试同样的事情,没有任何文本文件,但使用 -i firstFile -i secondFile
  • 是的,我复制了相同的方法并给出了我的文件路径数组,例如/storage/emulated/0/Android/data/com.example.user.camerademo/files/1532695230219.mp4
  • 然后用 2 -i 尝试你的第一种方法,我是在文本文件中完成的,因为我可以有不同数量的视频
  • 好的,你能告诉我我应该在`“-i”,secondPath,`之后添加什么
【解决方案2】:

String cmd[] = new String[]{ "-y","-i", "vid.mp4", "i", "vid2.mp4", "-preset", "ultrafast", "- filter_complex", "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]","-map", "[v]","-map","[a]","/output.mp4"};

  • 这对我有用!
  • 使用的媒体格式:mp4
  • 两个视频的尺寸相同 - 320x240(必需)

使用的 ffmpeg 库:com.writingminds:FFmpegAndroid:0.3.2

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多