这个问题可能很基本
有没有一种方法可以减少有损压缩(WMV,MPEG)格式的帧大小/速率,以获得具有相同格式的较小尺寸的较小视频。
是否有任何开源或专有的api?
Answers:
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 -formats
或ffmpeg -codecs
以获取所有可用格式和编解码器的列表。如果您不必为最终输出指定特定的编解码器,则可以使用H.264之类的最新编解码器来实现更好的压缩率,同时将质量损失降至最低。
-b
用于视频比特率和-ab
用于音频比特率,但已更改为-b:[stream specifier]
。
ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
如果要保持相同的屏幕尺寸,可以考虑使用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
-c:a aac
)好。使用-c:a libopus -b:a 64k
或类似的东西。(但请注意,MP4容器不能保存Opus音频。)
-b:v 1M
覆盖-crf
。请勿同时使用。只需使用CRF。
除了使用H.264编解码器选择固定的比特率外,您还可以按照https://trac.ffmpeg.org/wiki/x264EncodingGuide所述选择其他预设。我还在KeyJ的博客(存档版本)中发现了视频编码器比较,这是一个有趣的读物,它将H.264与Theora等进行了比较。
以下是我尝试过的各种选择的比较。录制的视频最初大小为673M,使用RecordMyScreen在iPad上拍摄。它的持续时间约为20分钟,分辨率为1024x768(视频的一半为空白,因此我将其裁剪为768x768)。为了减小尺寸,我将分辨率降低到480x480。没有声音。
结果,使用与基本相同的1024x768(并应用裁剪,缩放和过滤器):
-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,因此将结果带一点盐,然后执行您自己的测试。
-crf 23
。但是可以,对于一次编码流,您应该使用-preset veryslow
。毫不奇怪,这在屏幕捕获上效果很好。通常,除非您的目标是非常低的比特率,否则无需缩减规模。将细节分布在更多像素上往往有助于编解码器更好地保持细节。尖锐边缘周围的伪影往往是固定数量的像素,因此较高的rez会使伪影更小。(即使每个像素更少的比特意味着更多的量化,但其中一些模糊而不是伪像。)
有一个适用于Mac和Windows的应用程序,称为Handbrake,我知道这不是命令行内容,但是对于快速打开的文件-选择输出文件格式和粗略的输出大小,同时保留有关视频的大多数优点,那么这很好,它的ffmpeg在其最好的一个公正的图形视图...它支持命令行输入那些死忠短信族.. https://handbrake.fr/downloads.php
我发现自己最近也想这样做,所以我创建了一个名为Shrinkwrap的工具,该工具使用FFmpeg对视频进行转码,同时保留了尽可能多的原始元数据(包括文件修改时间戳)。
您可以将其作为docker容器运行:
docker run -v /path/to/your/videos:/vids bennetimo/shrinkwrap \
--input-extension mp4 --ffmpeg-opts crf=22,preset=fast /vids
哪里:
然后,它将递归地找到所有与扩展名匹配的视频文件,并将它们全部转码为带有-tc
后缀的同名文件。
有关更多配置选项,GoPro预设等信息,请参见自述文件。
希望这对某人有帮助!
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
编解码器(用于列出所有可用的编解码器)
-fs
使FFmpeg达到文件大小后停止编码。这不是用于速率计算的目标文件大小。如果-b:v
正确,则文件大小仍然正确,如果错误,则文件会更小或被截断。