直播可谓风生水起, 热火朝天, 借此也对音视频进行一次深入学习, 希望有需要的大家一块学习.
第一步对直播的大概流程概括如下:
1.直播人设备端:从摄像头获取视频流,然后使用rtmp服务提交到服务器
2.服务器端:接收直播人提交的rtmp视频流,并为观看者提供rtmp源
3.观看者:用播放器播放rtmp源的视频.
技术流程图如下:
第一: 音视频传输的常见协议
1.1 RTMP协议
Real Time Messaging Protocol 是Adobe公司为Flash播放器和服务器之间音、视频及数据传输开发的
实时消息传送协议。协议中,视频必须是H264编码,音频必须是AAC或MP3编码,且多以flv格式封包。
1.2 HLS协议
Http Live Streaming 是由Apple公司定义的基于HTTP的流媒体实时传输协议。它的原理是将整个流分
为一个一个小的文件来下载,每次只下载若干个。传输内容包括两部分:一是M3U8描述文件,
二是TS媒体文件。TS媒体文件中的视频必须是H264编码,音频必须是AAC或MP3编码。
第二: 客户端需要操作的步骤
1. 音视频的采集;
2. 对视频进行H264编码,对音频进行AAC编码;
3. 对编码后的音、视频数据进行FLV封包;
4. 建立RTMP连接并上推到服务端。
第三: 实现方式---第三方(一)
很多第三方都提供SDK,七牛云、金山云、乐视云、腾讯云、百度云、斗鱼直播伴侣推流端等等,功能几乎都是一样的,不同的是整个直播平台服务差异和接入的简易性。后端现在 RTMP/HTTP-FLV 清一色,App挂个源站直接接入云厂商或CDN就OK。摘录自JIAAIR.
建议了解一下其中的原理再使用第三方, 所谓: 知其然知其所以然 +_-
第四: 实现方式---知其然知其所以然(二)
4.1 软编软解与硬编解码的概念
1. 软编软解: 利用CPU做视频的编码和解码; 占用CPU资源,编解码效率不高;
2. 硬编解码: 利用GPU或者专用处理器来对视频流进行编解码,也就是硬件编码和解码.在iOS 8.0后,
苹果将该Video ToolBox(之前在Mac系统中使用)框架引入iOS系统。
4.2 视频编码的两种方案
1. 利用第三方库FFmpeg 进行编码,FFmpeg因其跨平台及功能丰富等诸多优势,被广泛使用。---软编软解;
2. 利用iOS自身的 AVAssetWriter 或VideoToolBox.framework 的VTCompressionSession进行编码。 ---硬编解码
2.1 使用AVAssetWriter编码需要将视频写入本地文件,然后通过实时监听文件内容的改变,读取文件并处理封包。
2.2 从iOS8开始,VideoToolBox提供了硬件编码支持,可以使用VTCompressionSession进行编码。
4.3 音频AAC是神马?
AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
4.4 视频编码H264
总的来说 H264结构
H264的码流由NALU单元组成;
NALU单元包含
视频图像数据
和H264的参数信息
;视频图像数据就是CMBlockBuffer;
H264的参数信息包含
SPS(Sequence Parameter Set)
和PPS(Picture Parameter Set)
.
H264码流的结构如下图:
更详细内容(NALU数据格式)详见---RTMP中FLV流到标准h264、aac的转换
4.5 编码解码的总的流程
从iOS8开始
开发者可以调用Video Toolbox框架
提供的接口,来对视频进行硬件编解码
的工作,为VOIP视频通话,视频流播放等应用的视频编解码
。
Video Toolbox结构
1. CVPixelBuffer:编码前和解码后的图像数据结构;
2. CMTime、CMClock和CMTimebase:时间戳相关。时间以64-bit/32-bit的形式出现;
3. CMBlockBuffer:编码后,结果图像的数据结构;
4. CMVideoFormatDescription:图像存储方式,编解码器等格式描述;
5. CMSampleBuffer:存放编解码前后的视频图像的容器数据结构。
编码解码的总的流程如图所示
1. 编解码前后的视频图像均封装在CMSampleBuffer中;
2. 编码后的图像,以 CMBlockBuffer 方式存储;
3. 解码后的图像,以 CVPixelBuffer 方式存储。
4. CMSampleBuffer里面还有另外的 时间信息CMTime 和 视频描述信息CMVideoFormatDesc 。
第五: FLV文件
5.1 FLV是什么?
flv是一种视频格式.
FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。tag又可以分成三类:audio,video,script
,分别代表音频流,视频流,脚本流
,而每个tag又由tag header
和tag data
组成。
注:
封包的时候要特别注意一下包头里面的时间戳,因为这个控制着播放的速度,如果不填,全是0的话,播放会相当快,
一般按视频帧率来设置。我这个h264流是8帧的,所以我每个tag的时间间隔是125ms左右。
注意:本文归作者所有,未经作者允许,不得转载