Ответы пользователя по тегу FFmpeg
  • Как наложить музыку из плейлиста на зацикленное видео в ffmpeg для стрима на YouTube?

    Заранее подготовить видео, чтобы облегчить жизнь ffmpeg'у и VDS'ке: перекодировать исходное видео в формат, не требующий кодирования. В тот же h264, если в нём будете стримить видео поток. Надо будет указат доп. параметры для группы кадров:
    -c:v libx264 -pix_fmt yuv420p -preset medium -r 25 -g 50 -b:v 2500k

    здесь частота кадров 25 и группировка 25 * 2 = 50 Я бы сохранил промежуточный файл в .ts:
    ffmpeg -i input1.mp4 \
      -c:v libx264 \
      -pix_fmt yuv420p \
      -preset medium \
      -r 25 -g 50 \
      -b:v 2500k \
      -bsf:v h264_mp4toannexb -f mpegts \
      video.ts


    Аудио можно оставить в mp3, можно всё перевести в aac заранее, один раз. Опять же для уменьшения нагрузки.

    Составить текстовый файл плейлист аудио playlist.txt в формате типа
    # this is a comment
    file '/mp3/day1/file1.mp3'
    file '/mp3/day1/file2.mp3'
    file '/mp3/day1/file3.mp3'

    Запускать на вход видео в цикле и плейлист через concat примерно так:
    ffmpeg \
      -loop 1 -f mpegts  -i video.ts \
      -f concat -safe 0 -i playlist.txt \
      -c:a aac -b:a 128k \
      -c:v copy \
      -f flv \
      rtmp://a.rtmp.youtube.com/live2/ВАШ_КЛЮЧ
    Не проверял, и скорее всего предстоит много работы по проверке и отладке параметров.
    Ответ написан
    2 комментария
  • Как получить кол-во изменившихся пикселей в каждом кадре?

    Может, есть фильтр - надо продолжить поиски.

    Но вот ещё идея: из кадра вычитать предыдущий с помощью фильтра tmix. Если два кадра идентичны, результат будет полностью черный.
    Мерой разности или числа неодинаковых пикселей будет средняя яркость кадра: её отличие в плюс от нуля.
    Проверить вариант, что при вычитании светлого из чёрного вмето отрицательного значения останётся всё тот же 0. Тогда надо прогонять дважды: А - Б и Б - А.
    Ответ написан
  • Как изменить разрешения видео файла при склейке?

    Попробуйте так:
    ffmpeg \
    -i img.png \
    -i video.mp4 \
    -filter_complex "[1]scale=iw*min(1920/iw\,1080/ih):ih*min(1920/iw\,1080/ih)[ov];
    [0][ov]overlay=(W-w)/2:(H-h)/2"  \
    -y -hide_banner \
    out.mp4
    Ответ написан
    3 комментария
  • FFmpeg как вырезать видео без потери качества?

    перенесите опцию -ss до указания input'а

    ffmpeg -ss 00:01:43 -i original_video.mp4 -c copy -t 00:00:04  cut_1_test.mp4
    Ответ написан
    Комментировать
  • Как склеить два видео по горизонтали?

    ffmpeg, фильтр overlay, см. в его примерах прямо ваш случай:
    ffmpeg -i left.avi -i right.avi -filter_complex "
    nullsrc=size=200x100 [background];
    [0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
    [1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
    [background][left]       overlay=shortest=1       [background+left];
    [background+left][right] overlay=shortest=1:x=100 [left+right]
    "  output.mp4

    Только здесь их подгоняют в размер 100x100 каждое, а у вас другие размер - скорректируйте.
    Ответ написан
  • Можно ли в вертикальном видео вместо черных полей фоном сделать картинку?

    Можно сделать, используя фильтр overlay

    Готовую команду нет времени писать, но для старта вам примерно такое:
    ffmpeg  \
    -i fon.jpg  \
    -i vertvideo.mp4  \
    -filter_complex "  \
    [0:v] setpts=PTS-STARTPTS, scale=1280x720 [fon];  \
    [1:v] setpts=PTS-STARTPTS, scale=-2x720 [video]; \
    [fon][video] overlay=x=(W-w)/2  \
    "  \
    -y -hide_banner  \
    result.mp4
    Ответ написан
    Комментировать
  • Как пакетно вырезать первые 10 секнуд из виде с помощью ffmpeg?

    с одним файлом всё просто:
    ffmpeg \
      -i "c:/ffmpeg/videos/video_1.avi"  \
      -t 10  \
      -c:v copy  \
      -c:a copy  \
      "c:/ffmpeg/videos2/video_1.avi"


    Но подставлять правильные имена и адреса файлов – задача не для ffmpeg, а для скрипта. Под Linux/MacOS это был бы bash-скрипт, как вариант. Под Windows тоже что-то типа bat-файла надо написать.
    Ответ написан
    Комментировать
  • Ffmpeg (debian) как правильно доработать команду, для вертикального видео?

    Вот тут предлагают такую команду для этого эффекта:
    ffmpeg \
      -i input.mp4 \
      -lavfi '[0:v] scale=ih*16/9:-1, boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];  [bg][0:v]overlay=(W-w)/2:(H-h)/2, crop=h=iw*9/16' \
      -vb 800K \
      output.webm

    Пример: исходное видео и результат.

    Адаптируйте под свою задачу.
    Ответ написан
  • Как вывести длительность аудио/видеофайла?

    ffprobe для этого удобнее. В одном проекте так определяю длительность в bash-скрипте в переменную:
    local MUSIC_LENGTH=$(ffprobe \
    		-v quiet  \
    		-print_format ini  \
    		-show_format  \
    		"$MUSIC_PCM" | grep duration | sed s/duration=//)


    $MUSIC_PCM – путь к медиафайлу.
    Ответ написан
    Комментировать
  • Как с ffmpeg разделить на определенное количество thumbnail?

    Первый же фильтр fps=1/16 берет 1 кадр из 16 секунд.
    Чтобы получилось ровно 80 кадров, надо заранее знать длину видео и расчитать такой fps, чтобы получилось 80 кадров: fps=80/длина_видео_в_секундах

    Ещё стоит обратить внимание на фильтр thumbnail – он выбирает наиболее значимый кадр и серии кадров. Работает чуть медленнее и требует больше памяти, но выбранные кадры получаются лучше - без размытого движения и т.п. Тут тоже нужно знать длину видео и частоту кадров, т.е. общее число кадров в видео. И разделить его на 80. Например, видео длиной 15 минут с частотой кадров 30 даёт 30 * 15 * 60 = 27000 кадров. Разделить на 80 получится 337.5 кадров. Т.е. нужно бы использовать вместо fps=.. фильтр thumbnail=338
    Но может просесть скорость и вырасти потребление памяти.
    Ответ написан
  • Ffmpeg как задать сразу несколько параметров?

    Склеивать видео – это отдельная команда, в любом случае.
    Если у вас входные файлы в одинаковом кодеке и формате, то их не нужно перекодировать, а можно сразу склеивать.

    p.s. «объединить в одну» можно записав все команды в один скриптовый файл: .bat или .sh, в зависимости от платформы.
    Ответ написан
    Комментировать
  • Как в ffmpeg из нескольких изображений и их зум склеить видео?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Всё описанное можно сделать в ffmpeg.

    Анимированный зум делается фильтром zoompan. Он с только целыми координатами работает, поэтому, чтобы не дергался, делать это в повышенном разрешении. Потом даунсэмплить.

    Например, из недавнего проекта, где интерактивно генерилась анимация по шаблону, это из bash-скрипта:
    FILTER="[0]                                                   \
        pad=color=0x99999900:w=${wIn}:h=${hIn}:x=${xPad}:y=${yPad}, \
        scale=20064x3264,                                           \
        zoompan=                                                    \
          s=${wSrc}x${hSrc}                                         \
          :d=${frames}                                              \
          :z='( ${zoomcode} ) / 16.89999'                           \
          :x='2*(${xPad} + ${xPoi}) * (zoom - 1) / zoom'            \
          :y='2*(${yPad} + ${yPoi}) * (zoom - 1) / zoom'            \
          [fg];                                                     \
          [1][fg]overlay=x=247:y=438                                \
      "

    Т.к. зумить меньше, чем влезает во вьюпорт нельзя, сначала картинке добавляется по краям паддинг прозрачный, чтобы можно было уменьшать. Потом размер увеличивается с запасом раз в 5-10, чтобы сделать незаметными целочисленные пиксельные шаги зума и смещения.
    Ответ написан
    Комментировать
  • Как в linux одной командой объединить .webm с .mp4?

    ffmpeg поможет. Что-то типа:
    ffmpeg  -i audio.mp3  -i video.webm  -c:v libx264  -c:a aac  result.mp4


    -i audio.mp3 указывает один из входов, файл со звуком;
    -i video.webm ещё один вход, файл с видео;
    ffmpeg сам разберётся, откуда брать звук, а откуда видео дорожку, если каждой по одной и не приходится выбирать.
    -c:v libx264 указывает видео кодек, которым жать видео дорожку;
    -c:a aac аудио кодек, которым жать аудио.
    result.mp4 – куда сохранить результат.
    Ответ написан
    Комментировать
  • Почему ffmpeg на Amazon Lambda вылетает с ошибкой SIGSEGV?

    sergiks
    @sergiks Автор вопроса
    ♬♬
    В итоге победил компиляцией ffmpeg'а на AWS EC2 t2.micro из образа, на котором работает Lambda.

    Статический билд с сайта JohnVanSickle хоть и запускается на такой машине, на Lambda почему-то упорно падает с ошибкой. Поэтому увы, только компилировать.

    Использовал скрипт markus-perl/ffmpeg-build-script. Но и с ним не гладко: компиляция падала с ошибкой кодека aom / av1, который упорно показывал свою версию как 0.1.0, а не требуемую 1.0.0. Создал тикет. Эта мелочь вылечилась отказом от кодека aom - в 376-й строке скрипта build-ffmpeg заменил --enable-libaom на --disable-libaom

    Сборка на слабеньком t2.micro заняла долгие несколько часов, но итоговый бинарник заработал в AWS Lambda!
    Ответ написан
    Комментировать
  • Как сделать эффект размытия движения (motion blur) в ffmpeg?

    sergiks
    @sergiks Автор вопроса
    ♬♬
    В обновлённом ffmpeg, начиная с версии 4.1, появился новый видео фильтр tmix – он смешивает N соседних кадров.

    Для создания эффекта размытия движения, можно рендерить анимацию с частотой кадров в N раз выше, смешивать N соседних кадров, и снижать частоту обратно в N раз, просто выкидывая лишние кадры.

    Скрипт примера
    let WIDTH=640
    let HEIGHT=480
    
    let MID=$WIDTH/2
    
    let BUFFER=16
    let FRAMERATE=30
    
    let XRATE=$BUFFER\*$FRAMERATE
    
    let DURATION=8
    let FPERIOD=$XRATE\*$DURATION
    
    ffmpeg \
      -filter_complex \
      " \
        color=white:${WIDTH}x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bg];  \
        color=black:8x${HEIGHT}:d=$DURATION:r=$XRATE,format=rgb24[bar];  \
        [bg][bar]overlay=x='$MID + $MID * sin(8 * PI * n / $FPERIOD)':y=0:format=yuv444,format=yuv420p[motion]; \
        [motion]tmix=frames=$BUFFER \
      " \
      -c:v libx264  \
      -r $FRAMERATE  \
      -an  \
      -hide_banner \
      -y  \
      output.mp4

    Получившееся видео.

    Чтобы анимация была плавнее и не страдала от округления координат до ближайшего четного целого, помог ответ от гуру ffmpeg'а Gyan: нужно форсить full chroma sampling.
    Ответ написан
    Комментировать
  • Как с помощью ffmpeg наложить аудио на видео?

    Upd. чтобы смиксовать оригинальное аудио из видеофайла с отдельным аудиотреком, причем меньшей длины, чем видео, придётся во-первых, повторять накладываемый аудиофайл, а во-вторых использовать аудиофильтр amix:
    ffmpeg \
    -i video.mp4 \
    -filter_complex "amovie=audio.mp3:loop=0,asetpts=N/SR/TB[over]; [0][over]amix=duration=shortest" \
    -c:v copy \
    result.mp4


    Старый ответ, про замену аудио трека.

    Чтобы заменить оригинальное аудио на другое из отдельного файла, нужно указать оба входа, и через -map показать, откуда брать аудио и видео.
    Примерно так:
    ffmpeg \
    -i video.mp4 \
    -i newAudio.mp3 \
    -c:v copy \
    -c:a aac \
    -map 0:v:0 \
    -map 1:a:0 \
    result.mp4
    Ответ написан
    Комментировать
  • Как быстрее всего генерировать видео с субтитрами на node.js + ffmpeg?

    1. можно: в промежуточных файлах использовать кодеки, допускающие контактенацию
    2. именно. Аудио лучше в pcm:
      -c:a pcm_s16le -f s16le -ar 48000 -ac 2  ... audio.pcm
      , видео в ts:
      -c:v libx264 -bsf:v h264_mp4toannexb -f mpegts  ... video.ts

      Их потом можно конкатенировать по-быстрому -i "concat:video1.ts|video2.ts"

    3. наверное быстрее один раз запустить шелл скрипт со всеми ffmpeg-командами
    4. диск достаточно быстр обычно
    Ответ написан
    1 комментарий
  • Ffmpeg зациклить видео, как?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно, mp4 не позволяет простой конкатенации файлов, поэтому при склейке он декодируется и снова жмётся.

    Быстрее один раз разжать видео в .ts формат, который потом можно просто склеивать.
    Делал похожее для сборки mp3+картинки в статичное видео.

    Примерно так:
    bash скрипт
    #  из mp4 сделать ts
    TMPVIDEO="tmp_video.ts"
    ffmpeg  \
      -i "short.mp4"  \
      -bsf:v h264_mp4toannexb  \
      -an  \
      -f mpegts  \
      -y -hide_banner  \
      "$TMPVIDEO"
    
    # до этого определить, сколько раз повторить фрагмент,
    # чтобы покрыть длину mp3
    REPEATS=5
    LONGVIDEO="long_video.ts"
    N=1
    while [ $N -le $REPEATS ]; do
    	ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
    	    -c:v copy \
    	    -y -hide_banner  \
    	    "$LONGVIDEO"
    
    	local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
    
    	rm -f "$TMPVIDEO"
    	mv "$LONGVIDEO" "$TMPVIDEO"
    	local N=$[$N << 1]
    	echo "N: $N"
    done
    # получили длинное видео с запасом
    
    # подрезать длину, чтобы точно соответствовала
    FFMPEG -i "$TMPVIDEO" \
      -c:v copy \
      -t $MUSIC_LENGTH \
      -y -hide_banner  \
      "$LONGVIDEO"


    Потом остаётся собрать из аудио и видео общий файл. В mp4 аудио идёт в формате AAC. Для скорости можно заранее разжать mp3 в aac, заодно измерив точную длительность.
    Ответ написан
  • Как с помощью ffmpeg наложить картинку в перед началом видео?

    Надо сделать из картинки ролик точно такого же размера, формата и кодека, как основное видео.

    И объединить их через concat.
    Ответ написан
  • Как совместить 2 видео разных размеров кадра через ffmpeg?

    Можно использовать фильтр overlay, который наложит на пустое видео конечного размера кадра сначала первый источник а потом второй со смещением по y=280.

    Рабочий пример
    ffmpeg \
    -f lavfi -i testsrc=size=640x280 \
    -f lavfi -i color=c=#ff9900:size=640x360 \
    -t 5 \
    -filter_complex "
    nullsrc=size=640x640 [background];
    [0:v] setpts=PTS-STARTPTS [top];
    [1:v] setpts=PTS-STARTPTS [bottom];
    [background][top]       overlay=shortest=1       [background+top];
    [background+top][bottom] overlay=shortest=1:y=280
    " \
    -y  -t 5 test.avi
    Результат
    5b50e49134f23765570400.png
    Ответ написан
    2 комментария