h264无损编码

clo*_*ven 41 lossless-compression h.264 x264

是否有可能在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)上发现的所有信息都声称整个编码应该是无损的,但我无法验证这一点.

MoD*_*oDJ 23

在花了一整天试图找出如何将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
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -y -i Tree480_lossless.m4v -vcodec rawvideo -pix_fmt yuv444p \
Tree480_m4v_decoded.yuv
Run Code Online (Sandbox Code Playgroud)

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

$ diff -s Tree480.yuv Tree480_m4v_decoded.yuv
Files Tree480.yuv and Tree480_m4v_decoded.yuv are identical
Run Code Online (Sandbox Code Playgroud)

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

  • 不,那只会将原始像素转储到y4m(rawvideo)文件.最初的问题是关于如何编码为无损h.264.您的"更简单"命令不压缩数据,它只是转换为原始未压缩像素. (2认同)

hob*_*bbs 5

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

ffmpeg -i input.avi -f yuv4mpegpipe -pix_fmt yuv420p -y /dev/stdout \
  | x264 $OPTIONS -o output.264 /dev/stdin
Run Code Online (Sandbox Code Playgroud)

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

  • 从RGB到YUV的转换可能有一些微小的精度损失,但我相信这是不可避免的,因为YUV是H.264的原生色彩空间.但是,我忘记了YUV420P实际上并不是一种完全无损的像素格式 - 它可以减少它存储的色度信息.尝试从`ffmpeg -pix_fmts`中选择其他选项,看看x264是否会接受它们.`yuv444p`将是一个良好的开端; 它是YUV但每像素有完整的色度信息. (5认同)