无损通用视频格式


14

我试图为1280x720 25fps视频找到最合适的无损视频格式。视频有4分钟。声音将达到320 kbps mp3,这没什么大不了的。理想条件:

  • 无损(可以感知上无损)
  • 容器+编解码器可以在大多数平台上播放
  • 容器+编解码器可以在现代DVD播放器上播放(支持DVD以外的其他格式)
  • 大小小于700 MB

那有可能吗?已经挣扎了三天,没有任何令人满意的结果,甚至没有获得12 GB的文件(似乎很多-3 GB /分钟)。



4
抱歉,您实际上无法获得4分钟的(视觉上)无损720p视频,压缩到不到700 MB(我假设此处为兆字节,不是“ mb”,而是“ bit”)。为什么会有这样的约束?视频无法进行h.264编码吗?
slhck 2012年

是的,MB,很抱歉造成混乱。我需要将cca 5个视频x 4分钟装入4 GB(中等限制)。
mrkva

2
由于您获取的是12GiB文件,因此我假设您使用24Bit的色彩深度。未压缩的视频数据流约为每分钟4GiB。那是大量的数据。您想要的是每分钟170MiB。不管您选择哪种编解码器,都只能在静态场景下进行大量移动才能实现此目的。恐怕您必须放松约束以使其无损,降低帧速率或允许更大的文件大小。
马可(Marco)

您能否澄清“容器+编解码器可以在现代DVD播放器上播放(支持DVD以外的其他格式)”吗?
llogan '10

Answers:


24

我所知道的最好的,数学上无损的最佳格式是huffyuv,但这会产生非常大的文件,并且兼容性不佳。记录下来,ffmpeg可以做到:

ffmpeg -i input -c:v huffyuv -c:a libmp3lame -b:a 320k output.avi

开源h.264编码器X264具有无损模式。它可以放在MP4容器中,并且应该与最近几年制造的大多数硬件兼容。第一个命令将提供快速的编码速度,但是文件很大;第二个命令将花费更长的时间,但是该文件的大小应约为快速编码的文件的大小的一半(尽管它仍然会很大):

ffmpeg -i input -c:v libx264 -crf 0 -preset ultrafast -c:a libmp3lame -b:a 320k output.mp4

ffmpeg -i input -c:v libx264 -crf 0 -preset veryslow -c:a libmp3lame -b:a 320k output.mp4

如果那没有给您足够小的文件,则通常将18的crf视为“视觉无损”:

ffmpeg -i input -c:v libx264 -crf 18 -preset veryfast -c:a libmp3lame -b:a 320k output.mp4

我通常建议使用x264进行编码的非常快的预设,以我的经验,它提供了最佳的速度/大小权衡(在超快和非常快之间,文件大小会有很大的下降,比这还要慢,并且增量更大)。一般建议是使用您可以处理的最慢的预设,这些预设为:超快,超快,非常快,更快,更快,中等,慢,慢,非常慢。

有关更详细的x264编码指南,请参见此处


2
不要建议veryfast将x264作为有损的好方法。 medium是一个很好的中间立场,但我通常使用veryslow任何东西的最终编码。还huffyuv甚至不是非常快,我不会推荐它比其他的兼容性什么。
彼得·科德斯

ffmpeg还有其他一些无损编解码器,同样值得尝试[FFv1出现]。GL!
rogerdpack 2015年

即使您使用0的CRF,libx264也不会将两个颜色通道(在YUV UV中)对任何方向下采样一半,因此它并不是真正的无损。同样,由于舍入错误,一轮x264压缩后,不能保证数据是逐位相同的。
2015年

1
在我使用ffmpeg 3.4.1进行的实验中,libx264使用yuv444像素格式,其中“ 444”表示“请勿对U,V部分进行下采样”。而且,OP显然不介意舍入错误:“可以感知上无损”。因此,@ Adisak,您的顾虑是合理的,但不适用于此答案。
Jim DeLaHunt

YUV模式下的ffmpeg和libx264将基于输入协商YUV像素格式。因此,如果输入为YUV 4:2:0,则输出像素格式也是如此。如果输入是YUV 4:4:4或RGB,则输出是YUV 4:4:4。
Gyan

2

这些天我喜欢webm

ffmpeg -i input.avi -c:v libvpx-vp9 -lossless 1 output.webm

为了使用多核处理器更快地进行转换,我读到建议不要使用比真正核心少的线程。因此,使用8核,您可以指定7个线程,如下所示:

ffmpeg -i input.avi -c:v libvpx-vp9 -threads 7 -lossless 1 output.webm

1
我喜欢使用环境变量%NUMBER_OF_PROCESSORS%来确定要使用的线程数。如果计数是1或2,则我使用了所有处理器。如果计数是3或4,则我将只使用一个处理器。如果计数更高,我将使用除两个处理器之外的所有处理器来计算线程数。
阿迪萨克

1
作为DOS表达式,它看起来像这样:如果“%ADJUSTED_CPUCOUNT%” EQU“”(如果%NUMBER_OF_PROCESSORS%EQU 1(设置ADJUSTED_CPUCOUNT = 1),否则,如果%NUMBER_OF_PROCESSORS%EQU 2(设置ADJUSTED_CPUCOUNT = 2),否则,如果%NUMBER_OF_PROCESS EQU 3(设置ADJUSTED_CPUCOUNT = 2)否则,如果%NUMBER_OF_PROCESSORS%EQU 4(设置ADJUSTED_CPUCOUNT = 3)否则(set / A ADJUSTED_CPUCOUNT =%NUMBER_OF_PROCESSORS%-2))
Adisak

1
superuser.com/questions/155305/…表示ffmpeg已经选择了最佳线程数
Boris,

目前比webm更好的选择是av1格式。
LonnieBest

-1
# 容器

要与DVD播放器完全兼容,您需要使用MPEG-2格式,容器,限制和编解码器。我猜想,“现代播放器”是指“ mp4”兼容性,它基本上是mp4文件播放器-H.264,MPEG-4,AVC => libx264
了解更多:https : //de.wikipedia.org/wiki /H.264

# 视频

看看https://trac.ffmpeg.org/wiki/Encode/H.264,特别是有关“配置文件”和“级别”的部分,以确保兼容性
使用-profile:v high -level 4.0应该做到这一点

#音频

避免使用有损编解码器对音频轨道进行重新编码-任何mp3格式都有损,甚至320kbps。
使用-c:a copy代替。

到目前为止,它对我来说做得很好。没有同步问题。
音频流未绑定到关键帧。精确的切割是可能的。
如果您的音轨是以44kHz的采样率录制的,请使用max。256kbps

如果需要满足某些先决条件,请仅将有损编解码器用于视频的最终编码。

我听说过一些音频同步问题,但看来主要问题是受保护的材料(!)。

#最后

我更喜欢这样的东西:
ffmpeg -i input -c:v libx264 -crf 5 -preset faster -profile:v high -level 4.0 -c:a copy output.mp4


不需要选项“级别4.0”。x264中的级别是根据分辨率和FPS确定的,因此通常没有必要手动设置它,这不会带来任何改善。据我所知,ffmpeg可以自动设置正确的级别,因此除非您有充分的理由强加它并且完全了解如何根据FPS和分辨率选择级别,否则不应使用“ -level”选项。如果您关心最高的兼容性,请使用“基准”配置文件而不是“高”。
Lissanro Rayen,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.