75

这个问题可能很基础

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

是否有任何开源或专有 api 用于此?

4

6 回答 6

93

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 KB/秒的视频,并仅复制原始音频流。当然,您可以插入您需要的任何值,并使用大小和比特率来实现您正在寻找的质量/大小权衡。文档中还描述了许多其他选项

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

于 2010-12-20T16:02:30.400 回答
40

如果要保持相同的屏幕尺寸,可以考虑使用 crf 因子: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
于 2014-08-27T12:39:20.883 回答
30

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

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

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

  • 无特殊选项:95M(编码时间:1m19s)。
  • -b 512k添加后,大小降至 77M(编码时间:1m17s)。
  • 只有-preset veryslow(和没有-b),它变成了70M(编码时间:6m14s)
  • 同时使用-b 512k-preset veryslow,大小变为 77M(比 仅小 100K -b 512k)。
  • 使用-preset veryslow -crf 28,我得到一个 39M 的文件,耗时 5m47s(对我来说没有视觉质量差异)。

N = 1,因此对结果持保留态度并执行您自己的测试。

于 2013-12-01T23:02:52.570 回答
4

有一个适用于 Mac 和 Windows 的应用程序调用 Handbrake,我知道这不是命令行的东西,而是用于快速打开文件 - 选择输出文件格式和粗略的输出大小,同时保留大部分关于视频的好东西,那么这很好,它只是 ffmpeg 最好的图形视图......它确实支持那些顽固的文本用户的命令行输入.. https://handbrake.fr/downloads.php

于 2018-06-29T14:25:44.917 回答
4

I found myself wanting to do this too recently, so I created a tool called Shrinkwrap that uses FFmpeg to transcode videos, while preserving as much of the original metadata as possible (including file modification timestamps).

You can run it as a docker container:

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

Where:

  • /path/to/your/videos/ is where the videos are that you want to convert
  • --input-extension is the type of videos you want to process, here .mp4
  • --ffmpeg-opts is any arbitrary FFmpeg options you want to use to customise the transcode

Then it will recursively find all of the video files that match the extension and transcode them all into files of the same name with a -tc suffix.

For more configuration options, presets for GoPro etc, see the readme.

Hope this helps someone!

于 2018-11-08T22:23:06.060 回答
3
ffmpeg -i <input.mp4> -b:v 2048k -s 1000x600 -fs 2048k -vcodec mpeg4 -acodec copy <output.mp4>
  • -i 输入文件

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

  • -s 输出视频的尺寸

  • -fs以千字节为单位的输出视频文件大小

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

  • -acodec 用于输出视频的音频编解码器(只复制音频流,不要回火)
于 2018-05-27T07:37:58.007 回答