即时通迅和直播iOS 直播视频iOS低频高技收集

iOS直播---主要的概念(一)

2016-07-28  本文已影响1282人  simuty

直播可谓风生水起, 热火朝天, 借此也对音视频进行一次深入学习, 希望有需要的大家一块学习.

第一步对直播的大概流程概括如下:

1.直播人设备端:从摄像头获取视频流,然后使用rtmp服务提交到服务器
2.服务器端:接收直播人提交的rtmp视频流,并为观看者提供rtmp源
3.观看者:用播放器播放rtmp源的视频.

技术流程图如下:

Paste_Image.png

第一: 音视频传输的常见协议

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编码。

图片

图片转载自JIAAIR

第二: 客户端需要操作的步骤

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结构

  1. H264的码流由NALU单元组成;
  2. NALU单元包含视频图像数据H264的参数信息;
  3. 视频图像数据就是CMBlockBuffer;
  4. H264的参数信息包含SPS(Sequence Parameter Set)PPS(Picture Parameter Set).

H264码流的结构如下图:

189370-f297372d2c3fc69c.png

更详细内容(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:存放编解码前后的视频图像的容器数据结构。

编码解码的总的流程如图所示

189370-ba7ebf7c64fd41bb.png
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 headertag data组成。

注:

封包的时候要特别注意一下包头里面的时间戳,因为这个控制着播放的速度,如果不填,全是0的话,播放会相当快,
一般按视频帧率来设置。我这个h264流是8帧的,所以我每个tag的时间间隔是125ms左右。

iOS直播---音/视频解码(四)
iOS直播---音/视频编码(三)
iOS直播---音/视频采集/压缩(二)

参考资源

  1. iOS RTMP上推直播视频
  2. iOS平台基于ffmpeg的视频直播技术揭秘
  3. iOS RTMP 视频直播开发笔记(3)
  4. iOS音频AAC视频H264编码 推流最佳方案
  5. 视频直播解决方案-搭建你自己的直播平台
  6. 知乎网友
  7. LFLiveKit推流库使用
  8. iOS8系统H264视频硬件编解码说明
  9. CSDN博客系列文章--RTMP
  10. 鏖战双十一-阿里直播平台面临的技术挑战
  11. 关于IOS VideoToolBox的一些汇总
  12. 视频工具箱和硬件加速

更多精彩内容请关注“IT实战联盟”哦~~~


IT实战联盟.jpg
上一篇下一篇

猜你喜欢

热点阅读