这个问题可能非常基础
有没有一种方法可以减小损失压缩格式(WMV,MPEG)的帧大小/率,以获得相同格式的更小、更低质量的视频。
是否有任何开源或专有的API可以做到这一点?
这个问题可能非常基础
有没有一种方法可以减小损失压缩格式(WMV,MPEG)的帧大小/率,以获得相同格式的更小、更低质量的视频。
是否有任何开源或专有的API可以做到这一点?
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>
ffmpeg -formats
或ffmpeg -codecs
以获取所有可用格式和编解码器的列表。如果您不必针对最终输出选择特定的编解码器,则可以使用先进的编解码器(如H.264)实现更好的压缩比和最小的质量损失。-strict -2
才能使用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音频。) - Peter Cordes使用 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(编码时间:6m14s)。-b 512k
和-preset veryslow
,大小为77M(比仅使用-b 512k
小100K)。-preset veryslow -crf 28
,我得到了一个39M的文件,花费了5m47s(对我来说没有视觉质量差异)。N=1,因此请带着一份谨慎的心态进行测试,并进行自己的测试。
-crf 23
。但是,对于编码一次流多次使用,您应该使用类似-preset veryslow
的东西。不出所料,这在屏幕捕获方面表现非常好。通常情况下,除非您的目标是非常低的比特率,否则您不需要缩小比例;将细节分散到更多像素上有助于编解码器保持更好的细节。锐利边缘周围的伪影往往是固定数量的像素,因此更高的分辨率会使伪影变小。(即使每像素的位数较少意味着更多的量化,其中一些是模糊而不是伪影。) - Peter Cordes有一个名为Handbrake的应用程序适用于Mac和Windows系统。虽然它不是命令行工具,但可以快速打开文件、选择输出文件格式和大致输出大小,并保留视频的大部分优点。这是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 等预设,请参见readme。
希望这能帮到某人!
ffmpeg -i <input.mp4> -b:v 2048k -s 1000x600 -fs 2048k -vcodec mpeg4 -acodec copy <output.mp4>
-i 输入文件
-b:v 输出视频的视频比特率(以千字节为单位)(需要尝试)
-s 输出视频的尺寸
-fs 输出视频的文件大小(以千字节为单位)
-vcodec 视频编码器(使用 ffmpeg -codecs
列出所有可用的编码器)
-fs
选项可以让 FFmpeg 在达到指定文件大小后停止编码。它并不是用于速率计算的“目标”文件大小。如果你正确使用了 -b:v
选项,那么生成的文件大小就会是正确的;如果你使用不当,那么生成的文件可能会更小或被截断。 - Peter Cordes
ffmpeg -i <inputfilename> -s 640x480 -b 512k -vcodec mpeg1video -acodec copy <outputfilename>
- desmond13