是否可以在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)上发现的所有信息都声称整个编码应该是无损的,但是我无法对此进行验证。
最佳答案
我花了一整天试图弄清楚如何将YUV 4:4:4像素转换为x264之后,将对此问题添加一个较晚的答案。尽管x264确实接受文件中的原始4:2:0像素,但要传递4:4:4像素确实非常困难。对于最新版本的ffmpeg,以下内容可用于完全无损编码和提取以验证编码。
首先,将原始的yuv 4:4:4像素以平面格式写入文件。这些平面是一组Y字节,然后是U和V字节,其中U和V使用128作为零值。现在,调用ffmpeg并使用“yuv444p”像素格式两次传入原始YUV帧的大小,如下所示:
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值进行任何转换!