【问题标题】:Ffmpeg: Scale+crop video then overlay image?Ffmpeg:缩放+裁剪视频然后叠加图像?
【发布时间】:2019-11-17 00:05:56
【问题描述】:

这是我的第一个 SO 问题。 Help me help you help me:这个问题需要澄清吗?

目标:制作带有音频和徽标叠加层的 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。谢谢!

【问题讨论】:

    标签: python ffmpeg


    【解决方案1】:

    使用

    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

    新的裁剪参数将确保裁剪不会尝试选择大于框架的尺寸。

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

    【讨论】:

      【解决方案2】:

      看起来并非所有视频的高度和宽度都相同。我不积极,因为已经有一段时间了,但是当使用缩放到宽度或高度时,如果您使用的所有视频的高度和宽度都不统一,事情可能会变得很时髦,比如您告诉 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 调用视频尺寸进行计算。任何方式都是我要开始的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 2016-08-29
        • 2017-06-18
        • 1970-01-01
        相关资源
        最近更新 更多