我有一个 html 5 视频播放器,其宽度为 700px,高度为 400px。我尝试使用它avconv
来ffmpeg
调整大小(同时保留宽高比)并确保它适合我的播放器。
输入可以是任意大小的文件,因此我需要调整较大文件的大小,但将较小的文件用黑条居中。到目前为止,我尝试过:-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
一种简单的方法是使用比例过滤器。
在这些示例中,原始图像将缩放以适合 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
裁剪以适合
使用裁剪过滤器剪掉多余的部分:
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
更改背景颜色
答案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
在我看来,你需要分三步完成此操作:
- 检查输入宽高比
- 对宽度为 DAR > 7/4 的视频进行缩放(将宽度更改为 700,并缩放高度以保持宽高比),对高度为 DAR < 7/4 的视频进行缩放
- 填充视频以便它适合 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
显然你必须根据自己的需要进行调整。