是否可以在不转码的情况下对视频的每一帧进行部分编辑(例如添加徽标)?并以相同的格式保存视频?
我的意思是,每个帧的像素位置都是可计算的;那么是否可以以某种方式修改文件字节,从而导致帧上发生所需的变化(例如添加徽标)?
我知道在 XviD 之类的格式中这是不可能的(至少很容易),但对于某些格式(例如 MPG 或原始 AVI)来说这完全不可能还是可能的?
答案1
这实际上仅对于无损视频编码才有可能。
无损到无损
对于无损编码的视频编解码器来说,做你想做的事情非常简单。其中许多编解码器逐像素存储视频数据,主要是在YUV 颜色空间. 此外,每个框架都是独立的。
编辑这样的视频会非常容易,因为你知道每个帧的位置,以及字节流中每个像素的位置。你可以简单地覆盖字节流的某些部分,而不会对其余流产生影响。即使无损视频是算术压缩的,你也可以先解压,编辑,然后再次压缩并保存——这没有问题。
因此,例如,如果您在 AVI 容器中有一个原始 YUV 视频,则可以逐帧编辑它,然后再次将其保存为 AVI 中的 YUV。
保持有损编码
但如果您想要在编辑步骤之后进行有损视频编码(或保留原始有损编码),这是不可能的。这有两个问题:编码过程本身,以及帧通常相互依赖的事实。
有损压缩试图尽可能地消除冗余,方法是删除人眼看不到的细节。这需要几个步骤,但最重要的一步是将像素域转换为频域,通常使用离散余弦变换。
此步骤的作用是,它取一个 8×8 像素块并将其转换为一个频率系数块。从这个块中,某些系数被丢弃,这减少了信息量(从而压缩了大小),但同时也丢弃了视觉信息,从而降低了视频的质量。丢弃哪些系数取决于编码器的质量设置。然后视频不是存储为像素,但作为频率系数。
当你想编辑有损视频时,你首先必须将频率系数重新构建为逐像素表示(如上所述)。此时,你可以编辑视频并插入徽标,但一旦你想再次存储它,你就必须再次执行转换步骤 - 并丢弃信息。这本质上是导致发电损失。
另一个问题是,对于大多数有损视频来说,一些框架依赖于其他框架中包含的信息更具体地说,B 帧和 P 帧仅包含偏移量较早(或较晚)的 B/P 或 I 帧。如果您更改 I 帧的内容,则所有其他相关帧在解码时都会发生变化,这通常不是您想要的。Peter Cordes 的回答强调了这一点。事实上他是对的原则,你可以编辑有损的 I 帧视频到位,但实际上很难实现。
因此,简单地说,除非您可以无损地存储视频,否则您无法在不牺牲质量的情况下就地编辑视频。
答案2
如果我们谈论的是带有运动矢量的复杂视频编解码器(编辑:实际上,任何类型的帧内或帧间预测),slhck 是正确的。您可以通过仅对要用徽标替换的区域中的宏块进行重新编码来修改 h.264 流。徽标在 I 帧中,跳过 P 和 B 帧中的块。但每当摄像机平移时,附近的块都会通过从现在带有徽标的图片部分复制来获取其图片数据。因此,徽标的边缘会被复制,从而破坏图片的其他部分,直到下一个 I 帧。
所以他是对的,但这是因为参考,而不是有损。(编辑:他的编辑消除了大部分混淆。)
对于每个块都是独立的(甚至没有任何帧内预测)的简单编解码器,例如 mjpeg,您可以仅在想要标记的区域中替换编码块,而无需解码/重新编码图片的其余部分。我认为在单个 jpeg 图像文件中支持这样做,但我不知道是否有任何东西支持 mjpeg,而无需将帧分解为单独的 jpeg 文件。
http://jpegclub.org/jpegjoin/jpegjoin.txt有关于如何使用 jpegtran 替换某些 jpeg 文件块而无需解码/编码图像其余部分的信息。
以下是一个例子无需解码/重新编码即可对视频流进行处理。将数据隐藏在 h.264 流中,隐藏在 iPCM 宏块的低系数中。(文字编码,而非 DCTed 编码。)您必须解码/重新编码 CABAC 熵编码层。(这是比特流的最终 zip 样式压缩。)
如果源文件是无损格式,则解压、编辑和重新压缩整个文件不会产生巨大的文件大小成本,只是 CPU 成本。许多无损格式本质上是单独压缩每个整帧,而不是对块进行操作,因此您必须进行完整的解压-编辑-重新压缩。无损 h.264 具有普通有损 h.264 的所有帧间和帧内预测,因此即使它确实有宏块,也需要完整的解码-编辑-编码。
除非您的有损源是 mjpeg,否则这些都不会改变视频徽标的实际实用目的。我只是为了那些好奇为什么这样做的人而写这篇文章。
答案3
我认为这应该是可能的。
在美国向 OTA HD(ATSC)转换期间,几乎所有网络都通过卫星从其家庭演播室提供视频,使用非常高的比特率(远高于 OTA 比特率)视频流。然后,他们为每个本地电视台提供解码器和较低比特率编码器,以便他们可以完全解码高质量流,添加其电视台徽标、图片插入等,然后编码为广播标准比特率进行传输。
然而,福克斯网络选择在他们的家庭工作室中对流媒体进行编码,大概是使用更高质量(和更昂贵)的编码器,但要达到广播比特率。然后,他们提供了一个“接驳器“到每个本地分支机构,可以部分解码流,插入徽标,抓取等,然后在广播之前重新编码该部分。
我确实意识到 OTA 广播中使用的 MPEG-2 流与 h.264/MPEG-4 不同,但从我对格式的技术细节的了解来看,这很可能仍然适用于 h.264/MPEG-4。(事实上,MPEG-4 实际上添加了支持 alpha 合成的功能,尽管我怀疑很少有解码器可以真正处理此功能。)
话虽如此,我还是没能找到这样的软件。我想在流媒体中添加图形栏(主要是体育赛事比分),而不必重新编码廉价相机拍摄的本来就很一般的画质。但我还没有找到。
编辑:我确实找到了这张纸在 ”利用独立切片替换 H.264/AVC 比特流中的图片区域”,这似乎提供了实现这一目标的技术细节。但我仍在寻找一些概念验证软件。