Ffmpeg 在连接的视频上添加徽标
我正在尝试在连接的视频上添加一个徽标。视频连接和添加徽标应该在同一个过滤器复合体中。我的过滤器复合体当前看起来像这样(它是由Bash生成的): ,它更容易阅读。因此,有一个很长的视频连接部分,最后,我会尝试添加如下徽标: [conc][logo]叠加=50:50[outv] 这就是我得到的错误: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
[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