Ffmpeg 在连接的视频上添加徽标

Ffmpeg 在连接的视频上添加徽标,ffmpeg,concatenation,video-processing,Ffmpeg,Concatenation,Video Processing,我正在尝试在连接的视频上添加一个徽标。视频连接和添加徽标应该在同一个过滤器复合体中。我的过滤器复合体当前看起来像这样(它是由Bash生成的): ,它更容易阅读。因此,有一个很长的视频连接部分,最后,我会尝试添加如下徽标: [conc][logo]叠加=50:50[outv] 这就是我得到的错误: [AVFilterGraph @ 0x5640862fc520] No such filter: '' Error initializing complex filters. Invalid argu

我正在尝试在连接的视频上添加一个徽标。视频连接和添加徽标应该在同一个过滤器复合体中。我的过滤器复合体当前看起来像这样(它是由Bash生成的):

,它更容易阅读。因此,有一个很长的视频连接部分,最后,我会尝试添加如下徽标:

[conc][logo]叠加=50:50[outv]

这就是我得到的错误:

[AVFilterGraph @ 0x5640862fc520] No such filter: '' 
Error initializing complex filters.
Invalid argument
如何正确地做到这一点

编辑: 这是Bash脚本:

    echo "Creating the video list..."
    # Number of videos
    VID_NUMBER=$(find $VIDS_PATH -maxdepth 1 -type f -printf . | wc -c)
    # File names can not contain spaces. INPUT_LIST will contain the list of input files, all files in VIDS folder.
    INPUT_LIST=""
    for file in $VIDS_PATH*
    do
        if [ ${file: -4} == ".jpg" ]
        then
            INPUT_LIST="${INPUT_LIST} -loop 1 -t $IMAGE_DURATION -i $file"
        else
            INPUT_LIST="${INPUT_LIST} -i $file"
        fi
    done

    echo "Creating filter complex..."
    # This is the beginning of the filter that is used for concatenation. Has to be an entry for all videos.
    FILTER_COMPLEX_LIST=""
    for ((i=0; i<$VID_NUMBER; i++))
    do
        FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=$RES_X:height=$RES_Y:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':0,setsar=1[v$i];"
    done

    # Insert logo
    FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}movie=$LOGO, scale=180:-1, setpts=PTS-STARTPTS [logo];"

    # Filter final line. This is also generated in a loop. Tells ffmpeg which videos to concat and specifies output [outv]. No sound.
    FILTER_FINAL_LINE=""
    for ((i=0; i<$VID_NUMBER; i++))
    do
        FILTER_FINAL_LINE="${FILTER_FINAL_LINE}[v$i]"
    done
    FILTER_FINAL_LINE="${FILTER_FINAL_LINE} concat=unsafe=1:n=22:v=1:a=0[conc]; [conc][logo] overlay=50:50 [outv];"

    # Run ffmpeg
    date +"%Y %b %d %H:%M:%S Starting ffmpeg to stream videos ..." >> /home/streamer.log
    ffmpeg \
        -y \
        -fflags +genpts \
        $INPUT_LIST \
        -filter_complex "\
        $FILTER_COMPLEX_LIST \
        $FILTER_FINAL_LINE" \
        -map "[outv]" \
        $OUTPUT_SETTINGS \
        $OUTPUT

        sleep 1
done
echo“创建视频列表…”
#视频数量
VID_编号=$(查找$VIDS_路径-最大深度1-类型f-打印f.| wc-c)
#文件名不能包含空格。输入列表将包含输入文件列表,即VIDS文件夹中的所有文件。
INPUT_LIST=“”
对于$VIDS\u路径中的文件*
做
如果[${file:-4}==”.jpg“]
然后
INPUT_LIST=“${INPUT_LIST}-loop 1-t$IMAGE_DURATION-i$file”
其他的
INPUT_LIST=“${INPUT_LIST}-i$文件”
fi
完成
echo“创建过滤器复合体…”
#这是用于连接的筛选器的开头。必须是所有视频的条目。
筛选器_COMPLEX_LIST=“”
对于((i=0;i/home/streamer.log
ffmpeg\
-y\
-fflags+genpts\
$INPUT_列表\
-滤光片“复合物”\
$FILTER\u COMPLEX\u列表\
$FILTER\u FINAL\u行“\
-映射“[outv]”\
$OUTPUT\u设置\
$OUTPUT
睡眠1
完成

Last[outv]不应使用分号

所以不是

FILTER_FINAL_LINE=“${FILTER_FINAL_LINE}concat=unsafe=1:n=22:v=1:a=0[conc];[conc][logo]overlay=50:50[outv];”

FILTER_FINAL_LINE=“${FILTER_FINAL_LINE}concat=unsafe=1:n=22:v=1:a=0[conc];[conc][logo]overlay=50:50[outv]”

是正确的


我编辑了我的问题以包含bash脚本。不,路径是正确的。我之所以尝试这样做,是因为它似乎比计算whi输入将是logo更容易。事实上,我可以使用I+1作为logo。我尝试用-I添加I,错误是相同的。过滤器复合体看起来是这样的:是的,问题是最后一个[outv]不应该用分号([outv];)谢谢你的帮助!
    echo "Creating the video list..."
    # Number of videos
    VID_NUMBER=$(find $VIDS_PATH -maxdepth 1 -type f -printf . | wc -c)
    # File names can not contain spaces. INPUT_LIST will contain the list of input files, all files in VIDS folder.
    INPUT_LIST=""
    for file in $VIDS_PATH*
    do
        if [ ${file: -4} == ".jpg" ]
        then
            INPUT_LIST="${INPUT_LIST} -loop 1 -t $IMAGE_DURATION -i $file"
        else
            INPUT_LIST="${INPUT_LIST} -i $file"
        fi
    done

    echo "Creating filter complex..."
    # This is the beginning of the filter that is used for concatenation. Has to be an entry for all videos.
    FILTER_COMPLEX_LIST=""
    for ((i=0; i<$VID_NUMBER; i++))
    do
        FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=$RES_X:height=$RES_Y:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':0,setsar=1[v$i];"
    done

    # Insert logo
    FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}movie=$LOGO, scale=180:-1, setpts=PTS-STARTPTS [logo];"

    # Filter final line. This is also generated in a loop. Tells ffmpeg which videos to concat and specifies output [outv]. No sound.
    FILTER_FINAL_LINE=""
    for ((i=0; i<$VID_NUMBER; i++))
    do
        FILTER_FINAL_LINE="${FILTER_FINAL_LINE}[v$i]"
    done
    FILTER_FINAL_LINE="${FILTER_FINAL_LINE} concat=unsafe=1:n=22:v=1:a=0[conc]; [conc][logo] overlay=50:50 [outv];"

    # Run ffmpeg
    date +"%Y %b %d %H:%M:%S Starting ffmpeg to stream videos ..." >> /home/streamer.log
    ffmpeg \
        -y \
        -fflags +genpts \
        $INPUT_LIST \
        -filter_complex "\
        $FILTER_COMPLEX_LIST \
        $FILTER_FINAL_LINE" \
        -map "[outv]" \
        $OUTPUT_SETTINGS \
        $OUTPUT

        sleep 1
done