使用 ffmpeg/avconv 调整视频大小以适应静态大小的播放器

Jam*_*lor 82 ffmpeg video-conversion libav

我有一个 html 5 视频播放器,宽 700 像素,高 400 像素。我试图用avconv使用ffmpeg确保它符合我的播放器来调整(同时保留宽高比)和决策。

输入可以是任何大小的文件,所以我需要调整较大的文件的大小,但用黑条将较小的文件居中。到目前为止,我已经尝试过:-s-aspect,我已经看到pad-vfswitch一起使用,但不明白它是如何工作的,足以获得我需要的东西。

图片

这是我需要什么的粗略想法。我不确定这是否可能。这几乎就像 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
Run Code Online (Sandbox Code Playgroud)

llo*_*gan 84

一个简单的方法是使用比例过滤器中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
Run Code Online (Sandbox Code Playgroud)
  • 这将放大图像。如果您想避免升级,请参见下面的示例。

  • 如果输入纵横比比输出纵横比宽,则会出现信箱而不是邮筒。例如,纵横比为 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
Run Code Online (Sandbox Code Playgroud)

裁剪以适合

在此处输入图片说明
裁剪的图像。4:3 输入纵横比,16:9 输出纵横比。

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

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output
Run Code Online (Sandbox Code Playgroud)

使用大小不同的输入图像

如果你输入的是一系列图片,并且图片大小不一,eval=framescale filter中添加该选项,如:

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease:eval=frame,pad=1280:720:-1:-1:color=black" output
Run Code Online (Sandbox Code Playgroud)

改变背景颜色

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

  • @TiagoFerezin 啊,是的。很容易做到。在使用 pad 过滤器的示例中,您可以添加 `color` 选项,例如 `pad=1280:720:(ow-iw)/2:(oh-ih)/2:color=red`(或者您可以如果您愿意,请使用十六进制)。请参阅[颜色列表](https://ffmpeg.org/ffmpeg-utils.html#color-syntax)。 (3认同)
  • `eval=frame` 到底是做什么的? (2认同)
  • @ggrelet 它使缩放过滤器查看每一帧。否则,它将假设所有帧的宽度 x 高度与初始帧相同。您可以在 [缩放过滤器文档](https://ffmpeg.org/ffmpeg-filters.html#scale) 中阅读更多详细信息。 (2认同)

slh*_*hck 63

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

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

width=700
height=400
Run Code Online (Sandbox Code Playgroud)

然后运行命令:

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
Run Code Online (Sandbox Code Playgroud)

这被简化为调整大小和填充所需的基本要素 - 根据需要添加其他视频和音频选项。注意,对于数字widthheight具有2以整除工作对于大多数的编解码器。

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

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

  • @JamieTaylor 考虑在 slhck 的示例中添加 `-movflags +faststart`。它将允许您逐步下载的视频在完全下载之前开始播放,还可以参阅 [FFmpeg 和 x264 编码指南](https://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide) 和 [FFmpeg 和 AAC 编码指南](https://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide) 了解更多编码说明和示例。 (3认同)

evi*_*oup 8

在我看来,你需要分三个步骤来做到这一点:

  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
Run Code Online (Sandbox Code Playgroud)

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

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

...将为您提供视频的纵横比,看起来像“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
Run Code Online (Sandbox Code Playgroud)

显然,您必须使其适应您的需求。