这是我的第一个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。谢谢!
答案 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
新的作物参数将确保作物不会尝试选择比框架大的尺寸。
比例和作物值的选择取决于用例,并且必须由您决定。