iOS 视频直播技术

iOS 视频直播技术

  • 直播难:直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的。
  • 直播易:市场已经有很多成熟的案例了。最常用的如:腾讯、七牛的是SDK。也就是传说中的站在大牛肩膀上编程。
    在这里插入图片描述

直播环节:

  1. 推流端(采集美颜处理编码推流
  2. 服务端处理(转码录制截图鉴黄
  3. 播放器(拉流解码渲染
  4. 互动系统(聊天室礼物系统
    在这里插入图片描述

一、推流端:

采集音视频数据:
  • 主要挑战:
    1. 设备兼容性(尺寸、性能、支持清晰度)、
    2. 卡顿敏感(手机配置、丢帧处理、渲染流程解释为什么卡帧)、
    3. 图像的处理(如美颜、水印等)

  • 原生格式: 音频(PCM),视频(YUV/RGB

  • 采集可设置: 前后置、灯光、聚焦、fps、分辨率(针对硬件适配);音频采样频率、采样精度、声道等

1. 数据处理:
  • 音频:处理混音、降噪和声音特效等。

    • 增益降噪等处理可以使用 WebRTC 来声音处理,然后调用处理(一套是定点算法(noise_suppression_x.h),一套是浮点算法(noise_suppression.h))。
    • 如有播放背景音乐的混音要求。 可以使用 AudioUnitAudioToolBoxAVFoundation 将混音的背景音乐转成 PCM 数据,拷贝一份送入混音,原来的数据送入播放器。
  • 视频:美颜、水印、滤镜

    • 滤镜、美颜功能是直播标配,如果需要美白、水印、裁剪等处理效果,就必须处理拿到的buffer, 这个时候还要考虑到拿到的数据是YUV 还是 RGB
    • 但是 iOS 上是不能对 YUV 格式直接进行美颜处理,只能是 RGB 格式。
    • 可选择使用 GPUImage 库,调用 GPUImage 来进行采集和美白、水印、裁剪的处理,然后取出来进行编码上传,并显示在预览画面上。
2. 音视频编码:
  • 视频编码的意义:
    压缩视频大小,满足实时传输要求。所以从视频采集传感器采集来的原始视频势必要经过视频编码。
    例子: 原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB ,原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟。而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms ,可以满足实时传输的需求。

  • 编码首先要开启编码器,软编码就是利用CPU资源来压缩音视频数据,硬编码与之相反。

    • 软编码: 现在广泛采用FFmpeg库结合编码库来实现,FFmpeg + x264 来编码视频数据YUV/RGB 输出 H264 数据, FFmpeg+fdk_aac 来编码音频数据 PCM 输出 AAC 数据。
    • 硬编码: iOS 8之后开放了硬解码和硬编码AP,所以基本上都是选择VideoToolBoxAudioToolBox 进行图像和音频的硬编码。
3.封包推流:

推流,将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。
在这里插入图片描述

  • 推流协议选择: 现在直播应用,采用RTMP协议居多,也有部分使用HLS协议。

    • 采用RTMP协议,就要看下它与流媒体服务器交互的过程,RTMP协议的默认端口是1935,采用TCP协议,并且需要了解FLV的封装格式
    • 采用HLS协议,因为涉及到切片,延时会比较大,需要了解TS流。
  • 几种常用推流技术对比:
    在这里插入图片描述

4.补充:
  • 视频处理框架有哪些?
    1. GPUImage : GPUImage是一个基于OpenGL ES的一个强大的图像/视频处理框架,封装好了各种滤镜同时也可以编写自定义的滤镜,其本身内置了多达120多种常见的滤镜效果。
    2. OpenGL: OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
    3. OpenGL ES:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集 ,针对手机、PDA和游戏主机等嵌入式设备而设计。

  • 视频编码解码相关:

    • 视频编码框架?
    1. FFmpeg:是一个跨平台的开源视频框架,能实现如视频编码,解码,转码,串流,播放等丰富的功能。其支持的视频格式以及播放协议非常丰富,几乎包含了所有音视频编解码、封装格式以及播放协议。X264: 把视频原数据 YUV 编码压缩成H.264格式。
    2. VideoToolbox: 苹果自带的视频硬解码和硬编码API,但是在iOS8之后才开放。
    3. AudioToolbox: 苹果自带的音频硬解码和硬编码API
    • H.264/HEVC:
      一种视频压缩方式,基于H.264,保留原来的某些技术,同时对一些相关的技术加以改进,以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。

    • H.265:
      是一种更为高效的编码标准,能够在同等画质效果下将内容的体积压缩得更小,传输时更快更省带宽

    • H264中 I帧P帧B帧的含义?

    1. I帧:第一幅图片是被单独编码成一个单元(NALU)的,在H264中我们定义关键帧(用字母I表示,I帧包含一幅图片的所有信息,可独立解码成一幅完整的图片)
    2. P帧:后面的第二个单元一直到第十个单元中的每一个单元我们定义为P帧差别帧,因为它不包含完整的画面,只包含和前面帧的差别的信息,不能独立解码成一幅完整的图片,需要和前面解码后的图片一起才能解码出完整的图片)。
    3. B帧:当然H264中还有B帧双向帧,需要前后的数据才能解码成单独的图片)
    • 视频封装格式?
    1. TS: 一种流媒体封装格式,流媒体封装有一个好处,就是不需要加载索引播放,大大减少了首次载入的延迟,如果片子比较长,mp4文件的索引相当大,影响用户体验。
      为什么要用TS:这是因为两个TS片段可以无缝拼接,播放器能连续播放
    2. FLV: 一种流媒体封装格式,由于它形成的文件极小加载速度极快,使得网络观看视频文件成为可能。因此FLV格式成为了当今主流视频格式。
    • 流媒体开发?
      网络层(socketst)负责传输,协议层(rtmphls)负责网络打包,封装层(flvts)负责编解码数据的封装,编码层(h.264aac)负责图像,音频压缩。

    • 视频文件格式?
      文件的后缀。比如.wmv.mov.MP4.mp3.avi

二、服务端:

1.常用服务器
  • SRS: 一款国人开发的优秀开源流媒体服务器系统。
  • BMS: 也是一款流媒体服务器系统,但不开源,是SRS的商业版,比SRS功能更多。
  • nginx:免费开源web服务器,常用来配置流媒体服务器
2.数据分发
  • CDN:(Content Delivery Network)
    内容分发网络。将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况提高用户访问网站的响应速度
    回源: 当有用户访问某一个URL的时候,如果被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取搜索。如果没有人访问,那么 CDN节点不会主动去源站拿

    • CDN:代理服务器,相当于一个中介。
    • CDN工作原理:比如请求流媒体数据:
    1. 上传流媒体数据到服务器 (源站)
    2. 源站存储流媒体数据;
    3. 客户端播放流媒体,向CDN请求编码后的流媒体数据;
    4. CDN的服务器响应请求,若节点上没有该流媒体数据存在,则向源站继续请求流媒体数据;若节点上已经缓存了该视频文件,则跳到第6步。
    5. 源站响应CDN的请求,将流媒体分发到相应的CDN节点上;
    6. CDN将流媒体数据发送到客户端;
  • 带宽:在固定的时间可传输的数据总量。
    比如64位、800MHz的前端总线,它的数据传输率就等于 64bit×800MHz÷8(Byte)=6.4GB/s 。

  • 负载均衡:

    1. 多台服务器对称的方式组成一个服务器集合
    2. 每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。
    3. Qos(带宽管理): 限制每一个组群的带宽,让有限的带宽发挥最大的效用。

    负载均衡作用:

    1. 通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求
    2. 均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题
    3. 这种群集技术可以用最少的投资获得接近于大型主机的性能
3.截图 待补充
4. 鉴黄 待补充

三、播放器:

1.拉流
  • 直播协议选择:
  1. 即时性要求较高或有互动需求的可以采用RETPRTSP
  2. 对于有回放或跨平台需求的,推荐使用HLS
  • 直播协议对比:
    在这里插入图片描述
    • HLS:Apple公司定义的用于实时流传输的协议HLS基于HTTP协议实现,传输内容包括部分,一是M3U8描述文件,二是TS媒体文件。可实现流媒体的直播和点播,主要应用在iOS系统。

      • HLS 是以点播的技术方式来实现直播。
      • HLS是自适应码率流播。客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。
      • 实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整
    • HLSRTMP对比:

      • HLS主要是延时比较大,RTMP主要优势在于延时低。
      • HLS协议的小切片方式会生成大量的文件,存储或处理这些文件会造成大量资源浪费
      • 相比使用RTSP协议的好处在于:一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了CDN边缘服务器的配置要求。可以使用任何现成的CDN,而一般服务器很少支持RTSP。
    • HTTP-FLV:基于HTTP协议流式的传输媒体内容。相对于RTMP,HTTP更简单和广为人知,内容延迟同样可以做到1~3秒,打开速度更快,因为HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP。

    • RTSP:实时流传输协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。

    • RTP: 实时传输协议,RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。

    • RTCP:RTP的配套协议。主要功能是为RTP所提供的服务质量(QoS)提供反馈,收集相关媒体连接的统计信息。例如传输字节数,传输分组数,丢失分组数,单向和双向网络延迟等等。

2.解码
  1. 解封装:
    demuxing(分离):从视频流、音频流,字幕流合成的文件(容器格式 FLV/TS)中, 分解出视频、音频或字幕,各自进行解码

  2. 音频编码框架:
    fdk_aac:音频编码解码框架,PCM音频数据和AAC音频数据互转。

  3. 解码介绍:

    1. 硬解码:用GPU来解码,减少CPU运算
      优点:播放流畅、低功耗,解码速度快。
      缺点:兼容不好。
    2. 软解码:用CPU来解码
      优点:兼容好。
      缺点:加大CPU负担,耗电增加、没有硬解码流畅,解码速度相对慢。
3.播放
  • IJKPlayer :一个基于FFmpeg的开源Android/iOS视频播放器
    • API易于集成;
    • 编译配置可裁剪,方便控制安装包大小;
    • 支持硬件加速解码,更加省电
    • 简单易用,指定拉流URL,自动解码播放.
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值