iOS直播业务流程及H264编码

直播

伪流媒体

渐进式下载 : 边下边存, 文件会保存

使用http协议,也能够实现视频播放, 也能快进快退等, 体验上跟流媒体很像,
特点:实现简单, 成本也低

流媒体

边下边播, 不会保存文件

HLS (HTTP Live Streaming)

是苹果公司实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。原理上是将视频流分片成一系列HTTP下载文件。所以,HLS比RTMP有较高的延迟。HLS基于HTTP协议实现呢,传输内容給包括两部分,一是M3U8描述文件,二是TS媒体文件

RTMP (Real Time Messaging Protocol)

实时消息传输协议, 该协议基于TCP,是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.

Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议它有多种变种:

  • RTMP工作在TCP之上,默认使用端口1935;
  • RTMPE在RTMP的基础上增加了加密功能;
  • RTMPT封装在HTTP请求之上,可穿透防火墙;
  • RTMPS类似RTMPT,增加了TLS/SSL的安全功能;

RTMP优势

  • 实时性高:RTMP的实时性在3秒之内,经过多层CDN节点分发后,实时性也在3秒左右,在一些实时性有要求的应用中以RTMP为主。
  • 支持加密:RTMPE和RTMPS为加密协议
  • 稳定性高:HTTP也很稳定,但HTTP是在协议上稳定性不只是服务端的事情,在CDN分发,服务器管理,客户端的支持上

RTMP 使用

  • RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输一些控制信息
  • TMP协议传输时会对数据做自己的格式化,这种格式的消息我们称之为RTMP Message。而实际传输的时候为了更好地实现多路复用,分包和信息的公平性,发送端会把Message划分为带有Message ID的Chunk,每一个Chunk可能是一个单独的Message,也可能是Message的一部分,在接受端会根据chunk中包含的data的长度,message id和message的长度把chunk还原成完整的Message,从而实现信息的收发。

RTMP协议详解

Real Time Message Protocol(实时信息传输协议)的缩写,用来解决==多媒体数据传输流==的多路复用(Multiplexing)和分包(packetizing)的问题,靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性。

TCP-传输控制协议

  • 建立连接,形成传输数据的通道
  • 在连接中可进行大数据传输,数据大小不做限制
  • 通过三次握手完成连接,是可靠协议,安全送达
  • 必须建立连接,效率会降低

UDP-用户数据报协议

  • 将数据源和目的封装到数据包中,不需要建立连接
  • 每个数据包的大小限制在64K之内
  • 因为不需要连接,因此是不可靠协议
  • 不需要建立连接,速度快

RTMP握手

  • 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。
  • 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。
  • 当客户端和服务器分别收到S2和C2后,握手完成。
直播APP架构.png

完整的直播业务流程

  • 1.音视频采集(AVFoundation)
    • 摄像头(图像传感器)
    • 麦克⻛(声音传感器)
  • 2.视频滤镜(GPUImage)
    • 美颜
    • 水印
  • 3.音视频编码
    • 硬编码:视频:VideoToolBox | 音频: AudioToolBox
    • 软编码:视频编码H264 | 音频编码: AAC
  • 4.推流
    • 将采集的音频,视频数据发送到流媒体服务器
  • 5.流媒体服务器
    • 数据分发(CDN)
    • 截屏
    • 实时转码
  • 6.拉流
    • 从流媒体服务器获取⾳频、视频数据
  • 7.音视频解码
    • 视频解码:硬解码(VideoToolbox) | 软解码(X264)
    • 音频解码:硬解码(AudioToolBox) | 软解码(fdk_aac)
  • 8.音视频播放
    • ljkplayer:⼀一款开源强⼤大的播放器

直播需要技术点

1.采集视频、音频

  • 摄像头、⻨麦克⻛
  • 摄像头 CCD(图像传感器)
  • ⻨克风 拾⾳器(声音传感器)
  • 采集音视频数据
  • 导⼊入AV Foundation.Framework框 架
  • 从CaptureSession会话的回调中获取音视频数据

2.视频滤镜处理

  • 美颜
  • 水印
  • 使⽤用GPUImage美颜、⽔水印

