我有一个 C# 桌面应用程序,我正在使用 ffmpeg 在客户端电脑上“压缩”大量 jpeg,然后将其上传到我的服务器并解压。
每次压缩的 jpeg 数量各不相同。可能是几十张,也可能是几百张。
我使用这些参数来进行压缩:
-f image2 -r FPS-i + MyPath + \img%05d.jpg -crf 23 -y -r FPS + oggOutput
以及以下要解压缩的参数:
-i + MySavedPath + " -qscale 1 + SaveTpPath + \img-%05d.jpg
我认为可以尝试的选项是 crf 和 FPS。
当我将 fps 设置为 10 时,创建的字节数为 3630422。如果我将 FPS 设置为 25,则创建的字节数为 147892。
如果我将 FPS 设置为 60,则字节数为 70023,但 jpeg 的质量非常差,我无法使用它们。
我打算尝试这两个选项,看看哪个适合我,但如果有明确的“可做”和“不可做”规则,我希望得到建议。
我使用 ogg 文件扩展名作为视频文件格式,因为它是一项开放专利。
答案1
如果上传的 JPEG 总是非常相似,那么使用视频编解码器,您将受益于较长的“GOP”(图片组)。在这种情况下,视频编解码器以相对较高的比特率对第一帧进行编码,然后以较小的比特率仅对接下来的帧数进行更改的编码。
如果上传的 JPEG 完全不同,则根据编解码器的实现方式,它可能会尝试执行相同的操作,并最终以非常低的比特率编码大量差异,从而降低图像质量。
无论上传的 JPEG 的性质如何,添加另一个(或两个)转码阶段肯定会在一定程度上降低图像质量。
直接回答问题:
我怀疑 FPS 影响文件质量的原因是由于比特率设置。比特率以字节为单位每秒,而不是每帧。您没有指定它(它是-b:v
),因此它将使用默认比特率或 VBR 方法,它将 10 帧编码为 x 个字节,您的第二个示例试图将 25 帧压缩成相同数量的字节,在您的最后一个示例中,它试图将 60 帧压缩成相同数量的字节,因此质量必然会低得多。
关于使用视频编解码器时优化文件大小的图像质量:根据您想要的质量增加比特率,并-g
根据您上传的文件的性质减少 GOP ( )。更改 FPS 是影响这两个值的一种相当迂回的方式,因此如果您将 FPS 保留为默认值,并调整其他两个值,您将拥有更好的控制。
不直接回答您的问题:
您不会得到与您输入的相同的图片 - 视频压缩不允许这样做,无论比特率有多高。如果您希望有任何机会,您需要使用无损压缩方案,并且考虑到这些已经是 JPEG 压缩,正常数据压缩可能是您最好的选择,因为任何试图感知编码这些文件的东西都会尝试编码所有 JPEG 伪影(“噪音”)以及实际想要的图像。绝对值得尝试一个普通的 zip(gzip、bzip、7zip,...)文件,看看它是否可以使文件大小足够小以满足您的要求。或者尝试降低单个文件的质量(例如 Image Magick 或类似文件),然后将它们压缩。