使用相同格式缩小视频大小并减小帧大小

时间:2010-12-20 13:39:46

标签: video compression video-processing lossy-compression

这个问题可能非常基本

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

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

6 个答案:

答案 0 :(得分:81)

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大小和512千比特/秒比特率的视频,然后只复制原始音频流。当然,您可以插入所需的任何值,并使用大小和比特率来实现您正在寻找的质量/尺寸权衡。 documentation

中还介绍了大量其他选项

运行ffmpeg -formatsffmpeg -codecs以获取所有可用格式和编解码器的列表。如果您不必针对最终输出定位特定编解码器,则可以使用最先进的编解码器(如H.264)以最小的质量损失实现更好的压缩比。

答案 1 :(得分:37)

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

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

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

答案 2 :(得分:28)

使用H.264编解码器,您还可以选择https://trac.ffmpeg.org/wiki/x264EncodingGuide中所述的其他预设,而不是选择固定比特率。我还发现Video encoder comparison at KeyJ's blogarchived version)是一个有趣的读物,它将H.264与Theora和其他人进行了比较。

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

结果,采用相同的1024x768作为基础(并应用裁剪,缩放和a filter):

  • 没有特殊选项:95M(编码时间:1分19秒)。
  • 仅添加-b 512k,大小降至77M(编码时间:1m17秒)。
  • 只有-preset veryslow(并且没有-b),它变为70M(编码时间:6分14秒)
  • 同时使用-b 512k-preset veryslow,大小变为77M(比-b 512k小100K)。
  • 使用-preset veryslow -crf 28,我得到一个39M的文件,花了5m47s(对我没有视觉质量差异)。

N = 1,所以用一粒盐取结果并进行自己的测试。

答案 3 :(得分: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 videocodec(使用ffmpeg -codecs列出所有可用的编解码器)

  • -acodec用于输出视频的音频编解码器(仅复制音频流,不发脾气)

答案 4 :(得分:3)

有一个适用于Mac和Windows的应用程序,称为Handbrake,我知道这不是命令行内容,而是用于快速打开文件的方法-选择输出文件格式和粗略的输出大小,同时保留有关视频的大部分优点,然后很好,这只是ffmpeg的最佳状态的图形视图... 它确实支持那些顽固的短信的命令行输入。 https://handbrake.fr/downloads.php

答案 5 :(得分:3)

我发现自己最近也想这样做,所以我创建了一个名为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预设等信息,请参见readme

希望这对某人有帮助!