首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >h264无损编码

h264无损编码
EN

Stack Overflow用户
提问于 2011-07-15 09:27:38
回答 8查看 64K关注 0票数 52

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

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

我先试了一下手闸,但发现它不支持无损编码。我尝试过x264,但它崩溃了。这可能是因为我的源AVI文件是在RGB色彩空间,而不是YV12。我不知道如何向x264提供一系列的YV12位图以及以什么格式,所以我甚至不能尝试。

总而言之,我想知道的是,如果有一种方法可以从

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

如果有办法做到这一点呢?

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-08-29 17:05:33

在花了一整天的时间试图弄清楚如何将YUV4:4:4像素放入x264之后,我将为这个问题添加一个延迟的答案。虽然x264确实接受文件中的原始4:2:0像素,但要传入4:4:4像素确实相当困难。对于最新版本的ffmpeg,以下代码用于完全无损编码和提取以验证编码。

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

代码语言:javascript
运行
复制
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文件,就可以提取完全相同的字节,如下所示:

代码语言:javascript
运行
复制
ffmpeg -y -i Tree480_lossless.m4v -vcodec rawvideo -pix_fmt yuv444p \
Tree480_m4v_decoded.yuv

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

代码语言:javascript
运行
复制
$ diff -s Tree480.yuv Tree480_m4v_decoded.yuv
Files Tree480.yuv and Tree480_m4v_decoded.yuv are identical

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

票数 32
EN

Stack Overflow用户

发布于 2011-07-15 09:56:29

如果x264做了无损编码,但是不喜欢您的输入格式,那么最好的办法就是使用ffmpeg来处理输入文件。试着从这样的东西开始

代码语言:javascript
运行
复制
ffmpeg -i input.avi -f yuv4mpegpipe -pix_fmt yuv420p -y /dev/stdout \
  | x264 $OPTIONS -o output.264 /dev/stdin

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

票数 5
EN

Stack Overflow用户

发布于 2012-09-06 23:57:02

FFmpeg为x264提供了“无损”模式,请参阅FFmpeg和x264编码指南

§ Lossless H.264

从本质上讲,它是-crf 0

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6701805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档