iOS推流器模块知识点浅谈总结

开始

之前一直做直播方面的开发,不过一直没机会接触一些推流和播放器的技术,所以业余时间自己去写了一下推流器模块的Demo。

自己也总结了一些常用的知识:

推流器逻辑图

过程

模块构成

我将推流器看成五块知识点,分别是:采集、处理、编码、封包、推流。

采集模块

采集是将机器获得的图片和视频转成一帧帧图像数据返回到开发者手中。

以下是采集模块一些知识点

yuv、rgb、ycbcr的颜色空间模型知识点:

硬知识点,请参考: blog.csdn.net/u010186001/…

iOS采集知识点

iOS下通过硬件采集到的图像数据会用CMSampleBufferRef来保存回调到使用者手中。 CMSampleBufferRef结构如下:(音频:结构体内的CVPixelBuffer替换成CMBlockBuffer),CVPixelBuffer就是RGB/YUV/YCBCR的数据。

GPUImage知识点

源码:github.com/BradLarson/…

GPUImage是IOS上基于opengl的图像、视频处理开源框架,里面带有大量的滤镜,同时也很方便在原有基础上加入自己的滤镜Filter,所有滤镜是基于opengl shader实现的,所以滤镜效果图像处理是在GPU上实现的,处理效率比较高。

GPUImage基本架构是chain式结构,主要由一个GPUImageOutput interface和一个GPUImageInput protocol串联起来,GPUImageOutput输出Texture,GPUImageInput输入Texture,整个链式图像数据传递由Texture负责。camera,stillimage等图像、视频sources继承自GPUImageOutput,滤镜Filters继承自GPUImageOutput并实现GPUImageInput,View,FileWriter等Outputs实现GPUImageInput。

处理模块

OpenGL ES 地址:www.khronos.org/opengles/

Metal 地址:developer.apple.com/documentati…

Metal 是一个和 OpenGL ES类似的面向底层的图形编程接口,通过使用相关的 api 可以直接操作 GPU ,最早在 2014 年的 WWDC 的时候发布,并于今年发布了 Metal 2,是苹果的一个亲儿子。

Metal框架支持GPU硬件加速、高级3D图形渲染以及大数据并行运算。且提供了先进而精简的API来确保框架的细粒度(fine-grain),并且在组织架构、程序处理、图形呈现、运算指令以及指令相关数据资源的管理上都支持底层控制。其核心目的是尽可能的减少CPU开销,而将运行时产生的大部分负载交由GPU承担。

(以后需要继续研究Metal)

GPUImageFilter

源码:github.com/BradLarson/…

可以参考:www.jianshu.com/p/468788069…

编码知识点

最广泛最常用的格式 H264

I帧

帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)

帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性。因此,在对一给定宏块编码时,首先可以根据周围的宏块预测(典型的是根据左上角宏块、左边宏块和上面宏块,因为此宏块已经被编码处理),然后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,可以大大减小码率。

H.264提供9种模式进行4×4像素宏块预测,包括1种直流预测和8种方向预测。在图中,相邻块的A到I共9个像素均已经被编码,可以被用以预测,如果我们选择模式4,那么,a、b、c、d4个像素被预测为与E相等的值,e、f、g、h4个像素被预测为与F相等的值,对于图像中含有很少空间信息的平坦区,H.264也支持16×16的帧内编码。

I帧特点:

  1. 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
  2. 解码时仅用I帧的数据就可重构完整图像;
  3. I帧描述了图像背景和运动主体的详情;
  4. I帧不需要参考其他画面而生成;
  5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  6. I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  7. I帧不需要考虑运动矢量;
  8. I帧所占数据的信息量比较大。

P帧

前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据) P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

  1. P帧是I帧后面相隔1~2帧的编码帧;
  2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
  4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
  5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
  6. 由于P帧是参考帧,它可能造成解码错误的扩散;
  7. 由于是差值传送,P帧的压缩比较高。

B帧

双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。所以移动端一般不解压B帧。

B帧的预测与重构 B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点

  1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
  2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
  3. B帧是双向预测编码帧;
  4. B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
  5. B帧不是参考帧,不会造成解码错误的扩散。

VideoToolBox

iOS8以上才支持,硬编码库。

VideoToolBox:developer.apple.com/documentati…

FFmpeg

iOS暂时支持软编码,不过软编码适配比较多格式和机型。

##推流知识点

Rtmp协议

是Adobe的一个没有完全公开的基于TCP上的协议。

优点:延迟低,正常来说3s左右。而且支持加密。 缺点:iOS、安卓来说需要另外支持的播放器来播放,H5也没办法直接播放Rtmp协议的,所以很多H5也会用HLS来播放。还有一点是Rtmp基于TCP协议,所以RTMP会累积延时,所以当累积到一段时候需要清除延时。

协议:www.adobe.com/devnet/rtmp…

HLS协议和HTTP协议

优点:协议简单,性能高。 缺点:延时比较高,而且HLS延时是根据分块大小决定。

Demo

github:github.com/KoonChaoSo/…

猜你喜欢

转载自juejin.im/post/5bf7cf76e51d455bfe2605b9