FFmpeg применяет несколько фильтров (наложение логотипа, изменение яркости и наложение текста) - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь добавить три фильтра в png-файл, используя ffmpeg в Android (я использую lib mind write).

Пока мне удалось собрать cmd:

-i /storage/emulated/0/videoApp/temp/firstFrameOfMergedVideo.png 

-i /storage/emulated/0/videoApp/temp/logo.png

-filter_complex

ПЕРВЫЙ ФИЛЬТР

[1:v]scale=h=-1:w=100[overlay_scaled],[0:v][overlay_scaled]overlay=eval=init:x=W-100-W*0.1:y=W*0.1, 

ВТОРОЙ ФИЛЬТР

drawtext=fontfile=/system/fonts/Roboto-Regular.ttf:text='xbsg':fontcolor=white:fontsize=60:box=1:boxcolor=0x7FFFD4@0.5:boxborderw=20:x=20:y=h-(text_h*2)-(h*0.1):enable='between(t,0,2)',

ТРЕТИЙ ФИЛЬТР

drawtext=fontfile=/system/fonts/Roboto-Regular.ttf:text='cbeh':fontcolor=white:fontsize=30:box=1:boxcolor=0x7FFFD4@0.5:boxborderw=20:x=20:y=h-text_h-(h*0.1)+25:enable='between(t,0,2)',

ЧЕТВЕРТЫЙ ФИЛЬТР

eq=contrast=1:brightness=0.26180276:saturation=1:gamma=1:gamma_r=1:gamma_g=1:gamma_b=1:gamma_weight=1 
-c:a
copy
/storage/emulated/0/videoApp/temp/frameWithFilters.png

Сейчас я пытаюсь разделить фильтры, используя ,, но я также пытался ;

Это отбрасывает меня назад:

Input #0, png_pipe, from '/storage/emulated/0/videoApp/temp/firstFrameOfMergedVideo.png':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: png, rgb24(pc), 1080x1920, 25 tbr, 25 tbn, 25 tbc

Input #1, png_pipe, from '/storage/emulated/0/videoApp/temp/logo.png':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Video: png, rgba(pc), 528x582, 25 tbr, 25 tbn, 25 tbc

[NULL @ 0xf265d800] Unable to find a suitable output format for ','
,: Invalid argument

Если я применяю их индивидуально, они работают.

Я новичок в ffmpeg, поэтому любая помощь будет оценена.

1 Ответ

0 голосов
/ 04 октября 2018

Я наконец-то понял это.

Фильтры должны передавать массив String как одну строку. Например, filterArray [2] = "-filter_complex" filterArray [3] = "остаток фильтра".

Если кому-то интересно, следующий фрагмент кода применяет до трех фильтров, если они присутствуют в видео.Этими фильтрами могут быть изменение яркости (необходимо применять сначала, чтобы другие фильтры могли быть применены сверху), наложение изображения логотипа, расположенного в верхнем правом углу и уменьшенного до определенного размера, и два наложения текста, размещенные один нижедругой в левом нижнем углу.

public void applyFiltersToImage(String srcPath, String outPath, String logoPath, String name, String function, float brightness, ProgressListener progressListener) {

    List<String> cmdList = new ArrayList<>();
    cmdList.add("-i");
    cmdList.add(srcPath);
    if (logoPath != null) {
        cmdList.add("-i");
        cmdList.add(logoPath);
    }

    cmdList.add("-filter_complex");

    StringBuilder filterBuilder = new StringBuilder();

    if (brightness != 0) {
        filterBuilder
                .append("eq=contrast=1:brightness=")
                .append(brightness)
                .append(":saturation=1:gamma=1:gamma_r=1:gamma_g=1:gamma_b=1:gamma_weight=1[v]");
        if (logoPath != null || name != null || function != null)
            filterBuilder.append(";");
    }


    if (logoPath != null) {

        filterBuilder
                .append("[1:v]scale=h=-1:w=")
                .append("100")
                .append("[overlay_scaled],")
                .append(brightness != 0 ? "[v]" : "[0:v]")
                .append("[overlay_scaled]overlay=eval=init:x=W-")
                .append("100")
                .append("-W*0.1:y=W*0.1[v]");

        if (name != null || function != null)
            filterBuilder.append(";[v]");
    }

    if (name != null || function != null) {
        if(brightness != 0 && logoPath == null)
            filterBuilder.append("[v]");

        filterBuilder
                .append("drawtext=fontfile=")
                .append("/system/fonts/Roboto-Regular.ttf")
                .append(":text='")
                .append(name)
                .append("':fontcolor=white:fontsize=")
                .append("60")
                .append(":box=1:boxcolor=0x7FFFD4@0.5:boxborderw=20:x=20:y=h-(text_h*2)-(h*0.1):enable=\'between(t,0,2)\'")
                .append(",drawtext=fontfile=")
                .append("/system/fonts/Roboto-Regular.ttf")
                .append(":text='")
                .append(function)
                .append("':fontcolor=white:fontsize=")
                .append("30")
                .append(":box=1:boxcolor=0x7FFFD4@0.5:boxborderw=20:x=20:y=h-text_h-(h*0.1)+25:enable=\'between(t,0,2)\'[v]");
    }

    cmdList.add(filterBuilder.toString());
    cmdList.add("-map");
    cmdList.add("[v]");
    cmdList.add(outPath);

    String[] cmd = new String[cmdList.size()];

    for (int i = 0; i < cmdList.size(); i++) {
        cmd[i] = cmdList.get(i);
    }

    executeCmd(cmd, progressListener, outPath);
}
...