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选项。
在这些示例中,原始图像将被缩放以适应 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)
使用裁剪过滤器剪掉多余的:
ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output
Run Code Online (Sandbox Code Playgroud)
如果你输入的是一系列图片,并且图片大小不一,eval=frame在scale 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选项。您可以提供十六进制值或使用支持的颜色名称。
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)
这被简化为调整大小和填充所需的基本要素 - 根据需要添加其他视频和音频选项。注意,对于数字width和height具有2以整除工作对于大多数的编解码器。
以下是对正在发生的事情的解释:
min())并仅选择该因素来调整大小。iw*min(…):ih*min(…))。$width:$height 是输出宽度和高度scale过滤器的表达式。在我看来,你需要分三个步骤来做到这一点:
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)
显然,您必须使其适应您的需求。