Ffmpeg:缩放并裁剪视频然后叠加图像?

时间:2019-07-07 00:27:42

标签: python ffmpeg

这是我的第一个SO问题。帮帮我帮您帮忙:这个问题需要澄清吗?

目标:一个脚本,使带有音频的Instagram就绪视频和徽标叠加层。该脚本接收音频和视频源并将其组合。重要提示:徽标应与每个视频的位置和大小保持一致。这可能意味着所有输出视频应具有相同的宽度x高度。

欢迎任何其他方法!

下面是我从python调用的ffmpeg命令。我尝试将视频缩放到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 :(得分:0)

似乎并非所有视频的高度和宽度都相同。我不是很积极,因为已经有一段时间了,但是如果您使用的所有视频的高度和宽度不是统一的,那么使用缩放比例来调整宽度或高度时,事情可能会变得很时髦,例如您告诉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调用视频维度进行数学计算。任何以这种方式我都会从这里开始。

答案 1 :(得分:0)

使用

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

新的作物参数将确保作物不会尝试选择比框架大的尺寸。

比例和作物值的选择取决于用例,并且必须由您决定。