ffmpeg scale,如何正确裁剪

ffmpeg scale, how to crop correctly

我正在使用此命令对视频进行编码

$transcode = FFMPEG_BINARY.' -loglevel panic -y -i "'.$files['original'].'" -vf scale='.VIDEO_SIZE_X.':'.VIDEO_SIZE_Y.' -vcodec libx264 -profile main -preset slow -r 25 -b '.VIDEO_BITRATE.' -maxrate '.VIDEO_BITRATE.' -bufsize 1000k -threads '.VIDEO_THREADS.' -acodec aac -ar 44100 -f mp4 -strict -2 '.$files['mp4'];

where: VIDEO_SIZE_X = 640 and VIDEO_SIZE_Y = 480, VIDEO_BITRATE = 900k

一切似乎都正常,但我遇到的问题是视频没有调整到所需的大小,即 640x480

^ 这是 vlc

的输出

看起来有一些参考所需的尺寸,但视频不是 scaled/cropped, 缩放视频以获得所需大小的正确方法是什么?我不介意上下有黑色条纹或两侧有条纹。

所以,根据要求进行一些调试:

/usr/bin/ffmpeg -loglevel panic -y -i "in.wmv" -vf scale=640:480 -vcodec libx264 -profile main -preset slow -r 25 -b 900k -maxrate 900k -bufsize 1000k -threads 8 -acodec aac -ar 44100 -f mp4 -strict -2 out.mp4

原视频:

[wmv3 @ 0x13245c0] Extra data: 8 bits left, value: 20
Input #0, asf, from 'in.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.9600.16384
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 1
    VBR Peak        : 313
    Buffer Average  : 397
  Duration: 00:06:09.13, start: 0.000000, bitrate: 2111 kb/s
    Stream #0:0: Audio: wmav2 (a[1][0][0] / 0x0161), 48000 Hz, 2 channels, s16, 96 kb/s
    Stream #0:1: Video: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 860x484, 2000 kb/s, SAR 1:1 DAR 215:121, 29.97 tbr, 1k tbn, 1k tbc
[wmv3 @ 0x13245c0] Extra data: 8 bits left, value: 20

而结果是:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf54.29.104
  Duration: 00:06:08.76, start: 0.000000, bitrate: 975 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 645:484 DAR 215:121], 842 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 125 kb/s
    Metadata:
      handler_name    : SoundHandler

干杯

in.wmv 的 ffmpeg 报告显示:

860x484 SAR 1:1 DAR 215:121

215:121 的 DAR(显示纵横比)为 1.77 (16x9)。所以你的来源是 16x9.

您为 out.mp4 发布的 ffmpeg 报告显示:

640x480 SAR 645:484 DAR 215:121

同样,显示纵横比为 16x9。您可能会注意到输出中的样本纵横比为 645:484。这意味着输出中的像素不是完美的正方形。相反,它们是宽矩形。这是因为方形像素的 640x480 的纵横比为 4x3。

如果您不想使用非方形像素进行编码,您有两个选择:

1) 编码为自然的 16x9 格式。在这种情况下,854x480 将是最自然的选择。

2) 添加支柱。您可以通过缩放到适合 640x480 的较小格式然后添加填充来做到这一点:

ffmpeg -i in.wmv -vf "scale=(iw*sar)*min(640/(iw*sar)\,480/ih):ih*min(640/(iw*sar)\,480/ih), pad=640:480:(640-iw*min(640/iw\,480/ih))/2:(480-ih*min(640/iw\,480/ih))/2" output.mp4

上述命令将缩放输入图像以填充宽度或高度(以先填充的为准),然后填充顶部或侧面以填充框架。这将适用于任何大小或格式的输入文件。变量 (iw, sar, ih) 被 ffmpeg 替换——您不必填写这些变量。您只需填写输入和输出文件名。