3度转码帧I420 RGBA BGRA

时间:2018-06-09 13:39:03

标签: c++ opengl video sfml libvlc

接收原始视频帧时,帧包含在I420格式中。

如果你相信VideoLAN wiki,解码所有视频时的标准格式(没有libi420_rgb_plugin模块和/或libi420_rgb_plugin),每帧都以I420格式给出

来自VideoLAN YUV页面的引用:

  

I420

     

它具有亮度"亮度"首先是平面Y,然后是U色度平面   最后是V色度平面。

     

对两个色度平面(蓝色和红色投影)进行子采样   水平和垂直尺寸均为2倍   要说,对于2x2平方的像素,有4个Y样本但只有1个U.   样品和1 V样品。

     

此格式要求4 *像素为4 * 8 + 8 + 8 = 48位,因此其深度为12   每像素位数。

     

I420是迄今为止VLC中最常见的格式。大多数视频解码器   输出I420格式的原始图片。

     

图解说明:每个字母代表一位。

For a single I420 pixel: YYYYYYYY UU VV
For a 50-pixel I420 frame: YYYYYYYY*50 UU*50 VV*50 (or Y*8*50 U*2*50 V*2*50 for short)
For an n-pixel I420 frame: Y*8*n U*2*n V*2*n

从书面文章中只有一个是可以理解的,这种格式中包含的框架重量较轻,但是阅读和转换为这种或那种格式更加困难。从不清楚需要将多少内存分配给例如1920x1080的大小的帧开始,并且对于软件转码2个缓冲区,原始帧和重新编码的帧可能是必需的。关于CPU时间,所需格式的编码成本以及图片输出的许多问题都来自这里。

可以使用现成的解决方案,例如RV32,但SFML会以BGRA格式创建纹理,但渲染的帧格式带有色度RV32 RGBA即。这里有一个用于重新排列颜色通道的顶部费用R <-> B。在我的弱电脑上,&#34;转码成本&#34; /重新排列频道,大约需要22-150ms,如果视频的帧速率不高于每秒60帧,且大小不超过1080p

在论坛的某个地方,我看到通过opengl更改颜色通道,有一个&#34;硬件/软件&#34;我不完全理解排列,但是,立即写出成本很高。因此问题是,获取RAW图像并在需要的图像中编码一次并不容易吗?是否有任何解决方案可以在硬件级别执行此类操作而无需触及软件部分?

1 个答案:

答案 0 :(得分:1)

  

是不是更容易获得RAW图像,并在需要的图像中编码一次

可能,但大多数视频应用程序在渲染大小上使用YUV,因此优化了它。并且YUV通常可以压缩为较小的文件,因为您可以在色度平面上进行更多的量化。

  

是否有任何解决方案可以在硬件级别执行此类操作而无需触及软件部分?

你的意思是硬件加速颜色转换?是的,但如果你只是转换为渲染,你通常可以跳过转换写入YUV纹理/表面。