Concat видеофайлы с ffmpeg-android

Я использую ffmpeg-android для объединения двух видеофайлов, но объединение занимает слишком много времени, и я предполагаю, что это из-за использования "-filter_complex", но это была единственная команда, которую я нашел в Интернете, может кто-нибудь упростить приведенную ниже команду? Я просто хочу объединить два видеофайла, захваченных API-интерфейсом camera2, без каких-либо изменений.

 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
        }
    }

возможный дубликат этого: stackoverflow.com/a/20358243/2919483, надеюсь, это поможет вам

Rajshree Tiwari 27.07.2018 13:31
2
1
901
2

Ответы 2

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 секунд. Можете посмотреть здесь, я написал его для конкатенации нескольких роликов, но качество кода ужасное, не знаю, поймете ли вы что-то там. Надеюсь, это вам поможет)

Спасибо за ответ, но я получаю [concat @ 0xf4627000] Impossible to open '/storage/emulated/0/Android/data/com.example.user.cameradem‌​o/files/null' /storage/emulated/0/Android/data/com.example.user.camerademo‌​/files/inputFiles.tx‌​t: No such file or directory в onFailure

Katy Colins 27.07.2018 14:41

Вы видели, как я сделал getTextFile () в репозитории git и сделал то же самое? Или попробуйте то же самое, что и раньше, без текстового файла, но с -i firstFile -i secondFile

H.Taras 27.07.2018 14:43

Да, я скопировал тот же метод и дал свой массив путей к файлам, например. /storage/emulated/0/Android/data/com.example.user.camerademo‌ / files / 1532695230219‌ .mp4

Katy Colins 27.07.2018 14:47

Затем попробуйте свой первый подход с 2 -i, я сделал это в текстовом файле, потому что у меня могло быть другое количество видео.

H.Taras 27.07.2018 14:50

Хорошо, не могли бы вы сказать мне, что я должен добавить после `" -i ", secondPath,`

Katy Colins 27.07.2018 14:56

-i pathToYourVideoFile (или AbsolutePath не помню) - он скажет ffmpeg, чтобы получить этот файл в качестве входных данных. Вы использовали его "-i", firstPath, "-i", secondPath, в своем вопросе

H.Taras 27.07.2018 15:01

Позвольте нам продолжить обсуждение в чате.

Katy Colins 27.07.2018 15:02

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]», «- карта», «[v ] "," - карта "," [а] "," / output.mp4 "};

  • Это сработало для меня!
  • используемый формат мультимедиа: mp4
  • оба видео имеют одинаковый размер - 320x240 (обязательно)

Используется ffmpeg lib: com.writingminds: FFmpegAndroid: 0.3.2

Другие вопросы по теме