ffmpeg scale,如何正确裁剪

时间:2015-03-21 21:58:49

标签: ffmpeg

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

$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

output from vlc

^这是vlc的输出

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

所以,请按照要求进行一些调试:

/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

欢呼声

1 个答案:

答案 0 :(得分:3)

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替换 - 你不必填充它们。你只需要填写输入和输出文件名。