减少相同格式的视频大小并减小帧大小


74

这个问题可能很基本

有没有一种方法可以减少有损压缩(WMV,MPEG)格式的帧大小/速率,以获得具有相同格式的较小尺寸的较小视频。

是否有任何开源或专有的api?

Answers:


91

ffmpeg提供了此功能。您需要做的就是像

ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>

对于较新版本的ffmpeg,您需要更改-b-b:v

ffmpeg -i <inputfilename> -s 640x480 -b:v 512k -vcodec mpeg1video -acodec copy <outputfilename>

使用MPEG 1视频编解码器并仅复制原始音频流,即可将输入视频文件转换为640 x 480大小和512kb / s比特率的视频。当然,您可以插入所需的任何值,然后尝试使用大小和比特率来实现所需的质量/大小折衷。文档中还介绍了大量其他选项

运行ffmpeg -formatsffmpeg -codecs以获取所有可用格式和编解码器的列表。如果您不必为最终输出指定特定的编解码器,则可以使用H.264之类的最新编解码器来实现更好的压缩率,同时将质量损失降至最低。


8
-b必须为-b:v,以获取vid比特率
AH先生2012年

4
@MrAH,感谢您的更新。自从我发布此内容以来,界面似乎已更改。以前是-b用于视频比特率和-ab用于音频比特率,但已更改为-b:[stream specifier]
杰森B

3
该命令略微不完整。丢失了,您还需要放入输出文件的名称: ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
desmond13,2016年

@JasonB嘿哥们,这太好了。您知道如何使用NodeJS进行此操作吗?
Chanaka De Silva '18

@JasonB我有9MB的一个视频时,我用你的代码,它的尺寸增大到16MB,请帮忙
KUNAL

37

如果要保持相同的屏幕尺寸,可以考虑使用crf系数:https ://trac.ffmpeg.org/wiki/Encode/H.264

这是对我-strict -2有用的命令:(在Mac上,您需要添加才能使用aac音频编解码器。

ffmpeg -i input.mp4 -c:v libx264 -crf 24 -b:v 1M -c:a aac output.mp4

很好的建议,除了不要使用FFmpeg的内置AAC编码器:听起来像胡扯。如果要使用AAC,至少要使用libfdk-aac,或者最近这些日子更喜欢Opus音频(完全免费/开源/无专利保护,并且与最好的AAC编码器竞争。远比最差的AAC编码器(如FFmpeg的-c:a aac)好。使用-c:a libopus -b:a 64k或类似的东西。(但请注意,MP4容器不能保存Opus音频。)
Peter Cordes

-b:v 1M覆盖-crf。请勿同时使用。只需使用CRF。
彼得·科德斯

30

除了使用H.264编解码器选择固定的比特率外,您还可以按照https://trac.ffmpeg.org/wiki/x264EncodingGuide所述选择其他预设。我还在KeyJ的博客存档版本)中发现了视频编码器比较,这是一个有趣的读物,它将H.264与Theora等进行了比较。

以下是我尝试过的各种选择的比较。录制的视频最初大小为673M,使用RecordMyScreen在iPad上拍摄。它的持续时间约为20分钟,分辨率为1024x768(视频的一半为空白,因此我将其裁剪为768x768)。为了减小尺寸,我将分辨率降低到480x480。没有声音。

结果,使用与基本相同的1024x768(并应用裁剪,缩放和过滤器):

  • 无特殊选项:95M(编码时间:1m19s)。
  • -b 512k添加,大小减小到77M(编码时间:1m17s)。
  • 只有-preset veryslow(没有-b),它变成了70M(编码时间:6分14秒)
  • 使用-b 512k和时-preset veryslow,大小变为77M(比仅仅小100K -b 512k)。
  • 使用-preset veryslow -crf 28,我得到了39M的文件,耗时5分47秒(对我而言,视觉质量没有差异)。

N = 1,因此将结果带一点盐,然后执行您自己的测试。


如果没有任何速率选项,则x264的默认值为-crf 23。但是可以,对于一次编码流,您应该使用-preset veryslow。毫不奇怪,这在屏幕捕获上效果很好。通常,除非您的目标是非常低的比特率,否则无需缩减规模。将细节分布在更多像素上往往有助于编解码器更好地保持细节。尖锐边缘周围的伪影往往是固定数量的像素,因此较高的rez会使伪影更小。(即使每个像素更少的比特意味着更多的量化,但其中一些模糊而不是伪像。)
Peter Cordes

4

有一个适用于Mac和Windows的应用程序,称为Handbrake,我知道这不是命令行内容,但是对于快速打开的文件-选择输出文件格式和粗略的输出大小,同时保留有关视频的大多数优点,那么这很好,它的ffmpeg在其最好的一个公正的图形视图...它支持命令行输入那些死忠短信族.. https://handbrake.fr/downloads.php


4

我发现自己最近也想这样做,所以我创建了一个名为Shrinkwrap的工具,该工具使用FFmpeg对视频进行转码,同时保留了尽可能多的原始元数据(包括文件修改时间戳)。

您可以将其作为docker容器运行:

docker run -v /path/to/your/videos:/vids bennetimo/shrinkwrap \
--input-extension mp4 --ffmpeg-opts crf=22,preset=fast /vids

哪里:

  • / path / to / your / videos /是要转换视频的位置
  • --input-extension是您要处理的视频类型,此处为.mp4
  • --ffmpeg-opts是您要用于自定义转码的任意FFmpeg选项

然后,它将递归地找到所有与扩展名匹配的视频文件,并将它们全部转码为带有-tc后缀的同名文件。

有关更多配置选项,GoPro预设等信息,请参见自述文件

希望这对某人有帮助!


3
ffmpeg -i <input.mp4> -b:v 2048k -s 1000x600 -fs 2048k -vcodec mpeg4 -acodec copy <output.mp4>
  • -i输入文件

  • -b:v输出视频的视频比特率,以千字节为单位(您必须尝试)

  • -s输出视频的尺寸

  • -fs输出视频的FILESIZE(以千字节为单位)

  • -vcodec视频ffmpeg -codecs编解码器(用于列出所有可用的编解码器)

  • -acodec用于输出视频的音频编解码器(仅复制音频流,请勿调整)

1
-fs使FFmpeg达到文件大小后停止编码。这不是用于速率计算的目标文件大小。如果-b:v正确,则文件大小仍然正确,如果错误,则文件会更小或被截断。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.