3.视频、音频编码压缩

  • 硬编码
  • 视频:VideoToolBox 框架
  • 音频: AudioToolBox 框架
  • 软编码
  • 视频压缩

视频编码H264
X264把视频原数据YUV/RGB编码 H264

  • 音频压缩
  • 音频编码:mp3.AAC
  • fdk_aac将音频数据PCM转AAC

4.推流

推流:将采集的音频,视频数据通过流媒体协议发送到流媒体服务器

  • muxing(封装) 音视频封包成FLV或 者TS
  • 推流技术
  • 流媒体协议: RTMP\RTSP\HLS\FLV
  • 视频封装格式:TS\FLV
  • 音频封装格式:mp3\AAC

5.流媒体服务器处理数据

  • 数据分发(CDN)
  • 截屏
  • 录制
  • 实时转码

6.拉流

拉流:从流媒体服务器获取⾳频、视频数据

流媒体协议: RTMP\RTSP\HLS\FLV

7.视频、音频解码

  • demuxing(解封装)
    将FLV\TS文件分离出音视频
  • 视频解码
    硬解码(VideoToolbox)
    软解码(X264)
  • 音频解码
    硬解码(AudioToolBox)
    软解码(fdk_aac)

8.播放

ljkplayer:⼀一款开源强⼤大的播放器

9.聊天互动

IM及时通讯

聊天功能

第三⽅方及时通讯:融云、腾讯云

视频编码(H264)

通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式
硬编码:(硬件)定制性好,VideoToolBox
软编码:基于CPU, fmpeg

认知视频

即连续的图片(视频帧)

内容元素

  • 图像(Image)
  • 音频(Audio)
  • 元信息(Metadata)


    内容元素

编码格式

  • Video:H264/H265
  • Audio:AAC\HE-AAC

容器封装

  • MP4\MOV\FLV\RM\RMVB\AVI

视频(图像、音频)构成:-> 视频编码H264 -> 音频编码AAC -> 注明元数据 -> 容器封装打包MP4 -> 完整的视频文件

视频编码技术

  • MPEG 帧间压缩:存储连续帧直接的有差别
    的地⽅,从而达到较⼤的压缩⽐
  • H264 :比较
  • 单个画面清晰度比较, MPEG4 有优势,从动作连贯性上的清晰度,H264优势比较多
  • 264算法比较复杂,运行需要更多的资源,因此264优势比较高
  • 264使⽤更灵活,将一些实现留给⼚家
  • H265: 265是基于264,保留原来技术, 将相关的技术加以改进,例如码流、 编码质量、延时、算法复杂度之间的差额算法,达到最优化设置
  • 更⾼效的编码标准,能够在同等画质效果下将内容的体积压缩得更小,传输时更快更省带宽.
  • I帧:关键帧 解码关键(完整的图片),没有关键帧则编码失败
  • muxing(合成) 将视频流、音频流、字母流合成封装到一个文件中,作为一个信号进行传输

GOP : I、B、P

VideoToolBox

VideoToolBox基于Core Foundation库函数,C语言

创建Session -> 设置编码相关 参数 -> 开始编码 -> 循环输入元数据(直接向摄像头获取)-> 获取编码后的H264数据 -> 结束编码

补充

1.如何判断帧类型

如何判断帧类型.png

如何计算

如何计算帧类型

2.视频帧格式

视频帧格式

3.H264格式

H264格式.png

4.编码后数据

编码后数据

5.FFmpeg命令

ffmpeg -i H264文件 -i AAC文件 -vcodec copy -f MP4文件

ffmpeg -i /Users/xxx/Desktop/Video.h264 -i /Users/xxx/Desktop/Audio.aac -vcodec copy -f mp4 /Users/xxx/Desktop/Mp4.mp4

6.码率计算公式

码率计算公式.png

软编码是一种设计,而硬编码不过是一种具体的实现。

参考

LFLiveKit
已经实现了 后台录制、美颜功能、支持h264、AAC硬编码,动态改变速率,RTMP传输等,我们真正开发的时候直接使用就很方便啦。
LiveVideoCoreSDK
实现了美颜直播和滤镜功能,我们只要填写RTMP服务地址,直接就可以进行推流啦。
https://www.jianshu.com/p/27b3bb4695aa

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容