适合邮筒或信箱

适合邮筒或信箱

我有一个 html 5 视频播放器,其宽度为 700px,高度为 400px。我尝试使用它avconvffmpeg调整大小(同时保留宽高比)并确保它适合我的播放器。

输入可以是任意大小的文件,因此我需要调整较大文件的大小,但将较小的文件用黑条居中。到目前为止,我尝试过:-s-aspect,我见过pad与开关一起使用-vf,但不明白它如何工作才能得到我需要的东西。

图片

这是我所需要的粗略想法。我不确定这是否可行。它几乎就像 CSS 的 max-width/max-height。我意识到这可能只是一堆乱七八糟的单词,但如果有人碰巧明白我在说什么,我将不胜感激,谢谢。

avconv命令:

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4

答案1

force_original_aspect_ratio一种简单的方法是使用比例过滤器

原始图像
原始图像。代表 640x480、4:3 宽高比的视频。

在这些示例中,原始图像将缩放以适合 1280x720、16:9 宽高比输出,同时保留原始宽高比。为此,您可以:


适合邮筒或信箱

带柱状边框的图像
带柱状边框的图像。将 640x480 (4:3) 输入装入 1280x720 (16:9) 输出。

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output
  • 这将使图像升级。如果您不想升级,请参见下面的示例。

  • 如果输入宽高比大于输出宽高比,则会出现信箱效果,而不是柱状宽高比。例如,宽高比为 2.35:1 的输入适合 16:9 的输出将导致信箱效果。

与上文相同,但没有升级

无升级
640x480(4:3)输入无需升级即可转换为 1280x720(16:9)输出。

ffmpeg -i input -vf "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output

裁剪以适合

在此处输入图片描述
裁剪图像。输入宽高比为 4:3,输出宽高比为 16:9。

使用裁剪过滤器剪掉多余的部分:

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output

使用大小各异的输入图像

如果您输入的是一系列图像,并且这些图像的大小不同,请eval=frame比例过滤器, 例如:

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease:eval=frame,pad=1280:720:-1:-1:color=black" output

更改背景颜色

使用color垫式过滤器。您可以提供十六进制值或使用受支持的颜色名称

答案2

这是为固定输出宽度添加柱状或信箱效果的命令。它有点长,但您必须以某种方式指定填充。

首先,在你的 shell 中定义输出宽度和高度:

width=700
height=400

然后运行命令:

ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4

这被精简为调整大小和填充所需的基本要素 — 根据需要添加其他视频和音频选项。请注意,和的数字width必须height能被 2 整除,才能适用于大多数编解码器。

以下是对正在发生的事情的解释:

  • 缩放:
    • 首先,我们需要确定是按宽度还是按高度缩放。
    • 为此,我们将输出宽度除以输入宽度,将输出高度除以输入高度。这将为我们提供每个维度的比例因子。
    • 然后,我们检查哪一个较低(min())并仅选择该因子进行调整大小。
    • 最后,我们将输入的宽度和高度都乘以该因子(iw*min(…):ih*min(…))。
  • 填充:
    • $width:$height是输出宽度和高度
    • 为了确定生成的视频的位置,我们需要从最大输出宽度中减去缩放后的宽度,从最大输出高度中减去缩放后的高度。
    • 缩放的宽度和高度是来自过滤器的表达式scale
    • 我们将得到的偏移量除以 2,以在两侧添加边框。

答案3

在我看来,你需要分三步完成此操作:

  1. 检查输入宽高比
  2. 对宽度为 DAR > 7/4 的视频进行缩放(将宽度更改为 700,并缩放高度以保持宽高比),对高度为 DAR < 7/4 的视频进行缩放
  3. 填充视频以便它适合 700:400 的空间。

FFmpeg/avconv 可以在一个步骤中使用视频滤镜进行缩放/填充,仅转码一次。例如,要拍摄 16:9 的视频,请按宽度缩放,然后对结果进行信箱处理:

ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4

...但是对于第一步(检测纵横比并将其与您需要的 7:4 进行比较),您必须使用某种脚本。

ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'

...将获取视频的宽高比,看起来像“16:9”或“4:3”。在 bash 脚本中,我会使用类似以下内容:

#!/bin/bash

##  Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
##  use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')

##  ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
    ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
    ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi

exit 0

显然你必须根据自己的需要进行调整。

相关内容