52

是否可以在 h264 中进行完全无损编码?无损,我的意思是如果我给它输入一系列帧并对其进行编码,然后如果我从编码的视频中提取所有帧,我将得到与输入中完全相同的帧,逐像素,逐帧. 这真的可能吗?举个例子:

我生成一堆帧,然后将图像序列编码为未压缩的 AVI(使用 virtualdub 之类的东西),然后应用无损 h264(帮助文件声称设置 --qp 0 可以进行无损压缩,但我不确定是否这意味着在过程的任何一点都没有损失,或者只是量化是无损的)。然后,我可以使用 mplayer 从生成的 h264 视频中提取帧。

我先尝试了 Handbrake,但事实证明它不支持无损编码。我试过 x264 但它崩溃了。这可能是因为我的源 AVI 文件是 RGB 颜色空间而不是 YV12。我不知道如何将一系列 YV12 位图以及以什么格式提供给 x264,所以我什至无法尝试。

总之,我想知道是否有办法

一系列无损位图(在任何颜色空间中)-> 一些转换 -> h264 编码 -> h264 解码 -> 一些转换 -> 原始系列无损位图

如果有办法做到这一点?

编辑:关于无损 H264 有一个非常有效的观点没有太大意义。我很清楚,我无法(仅凭我的眼睛)分辨出未压缩剪辑和另一个在 H264 中以高速率压缩的剪辑之间的区别,但我认为它并非没有用处。例如,它可能有助于存储视频以进行编辑,而不会占用大量空间,并且不会在每次保存文件时损失质量和花费太多编码时间。

更新 2:现在 x264 不会崩溃。我可以使用 avisynth 或无损 yv12 lagarith 作为源(以避免颜色空间压缩警告)。但是,即使使用 --qp 0 和 rgb 或 yv12 源,我仍然会得到一些差异,虽然很小但存在。这很麻烦,因为我发现的关于无损预测编码 (--qp 0) 的所有信息都声称整个编码应该是无损的,但我无法验证这一点。

4

8 回答 8

32

在花了一整天试图弄清楚如何将 YUV 4:4:4 像素转换为 x264 之后,我将添加一个较晚的答案。虽然 x264 确实接受文件中的原始 4:2:0 像素,但要传入 4:4:4 像素确实非常困难。对于最新版本的 ffmpeg,以下适用于完全无损编码和提取以验证编码。

首先,将原始 yuv 4:4:4 像素以平面格式写入文件。平面是一组 Y 字节,然后是 U 和 V 字节,其中 U 和 V 使用 128 作为零值。现在,调用 ffmpeg 并传入原始 YUV 帧的大小,因为两次使用“yuv444p”像素格式,如下所示:

ffmpeg -y -s 480x480 -pix_fmt yuv444p -i Tree480.yuv \
-c:v libx264 -pix_fmt yuv444p -profile:v high444 -crf 0 \
-preset:v slow \
Tree480_lossless.m4v

一旦完成对 h264 的编码并包装为 Quicktime 文件,就可以提取完全相同的字节,如下所示:

ffmpeg -y -i Tree480_lossless.m4v -vcodec rawvideo -pix_fmt yuv444p \
Tree480_m4v_decoded.yuv

最后,用 diff 验证两个二进制文件:

$ diff -s Tree480.yuv Tree480_m4v_decoded.yuv
Files Tree480.yuv and Tree480_m4v_decoded.yuv are identical

请记住,您需要自己将 YUV 字节写入文件,不要让 ffmpeg 对 YUV 值进行任何转换!

于 2013-08-29T09:05:33.250 回答
5

如果 x264 进行无损编码但不喜欢您的输入格式,那么您最好的选择是使用ffmpeg来处理输入文件。尝试从类似的东西开始

ffmpeg -i input.avi -f yuv4mpegpipe -pix_fmt yuv420p -y /dev/stdout \
  | x264 $OPTIONS -o output.264 /dev/stdin

并从那里添加选项。YUV4MPEG 是一种无损无压缩格式,适用于不同视频工具之间的管道;ffmpeg 知道如何编写它,而 x264 知道如何读取它。

于 2011-07-15T01:56:28.790 回答
4

FFmpeg 对 x264 具有“无损”模式,请参阅FFmpeg 和 x264 编码指南

§ 无损 H.264

本质上是-crf 0

于 2012-09-06T15:57:01.917 回答
2

