我有一个 theora/vorbis ogg 视频文件。但是,我注意到使用 gzip/xz 可以将文件大小减少 20%/75%。因此,我怀疑内部格式并不能很好地压缩内容。有没有一种方法可以在不使用外部压缩格式的情况下更无损地压缩视频/音频?最好使用 ffmepg 的解决方案。
输出mediainfo
:
Format : Ogg
File size : 90.9 MiB
Duration : 27 min 52 s
Overall bit rate mode : Variable
Overall bit rate : 456 kb/s
Writing application : Lavf57.56.101
Video
ID : 1911251410 (0x71EB61D2)
Format : Theora
Duration : 27 min 52 s
Bit rate : 298 kb/s
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 30.000 FPS
Compression mode : Lossy
Bits/(Pixel*Frame) : 0.005
Stream size : 59.4 MiB (65%)
Writing library : Lavf57.56.101
Audio
ID : 2001534440 (0x774CFDE8)
Format : Vorbis
Format settings, Floor : 1
Duration : 27 min 52 s
Bit rate mode : Variable
Bit rate : 131 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Compression mode : Lossy
Stream size : 26.1 MiB (29%)
Writing library : Lavf57.56.101
答案1
简短的回答是:不。
当你将文件压缩成存档(例如 zip、7z、rar、gzip 等)时,算法会寻找以更短的方式存储给定信息的方法。例如,这是通过哈夫曼编码其中算法检查值的频率,然后将最常用的值存储在最短的数字中,将第二常用的值存储在第二小的数字中,......(这太简单了- 请阅读链接的维基百科文章以获得更好的解释。当然,霍夫曼编码只是一个非常简单的压缩示例)。这也解释了为什么压缩档案通常会进一步减小文件大小。
因此,文件大小减少 75% 是因为压缩工具找到了一种比视频和音频编码器更有效的方法来存储信息。但是,通常没有办法告诉编码器如何存储信息,因为这是标准中指定的。有时,由于标准实施得更好,较新版本的编码程序可以提供帮助,但通常这仅适用于全新的编解码器。
但是,您的视频播放器无法同时处理多个压缩。我认为这主要是因为它需要相当多的资源(RAM 和 CPU)来解压存档文件,然后读取文件本身。此外,它仍然需要先解压整个文件,就像您需要做的那样,因为很难从您没有的文件中估计哪个流存储在哪里等等。
因此,如果您需要使用 theora/vorbis,那么您对此无能为力。否则,如果文件大小是您的首要任务,我建议您研究一下VP8/VP9/x264/x265。如果您想采用 VP9 方式,我推荐一些类似 FFmpeg 的 Encode/VP9-Guide(链接就在上面):
ffmpeg -i <input> -c:v libvpx-vp9 -crf 15 -b:v 0 -c:a copy <output>
<input>
将和替换<output>
为相应的文件名(和文件扩展名)。*.mkv 和 *.webm 都可以使用(我只尝试了这两个),但是 *.webm 似乎需要沃比斯作为音频编解码器(例如,-c:a libvorbis -q:a 6
而不是-c:a copy
),其中 *.mkv 似乎没有要求。
-crf
指定一个恒定的速率因子(将其想象为“恒定的视觉质量”),其中较低的值表示更好的质量。
当然,以上所有内容都假设您的文件经过了高效编码(例如,未指定 6 Gb/s 的比特率)并且程序正常运行。就我个人而言,我从未能够从任何有损压缩的音频或视频文件中压缩出太多内容(但我很少使用 theora 或 vorbis)。