Добавить логотип на объединенное видео

#ffmpeg #concatenation #video-processing

#ffmpeg #конкатенация #обработка видео #объединение

Вопрос:

Я пытаюсь добавить логотип поверх объединенного видео. Объединение видео и добавление логотипа должны выполняться в одном и том же комплексе фильтров. Мой комплекс фильтров в настоящее время выглядит следующим образом (он генерируется Bash):

 [0:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v0];[1:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v1];[2:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v2];[3:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v3];[4:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v4];[5:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v5];[6:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v6];[7:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v7];[8:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v8];[9:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v9];[10:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v10];[11:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v11];[12:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v12];[13:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v13];[14:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v14];[15:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v15];[16:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v16];[17:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v17];[18:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v18];[19:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v19];[20:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v20];[21:v]scale=854:480:force_original_aspect_ratio=1,pad=width=854:height=480:x='if(lt(in_w,854),(854-in_w)/2,0)':0,setsar=1[v21];movie=/home/logo.png, scale=180:-1 [logo];
[v0][v1][v2][v3][v4][v5][v6][v7][v8][v9][v10][v11][v12][v13][v14][v15][v16][v17][v18][v19][v20][v21] concat=unsafe=1:n=22:v=1:a=0[conc]; [conc][logo] overlay=50:50 [outv];
  

На 0bin это легче читать. Итак, есть действительно длинная часть объединения видео, и в конце я бы попытался добавить логотип вот так:

[conc][логотип] наложение=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
  

Комментарии:

1. Я отредактировал свой вопрос, чтобы включить скрипт bash. Нет, путь правильный. Причина, по которой я пытался сделать это таким образом, заключается в том, что это казалось проще, чем вычислять, какой ввод будет логотипом. Действительно, я мог бы использовать i 1 для логотипа.

2. Я попытался добавить i с помощью -i, ошибка та же. Комплекс фильтров выглядит следующим образом: 0bin.net/paste /…

3. Да, проблема заключалась в том, что в последнем [outv] не должно быть точки с запятой ([outv];) Спасибо за вашу помощь! ibb.co/ncgcdbt

Ответ №1:

В последнем [outv] не должно быть точки с запятой.

Поэтому вместо

FILTER_FINAL_LINE=»${FILTER_FINAL_LINE} concat=unsafe=1:n = 22:v = 1:a = 0 [conc]; [conc] [наложение логотипа] = 50:50 [outv];»

FILTER_FINAL_LINE=»${FILTER_FINAL_LINE} concat=unsafe=1:n = 22:v = 1:a = 0 [conc]; [conc] [наложение логотипа] = 50:50 [outv]»

правильно

https://superuser.com/questions/1395235/no-such-filter-in-ffmpeg