ffmpeg 比例,如何正确裁剪

标签 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

干杯

最佳答案

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 替换 - 您不必填写这些变量。您只需填写输入和输出文件名。

关于ffmpeg 比例,如何正确裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29188547/

相关文章:

ffmpeg 标准输出缺少字节

ffmpeg/avconv : transcode using same codec and params as input

c++ - ffmpeg编码过程运行时更新参数

html - 当我重建音频文件时,如何编码和分段音频文件而不会在段之间有间隙(或音频弹出)?

ffmpeg - 使用ffmpeg将十进制格式命名文件组合成mp4

ffmpeg - 如何创建解码器的完整副本?

ffmpeg - 如何在不重新编码的情况下使用 ffmpeg 删除帧?

audio - 将每分钟的 MP3 导出为单独的 WAV

video - 如何在 ffmpeg 中获取音轨分配

Android 通过 RTSP 渲染实时 H.264