是否可以在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)上发现的所有信息都声称整个编码应该是无损的,但我无法验证这一点。
答案 0 :(得分:21)
在花了一整天试图找出如何将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值进行任何转换!
答案 1 :(得分: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知道如何阅读它。
答案 2 :(得分:3)
我不知道您对压缩和解压缩的要求,但是通用归档程序(如带有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
另外,避免使用lagarith。它使用x87浮点......还有更好的选择。 http://codecs.multimedia.cx/?p=303 http://mod16.org/hurfdurf/?p=142
编辑: 我不知道为什么我被拒绝了。当你这样做时请发表评论。
答案 3 :(得分:3)
答案 4 :(得分:2)
要使用HandBrake GUI生成无损H.264,请设置视频编解码器:H.264,恒定质量,RF:0,H.264配置文件:auto。虽然Apple本身不支持此文件,但可以将其重新编码为近乎无损的播放。
HandBrake GUI的活动窗口:
H.264配置文件:auto; 恒定RF编码0.000000 ... 配置文件高4:4:4 预测,级别3.0,4:2:0 8位
H.264配置文件:高; 恒定RF编码0.000000 ... 无损需要高444配置文件,禁用 ... 配置文件高,级别3.0
答案 5 :(得分:1)
如果使用h.264编码器和解码器无法获得无损压缩, 也许你可以考虑两种选择:
(1)有些人正试验用residual "side channel"传输一些数据,而不是传递h.264格式的所有数据:
(2)在“无损”模式下使用Dirac视频压缩格式。
答案 6 :(得分:1)
我同意有时数据丢失是可以接受的,但这不仅仅是压缩后它看起来如何。
即使在视觉上难以察觉的颜色数据丢失也会降低素材,使得色彩校正,绿屏键控,跟踪和其他后期任务变得更加困难或不可能,从而增加了制作费用。
这实际上取决于您在管道中压缩的时间和方式,但最终归档原始质量是有意义的,因为存储通常远比重新制作便宜。
答案 7 :(得分:-1)
在 PowerShell 中使用 FFmpeg。输入 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 中是可能的。
答案 8 :(得分:-2)
这不是你问题的答案,而是有损失的原因可能比无损更好。
以下是相同图像的比较,但采用有损和无损格式进行不同编码。
PNG(无损)148 kB:
JPEG-8(有损)36 kB:
JPEG-10(有损)65 kB:
JPEG-12(有损)122 kB:
现在,在Web浏览器的两个新选项卡中打开PNG(无损)图像和JPEG-10(有损)图像。来回翻转,你可以看到微弱的差异,但几乎没有。我的观点是,如果不同时查看它们并仔细检查它们,你就永远不会说出质量上的差异。在大多数情况下,无损数据压缩是不值得的,因为有损格式可以以较低的成本(文件大小)为您提供精确的质量。