视频编码成 I P B 帧到变成一个文件这个过程中,有没有其他的压缩过程?编码后 I 帧是 rgb 或 yuv 等原始数据的图片还是像 jpg 之类的还有其他压缩?有没有可能不解码,在保留 p b 帧原始数据(即关于 i 帧的相对变化)时,换掉 i 帧,应用场景比如视频抠图,背景静止时只要 i 帧抠图换背景是不是就够了?
1
coderluan 2020-06-18 17:03:18 +08:00 1
I 帧也是压缩的, 比如这帧图像就是一面白墙, 不压缩得多蠢, 也就是说你不解码是得不到原始图像的.
|
2
zpole OP @coderluan 是呀。那我如何保证 decode 换完 i 以后,再 encode p b 不变呢
|
3
coderluan 2020-06-18 17:05:22 +08:00
这个过程一般叫 intra prediction, 也就是帧内预测, 一般是先分块再压缩的, 具体的压缩算法看编码标准.
|
4
coderluan 2020-06-18 17:16:05 +08:00
@zpole 没太弄明白你的需求, 播放视频和视频处理实际是不一样的, 实际上视频处理就是处理解码之后的图片, 然后再压缩, 所以和视频编码无关了, 而是视频处理软件自己提供一个复制操作的功能而已.
|
5
msg7086 2020-06-18 17:54:19 +08:00
编码后的帧就是这个编码了呀。
比如说,你用 JPG 编码器编码一张图片,编码完的数据就是「 JPG 」了。 同理你用 x265 编码器编码一张图片,编码完的数据就是「 h.265 」了。 PB 帧存储的是残差,你只替换 I 帧当然是可以的,替换完以后新的残差都会基于新的 I 帧来渲染。平时如果视频文件损坏,有时候你会看到有一段会出现画面一小部分在移动或者显露出原本画面的效果,这就是典型的参考帧没了,所以拿 buffer 里错误的帧作参考对象的结果。 实际的视频里背景一般是不会静止的,会有摄影噪声。如果你提前用滤镜对噪声做过滤,或者在编码的时候在残差判定里直接跳过小容量残差的话,倒是可以做到的。但是画面编码的最小单位是块( h.264 是 mb,h.265 是 cu ),所以最少也是一块一块生效的。 要达到你说的那种效果,替换帧的做法是非常不现实的,研发成本高得惊人,效果稀烂。 |
6
hanguofu 2020-06-18 23:38:14 +08:00
问题比较多,我就以 264 为例解答一下: 编码后 I 帧是 rgb 或 yuv 等原始数据的图片还是像 jpg 之类的还有其他压缩?--- 类似 jpg 之类的. 有没有可能不解码,在保留 p b 帧原始数据(即关于 i 帧的相对变化)时,换掉 i 帧--------不解码你是不会知道哪个是 IPB 帧 。 p b 帧 是必须以 i 帧为参考,如果你换掉 i 帧, p b 帧很可能解不出来。视频抠图还是要先解码的。背景静止时只要 i 帧换背景 -----你想得太简单了, 背景”静止“ 时,这时候也有可能编码器编出 p b 帧 , 而不是仅用 i 帧 描述背景静止时的图像。除非你在启动编码器的时候,就指明了编码器只允许编出 I 帧 。
|
7
wnpllrzodiac 2020-06-19 07:25:32 +08:00 via Android
换背景还是要编码前做吧。后做是实时加绿幕?人工智能 segment 可以做。背景前景区分出来,加 mask 就可以了
|