Ffmpeg: Масштаб + обрезать видео, затем наложить изображение? - PullRequest
0 голосов
/ 07 июля 2019

Это мой первый ТАК вопрос.Помогите мне помочь вам помочь мне: нужен ли этот вопрос для уточнения?

Цель: сценарий, который делает готовые к Instagram видео со звуком и наложением логотипа.Скрипт берет аудио и видео источник и объединяет их.Важно: логотип должен иметь одинаковую позицию и размер для каждого видео.Это, вероятно, означает, что все выходные видео должны иметь одинаковую ширину x высоту.

Любые альтернативные подходы приветствуются!

Команда ffmpeg, которую я вызываю из python, приведена ниже.Я пытаюсь масштабировать видео до 720: -2 (так что авто-высота), а затем обрезать квадрат 500x500 от центра.Выбор 720 и 500 произвольный;лучшие подходы приветствуются.

ffmpeg -i video.mp4 -i logo.png -i audio.mp3 -filter_complex "[0:v]scale=720:-2,crop=500:500[bg];[bg][1:v] overlay=(W-w)/2:(H-h)/2" -pix_fmt yuv420p -map 0:v -map 2:a -shortest + output.mp4

Этот скрипт содержит ошибки в некоторых видео.

[Parsed_crop_1 @ 0x7fcf96401f00] Invalid too big or non positive size for width '500' or height '500'
[Parsed_crop_1 @ 0x7fcf96401f00] Failed to configure input pad on Parsed_crop_1

Я новичок в ffmpeg, поэтому, пожалуйста, объясните мне, как правильно использовать filter_complex.Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Используйте

ffmpeg -i video.mp4 -i logo.png -i audio.mp3 -filter_complex "[0:v]scale=720:-2,crop=min(500\,min(iw\,ih)):min(500\,min(iw\,ih))[bg];[bg][1:v] overlay=(W-w)/2:(H-h)/2" -pix_fmt yuv420p -map 2:a -shortest output.mp4

Новые аргументы обрезки гарантируют, что обрезка не попытается выбрать размер больше, чем рамка.

Выбор масштаба и значений урожая зависит от варианта использования и должен решаться вами.

0 голосов
/ 07 июля 2019

Похоже, что не все видео имеют одинаковую высоту и ширину. Я не уверен, потому что это было какое-то время, но при использовании масштабирования по ширине или высоте, если все видео, которые вы используете, не имеют одинаковую высоту и ширину, вещи могут выглядеть неестественно, как, например, ваше указание ffmpeg разместить что-то там, где оно не может. Некоторые видео будут работать, когда математика верна, а когда нет, вы получите ошибки.

Я бы использовал ffprobe, чтобы получить размеры видео.

import os
import json
import subprocess

def getVidInfo(videoPath):
    '''This function gets json data from ffprobe'''
    # print vPath
    if os.path.exists(videoPath):
        command = ['ffprobe', '-loglevel', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', videoPath]
        pipe = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        out, err = pipe.communicate()
        if not err is None:
            print 'err = '+str(err)
        return json.loads(out)

## This was taken from an old python2.7 project so you might need to 
## get proper keys if these dont work.

vidJson = getVidInfo('pathToYourVideo')
vWidth = vidJson['streams'][0]['width']
vHeight = vidJson['streams'][0]['height']

Затем сделайте математику из полученных размеров видео для вызова ffmpeg. В любом случае, это то, где я бы начал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...