FFmpeg应用多个过滤器(徽标覆盖、亮度变化和文本覆盖)

FFmpeg应用多个过滤器(徽标覆盖、亮度变化和文本覆盖),ffmpeg,android-ffmpeg,fluent-ffmpeg,Ffmpeg,Android Ffmpeg,Fluent Ffmpeg,我尝试在Android中使用ffmpeg向png文件添加三个过滤器(我使用的是writing mind lib) 到目前为止,我成功地将cmd: -i /storage/emulated/0/videoApp/temp/firstFrameOfMergedVideo.png -i /storage/emulated/0/videoApp/temp/logo.png -filter_complex 第一过滤器 第二过滤器 第三过滤器 第四过滤器 现在我正在尝试使用,分离过滤器,但我也尝试了

我尝试在Android中使用ffmpeg向png文件添加三个过滤器(我使用的是writing mind lib)

到目前为止,我成功地将cmd:

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

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

-filter_complex
第一过滤器 第二过滤器 第三过滤器 第四过滤器 现在我正在尝试使用
分离过滤器,但我也尝试了

它让我回想起:

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的新手,希望能得到任何帮助。

我终于明白了

筛选器必须作为一个字符串传入字符串数组 例如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);
}
public void applyFiltersToImage(字符串srcPath、字符串outPath、字符串logoPath、字符串名称、字符串函数、浮点亮度、ProgressListener){
List cmdList=new ArrayList();
添加(“-i”);
添加(srcPath);
if(logoPath!=null){
添加(“-i”);
添加(logoPath);
}
添加(“-filter_complex”);
StringBuilder filterBuilder=新建StringBuilder();
如果(亮度!=0){
过滤器生成器
.append(“eq=contrast=1:brightness=”)
.append(亮度)
.append(“:saturation=1:gamma=1:gamma_r=1:gamma_g=1:gamma_b=1:gamma_weight=1[v]”);
if(logoPath!=null | | name!=null | |函数!=null)
filterBuilder.append(“;”);
}
if(logoPath!=null){
过滤器生成器
.append(“[1:v]scale=h=-1:w=”)
.附加(“100”)
.append(“[overlay\u scaled],”)
.append(亮度!=0?[v]:“[0:v]”)
.append(“[overlay\u scaled]overlay=eval=init:x=W-”)
.附加(“100”)
.追加(“-W*0.1:y=W*0.1[v]”);
if(name!=null | |函数!=null)
filterBuilder.append(“;[v]”);
}
if(name!=null | |函数!=null){
if(亮度!=0&&logoPath==null)
filterBuilder.append(“[v]”);
过滤器生成器
.append(“drawtext=fontfile=”)
.append(“/system/font/Roboto Regular.ttf”)
.append(“:text=”)
.append(名称)
.append(“':fontcolor=white:fontsize=”)
.附加(“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/font/Roboto Regular.ttf”)
.append(“:text=”)
.append(函数)
.append(“':fontcolor=white:fontsize=”)
.附加(“30”)
.append(“:box=1:boxcolor=0x7FFFD4@0.5:boxborderw=20:x=20:y=h-text\uh-(h*0.1)+25:enable=\'between(t,0,2)\'[v]”;
}
添加(filterBuilder.toString());
添加(“-map”);
添加(“[v]”);
添加(输出路径);
String[]cmd=新字符串[cmdList.size()];
对于(int i=0;i
在命令行环境中,您的命令应该可以正常工作(使用逗号链接),无需编写脚本,因此ffmpeg没有问题。可能是Android用户尝试使用ffmpeg时遇到的典型引用问题。与此问题无关,但您不需要
-c:copy
,因为您的输入是PNG。我验证这是一个格式问题,命令本身也不正确,因为我必须制作一些流变量,因此正确的流得到了亮度更改,覆盖层保持不变。
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
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);
}