在 FFMPEG 中,调整视频大小的最有效方法是什么?

在 FFMPEG 中,调整视频大小的最有效方法是什么?

我收藏了大量 4:3 格式的 mkv 和 mp4 视频文件。我试图将其中最大的文件调整为更易于管理的 640x480 大小。这样做一方面是为了节省磁盘空间,另一方面也是为了使它们更容易在笔记本电脑屏幕上观看,并减少播放它们所消耗的处理器周期。

但是我还没有找到一种有效的方法来调整它们的大小。我一直在尝试严格遵循 MediaInfo 报告的原始文件使用的编码(使用 x264opts 选项重现 MediaInfo 报告的变量,这些变量与标准预设不同)。基于 2 遍视频编码。

但是,这给我留下了一个非常复杂的 ffmpeg 命令,如下所示。我忽略了什么?是否有更直接的命令行可以与 ffmpeg 一起使用,并且仍然可以很好地重现输入文件中使用的编码?

::  Resize Image to 640x480 (e.g. 960x720 x 2/3)

::  Input File (WITH .ext)
SET input=video_960x720_320kbps.mkv

::  Resize from 960x720 to 640x480 (i.e. 960x720 x 2/3)

::  Resize Picture to 2/3rd
    SET multiply=2
    SET divide=3

::  Location of FFMPEG (64-bit)
SET ffmpeg="C:\Program Files\FFmpeg\ffmpeg.exe" -hide_banner -threads 1


::  *** MATCH INPUT FILE'S SETTINGS : Input file analysed by MediaInfo ***

::  **  Command Line : 2 Pass Encoding : 320 kbps x 2/3 + Headroom = 240 kbps : Input = MKV  **

::  Video - Advanced Video Codec (AVC), High@L5 - Constant Bitrate, Framerate defaults to Input file's framerate

::  Overwrite a Profile with the x264-params option
SET x264opts="ref=16:deblock=1,1,2:me_range=32:trellis=0:bframes=5:open_gop=0:min-keyint=300:keyint_min=23:bitrate=240:qpmin=12:qpmax=60:qpstep=10:threads=1"

SET mapping=-i "%input%" -itsoffset 0 -i "%input%"  -map 0:v -map 1:a  -copyts
SET options=-preset veryslow  -profile:v high -level 5 -x264-params %x264opts%  -pix_fmt yuv420p
SET command=%ffmpeg% %mapping% -c:v libx264 %options% -vf "scale=iw*%multiply%/%divide%:-1" -c:a copy  -sn  -map_metadata 0
%command% -y -pass 1 -flags global_header -f matroska nul  &&  %command% -pass 2 -flags global_header -movflags faststart "output_640x480_240kbps.mkv"

答案1

毫无意义 ”重现使用的编码“。这只是历史信息,使用相同的设置不会导致更高效的重新编码。如果你想降低处理器负担,请使用较低的配置文件。refs=16并且bframes=5将完全相反消耗更少的处理器周期。单次通过 CRF 即可,无需两次通过平均比特率模式。

您还会提取两次输入并应用 TS 偏移量 0(!)。为什么?

ffmpeg -i in -vf scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p -c:v libx264 -crf 22 -profile:v main -c:a copy -sn -map_metadata 0 out.mkv

如果输入恰好是 4:3,则可以省略 pad 滤波器。

如果结果尺寸太大,请增加 CRF 值。

答案2

您可以使用下面的工件来处理视频和图像的大小调整。

项目依赖项的 URL(适用于 Maven、Gradle、Scala 等):点击这里

它建立在 FFMPEG 之上。您无需手动处理逻辑。

此工件有助于实现解决方案,而无需在我们的逻辑中使用太多样板代码

示例用法:

IVCompressor compress=new IVCompressor();
byte[] Imageoutput=compress.resizeImage(data, fileFormat, resolution); //for image compression
byte[] VideoOutput=compress.reduceVideoSize(videoData, fileFormat, resolution);//for video compression

了解更多详情@IV压缩机

相关内容