我不知道您对压缩和解压缩的要求,但是通用存档器(例如带有 LZMA2 的 7-zip)应该能够压缩到与无损视频编解码器一样小,或者在某些情况下甚至小得多。而且它比整个视频处理链更简单、更安全。缺点是速度要慢得多,并且您必须先提取才能看到它。但是对于图像,我认为您应该尝试一下。

还有无损图像格式,例如 .png。

对于使用 x264 编码无损 RGB,您应该使用 x264 的命令行版本(在这种边缘情况下您不能信任 GUI,它们可能会搞砸)r2020 或更高版本,类似这样:

x264 --qp 0 --preset fast --input-csp rgb --output-csp rgb --colormatrix GBR --output "the_lossless_output.mkv" "someinput.avs"

输入和输出之间的任何损失/差异都应该来自某些色彩空间转换(在编码之前或在播放时)、错误的设置或丢失的某些标头/元数据。x264 不支持 RGBA,但是 RGB 是可以的。YUV 4:4:4 压缩效率更高,但由于您的输入是 RGB,因此您会在色彩空间转换中丢失一些数据。YV12/i420 要小得多,是迄今为止视频中最常见的色彩空间,但色度分辨率较低。

有关 x264 设置的更多信息:http: //mewiki.project357.com/wiki/X264_Settings

另外,避免拉格瑞斯。它使用 x87 浮点......并且有更好的选择。 http://codecs.multimedia.cx/?p=303 http://mod16.org/hurfdurf/?p=142

编辑:我不知道为什么我被否决了。当你这样做时,请发表评论。

于 2012-01-19T04:28:24.883 回答
2

我同意有时数据丢失是可以接受的,但这不仅仅是压缩后的外观问题。

即使是视觉上难以察觉的色彩数据丢失也会降低素材质量,从而使色彩校正、绿屏抠像、跟踪和其他后期任务变得更加困难或不可能,从而增加制作成本。

这实际上取决于您在管道中何时以及如何压缩,但最终存档原始质量是有意义的,因为存储通常比重新拍摄便宜得多。

于 2012-07-12T19:13:37.143 回答
2

要使用 HandBrake GUI 生成无损 H.264,请设置 Video Codec: H.264, Constant Quality, RF: 0, H.264 Profile: auto。尽管 Apple 本身不支持此文件,但可以将其重新编码为近乎无损的播放。

HandBrake GUI 的活动窗口:

H.264 配置文件:自动;以恒定 RF 0.000000 ...配置文件高 4:4:4预测,3.0 级,4:2:0 8 位编码

H.264 配置文件:高;以恒定 RF 0.000000 进行编码...无损需要 high444 配置文件,禁用...配置文件高,3.0 级

于 2013-12-11T06:10:33.357 回答
1

如果您无法使用 h.264 编码器和解码器进行无损压缩,也许您可​​以考虑两种替代方案:

(1)有些人不是以h.264格式传递所有数据,而是在尝试用残留的“边信道”传输一些数据:

  • (h.264 文件)-> h264 解码-> 一些转换-> 原始位图系列的有损近似
  • (压缩残差文件)-->解码器->一系列无损残差位图
  • 对于每个位图中的每个像素,近似像素 + 残差像素 = 与原始像素逐位相等的像素。

(2) 在“无损”模式下使用狄拉克视频压缩格式。

于 2011-08-26T03:44:53.807 回答
0

将 FFmpeg 与 PowerShell 一起使用。键入ffmpeg -h encoder=libx264rgb。您可以看到Supported pixel formats: bgr0 bgr24 rgb24 当您将 RGB 编码为 YUV 或反之亦然时,您总是会丢失质量。但如果你使用-pix_fmt yuv444p -profile:v high444p你的损失是最少的。但是,如果您使用libx264rgb像素格式的 ffmpeg 编码器 libx264rgb,rgb24您不会有任何质量损失。很多应用程序(例如 Davinci Resolve)无法读取 rgb 24 格式的像素。我建议您使用:

ffmpeg -i ["your sequence of rgb image.png"] -c:v libx264rgb -video_size [your size] -framerate [your fps] -r [your fps] -qp 0 -pix_fmt rgb24 -profile:v high444 -preset veryslow -level 6.2 "your_video.mov"

不幸的是,我不知道如何创建序列。但在 FFmpeg 中是可能的。

于 2021-04-22T01:01:01.983 回答