是否有可能在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)上发现的所有信息都声称整个编码应该是无损的,但我无法验证这一点.
我已经看过讨论这两个类似框架的文章,但大多数都是两年左右.我认为这两个项目现在比两年前更加成熟,情况更复杂.
因此,考虑到每个图书馆的现状,我希望有人可以提供每个图书馆的优缺点的详细解释,目前应该首选.
在我之前的问题中,我想在堆栈中转储所有变量(从当前和所有前一帧),这里可以看到:有没有办法在运行时检查C#中的堆栈变量?
我被建议手动拦截调用或使用像PostSharp这样的AOP框架来简化这样的任务.我查看了PostSharp,并且拦截参数不包含当前堆栈帧中的变量.我想知道是否有一种简单的方法可以自动获取当前堆栈帧中的所有局部变量.我想我可以执行代码分析并生成将所有这些值复制到集合中的代码,但也许有一个内置机制来完成它.
在此先感谢您的任何建议.
编辑:我应该详细说明为什么我要这样做.我希望能够在方法中间暂停执行.如果我有堆栈的内容,我可以稍后恢复执行,甚至序列化它并在另一台机器上继续(假设它是相对简单的代码,因此没有线程或I/O).运行代码分析工具是可以的,这将允许我自动生成保存此状态的额外代码.我想我可能需要分析CIL才能做到这一点.
确定给定方法是读取还是写入成员变量或属性的最简单方法是什么?我正在编写一个工具来协助RPC系统,其中对远程对象的访问是昂贵的.能够检测方法中是否未使用给定对象可以允许我们避免序列化其状态.在源代码上执行它是完全合理的(但是能够在编译的代码上执行它将是惊人的)
我想我可以编写自己的简单解析器,我可以尝试使用现有的C#解析器之一并使用AST.我不确定是否可以使用Reflection使用Assemblies执行此操作.还有其他方法吗?什么是最简单的?
编辑:感谢您的所有快速回复.让我提供一些更多信息,使问题更清楚.我当然更喜欢正确,但绝对不应该非常复杂.我的意思是我们不能过分检查极端或不可能的事情(如提到的传入的代表,这是一个很好的观点).只需要检测这些情况并假设一切都可以使用而不是在那里进行优化就足够了.我认为这些案件相对不常见.我们的想法是将这个工具交给我们团队以外的开发人员,不应该关注这个优化.该工具获取其代码并为我们自己的RPC协议生成代理.(我们只使用protobuf-net进行序列化,但没有使用wcf和.net远程处理).出于这个原因,我们使用的任何东西都必须是免费的,否则我们就不会
我想更好地理解GPU是如何工作的,我对他们如何处理Direct3D或OpenGL等高级API感到困惑.看到图形卡广告它们支持Direct3D和OpenGL硬件加速是很常见的.这是否意味着他们直接在硬件中处理Direct3D和OpenGL指令?我无法找到明确的证据,或者将它们编译成GPU可以处理的汇编表示.如果有这样的转换谁做到了?软件库(Direct3D/OpenGL),驱动程序还是GPU本身?在同一行,图形管道定义在哪里?在GPU硬件,驱动程序或软件库中?这让我特别困惑于可编程管道的概念.
有没有一个很好的资源,我可以找到有关这些细节的信息?
我一直试图理解视频编码如何适用于现代编码器,特别是H264.在文档中经常提到残差帧是根据当前p帧和最后一个i帧之间的差异创建的(假设在预测中未使用以下帧).我知道使用YUV颜色空间(可能是YV12),并且一个图像从另一个图像"减去"然后形成残差.我不明白的是这种减法究竟是如何运作的.我不认为这是差异的绝对值,因为这将是模棱两可的.获得这种差异的每像素公式是什么?
对于使用 x264 压缩的视频中的某些 I 帧,我需要在所有块中使用 I_PCM 模式。我知道这些帧将占用大量空间,但要求它们尽可能忠实于源,并使它们能够非常快速地编码/解码(I_PCM 应该超快且无损)。有没有办法强制 x264 以编程方式执行此操作。我正在使用 libx264 来执行此操作,但我还没有找到在给定帧内指定自定义宏块类型的方法。如果不支持,修改库来实现这一点会有多困难,我应该首先看哪里?
c# ×3
.net ×2
h.264 ×2
x264 ×2
cci ×1
cil ×1
compression ×1
debugging ×1
direct3d ×1
graphics ×1
libx264 ×1
mono.cecil ×1
opengl ×1
parsing ×1
reflection ×1
rpc ×1
stack-frame ×1
video ×1