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

开始

以前一直作直播方面的开发,不过一直没机会接触一些推流和播放器的技术,因此业余时间本身去写了一下推流器模块的Demo。
html

本身也总结了一些经常使用的知识: git

推流器逻辑图

过程

模块构成

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

采集模块

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

如下是采集模块一些知识点api

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

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

iOS采集知识点app

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

GPUImage知识点ide

源码: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/…

相关文章
相关标签/搜索