2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮。然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知识。目前大部分直播采用的都是RTMP协议,我这里写一个简单的Demo,帮助大家更好的理解直播推流的过程,主要包括:音视频采集、音视频编码、数据打包、RTMP协议等相关的知识等。项目结构分的很清楚,各个模块也用协议进行了分离,方便大家学习不同的模块。

先阐述下推流的整体流程:

  • 建立tcp连接

  • 建立rtmp连接,以及发送各种控制指令

  • 获取原始视频数据和音频数据

  • 对原始视频数据和音频数据进行压缩编码

  • 编码后的视频数据和音频数据进行打包

  • 发送打包后的音频和视频数据

项目各个类的作用

  • SGSimpleSession 是Api接口层,负责对外提供可直接调用的接口,同时也是一个数据分发中心,获取到的原始音视频数据和编码后的数据都在这里被分发到不同的类进行处理.

  • 视频相关的类

1.SGVideoSource 原始视频数据获取类,底层用的是AVFoundation框架来实现。对外提供原始未经编码的的视频数据,同时提供图像预览功能。如果需要添加美颜,摄像头切换,翻转,闪光灯等操作,也是在这里处理的。

原始视频帧:原始视频数据其实就是一帧一帧的数据,它们没有经过压缩编码,每一帧包含了图像信息和时间信息,我们通过代码提取出图片。

fps:1s中包含的帧数就是帧速(fps),一般fps的范围是15~30帧,帧速越高画面越流畅,带宽消耗量越大。实际直播中,大部分采用15到20就可以了。

分辨率:一帧的图像的大小,iOS原生的有352*288,640*480,1280*720等。一般直播采用640 *480,然后裁剪为640 *360.

码率:也叫比特率,数据传输时单位时间传送的数据位数。可以理解为码率决定一帧图像的显示精细程度。在一定范围内,码率越大,图像越清晰,消耗带宽或者文件体积就越大。超过一定范围后,清晰度不变.一般640 * 480分辨率的,码率512kbps就能够保证清晰度。

2.SGVideoConfig这个视频配置的类,主要包括压缩等级,分辨率,码率等的配置。

3.SGH264Encoder这个类是编码器,主要功能是对原始的视频帧进行编码压缩处理,这里采用的是`硬编码`,编码输出格式为H264格式。

编码:编码是指将原始的帧数据编码压缩,编码后数据更小,方便在网络上传输。原始数据体积较大,网络传输十分不方便,因此需要将数据压缩,视频压缩算法当前比较主流的是H264,这里我们压缩格式是H264格式。H264有不同的压缩等级,压缩等级不同,压缩比也不同.常见的压缩等级有:baseline ` , `main` 和`high`.

硬编码:硬编码是相对软编码而言的,一般软编码是通过cpu来运算,比较消耗cpu性能,耗时大,但是兼容性好,软编码一般采用ffmpeg或者x264。相对而言,硬编码使用gpu来编码,速度效率很高。这里采用的是iOS自带的硬解码,只支持iOS8以后的系统。

压缩后的视频帧:压缩后的视频有三种帧类型:I ,B ,P帧,I帧也叫关键帧。经过解码后能够独立展示出一幅图像,P帧是前向预测帧,参考前一帧才能解码显示出一幅完整的图像。B 为双向预测帧,必须参考前一帧和后一帧才能解码出图像,因此帧的压缩比最低,大约为0.7,它只能采用帧内压缩,P帧压缩比次之,大概能达到0.5,B帧压缩比则更高,达到了0.3~0.5。B帧和P帧采用的是帧内压缩和帧间压缩技术(也就是运动估计,原理是相邻帧的图像有一部分是一样的,专业术语叫空间冗余)。实际上,视频压缩等级不同,帧种类也不同,比如`baseline等级`压缩后的视频只有I帧 和 P帧。`main等级` 和 `high等级` 则三种帧都包含,它们的整体压缩比要比`baseline`要高。但是因为B帧需要参考前一帧和后一帧才能显示,很容易造成卡顿情况,因为万一后面的帧没有获取到,导致前一帧已也不能显示,所以在实际应用中(直播app),一般压缩等级采用`baseline`.

gop:这个我试着描述一下:因为除了I帧,其它帧都不能独立渲染显示,理论上只需要一个I帧,其它全部是非I帧,,这样压缩比最高,但是因为`(B帧和P帧)参考其他帧`的原因会有一定的误差,当一段时间后,累计误差会原来越大,导致图像失真。解决办法就是以一小段为一个单元,每个单元第一帧都是I帧,这样即使前面某一小段出了问题也不会影响后面的一小段,每一个小段我们称作一个关gop。每个gop的第一帧一定是关键帧,因为你的没得参考;通常我们设置gop的大小为1s到3s,因此关键帧与关键帧之间的间隔就是1s的帧数(对应gop为1s)到3s的帧数(对应gop为3s),根据上面的定义,1s的帧数为fps,因此关键帧间隔为1*fps 到 3*fps。秒开的优化点之一就是减小gop大小,因为gop第一帧是关键帧,能独立渲染出来,用户进入直播间的时间是随机的,为确保用户尽快拿到关键帧,尽快渲染出图像;同时gop越小,关键帧数量就越多,带宽消耗量就越大。

4.SGH264Packager 这个类负责对已经编码好的H264帧数据进行打包处理,打包成符合RTMP协议格式的数据,然后才能发送.

  • 音频相关类

SGAudioSource 这个类主要负责录制音频数据,输出原始音频帧,音频的格式为PCM格式。

SGAudioConfig 这个类是音频配置相关的类,主要包括声道数,码率,采样率的配置。

SGAACEncoder 这个类作用是将原始PCM音频数据进行编码压缩,编码结果为AAC格式的音频数据,这里采用的是硬编码,软编码的库有faac.

SGAACPackager 这个了类作用是将编码后的AAC格式数据大波按成符合RTMP协议的数据。

  • RTMP相关类

`SGStreamSession`这个类主要是用来建立tcp连接,底层数据的读取和发送,以及连接状态的回调,整个连接状态贯穿整个项目,十分重要。

`SGRtmpSession`这个类主要与RTMP相关,主要负责与服务器交互,包括RTMP握手,指令的发送,对数据的进一步封装,封装成消息,然后再发送.指令有很多,说点重要的,比如握手完成以后,要重新协商消息大小(默认128字节),但是128字节太小,影响效率,一般都稍微改大点,比如这里设置为16kb,如果太大也不好,会导致带宽浪费。这个类涉及到rtmp相关的比较多,比较难以理解,网上有开源的实现librtmp这个库,可以用这个来替代。

以上就是整个项目的基本结构,整个过程类似工厂流水线,可以自行对各个模块进行替换和研究。demo中注释也不少,方便理解。是不是感觉信息量有点大?可能有些地方说的不严谨,还望大家多多指正哈。

这个项目在去年7月份左右就写完了,后来加了一些乌七八糟的东西,后来项目挂了,转战新项目(还是直播)。中间写过几篇入门文章,本来打算写成一个系列文章,无奈太忙了,写的不完整。新年伊始,趁着项目不太忙,赶紧整理了一下,纯码字,如果有任何问题可以直接留言。

  • 附上完整的代码:https://github.com/iOSSinger/SGLivingPublisher

  • 附上个人博客:http://www.jianshu.com/u/7246ea6d05dd

  • 附上RTMP中文文档:https://raw.githubusercontent.com/iOSSinger/SGLivingPublisher/master/RTMP.docx

附上学习博客:

  • 雷晓华博士的博客:这个是非常好的视音频开发技术文章,喜欢视音频的可以看看http://blog.csdn.net/leixiaohua1020

  • 硬编码的详细说明:http://www.jianshu.com/p/a6530fa46a88

不用任何第三方,写一个RTMP直播推流器相关推荐

  1. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  2. 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )

    文章目录 安卓直播推流专栏博客总结 一. Android RTMP 直播推流简介 二. Nginx.RTMP Module 编译环境源码准备 三. pcre.OpenSSL.zlib 函数库安装 四. ...

  3. Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序

    经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行h264视频编码和aac音频编码,并发送到RTM ...

  4. 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 阿里云服务器购买 二. 远程服务器控制软件 三. 配置 Ubuntu 服务器 1 . 更新 apt 源 2 . 安装 pcre.OpenSSL.zlib 库 ...

  5. 魔坊APP项目-26-直播、docker安装OSSRS流媒体直播服务器、基于APICloud的acLive直播推流模块实现RTMP直播推流、直播流管理

    一.docker安装OSSRS流媒体直播服务器 在外界开发中, 如果要实现直播功能.常用的方式有: 1. 通过第三方接口来实现.可以申请阿里云,腾讯云,网易云,七牛云的直播接口,根据文档,下载集成SD ...

  6. windows下ffmpeg+nginx-rtmp环境搭建及opencv+ffmpeg+python实现拉流和rtmp直播推流

    由于工作需要最近在研究rtsp拉流与直播推流的问题,目前先在我本机上进行了实验,本博客记录学习的内容,包含windows下ffmpeg.nginx-rtmp环境搭建及opencv+ffmpeg+pyt ...

  7. 本系列介绍了rtmp直播推流全过程(已完结)

    本系列介绍了rtmp直播推流全过程 完整项目地址 (已完结) 以下文章是针对每一个情况,介绍音视频相关知识,以及实现的原理,总共分五章: 第一章:直播推流全过程:视频数据源之YUV(1) RGB或YU ...

  8. 用安卓RTMP直播推流进行音频侦听时,出现播放几秒后就无法播放问题的解决方法

    Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议. ...

  9. rtmp直播推流 app-livestream v0.0.1.002 发布

    rtmp直播推流 app-livestream 使用说明书 2020-07-14  Win64位版本v0.0.1.002发布    Author: hybase@qq.com  QQ: 2320768 ...

最新文章

  1. ORACLE常用的动态性能视图
  2. MYSQL 与 Oracle 之间的数据类型转换
  3. 如何更改Joomla中的默认语言
  4. Excel XP受损文件的急救三招
  5. 【微信小程序】数组操作
  6. 给plt.axvline设置图例(label)
  7. 会计用计算机很快是,40个超实用电脑快捷键,老会计都在用!
  8. 使用W3C标准的DOM处理XML文件[C++和Java版]
  9. javascript对数组的操作
  10. FIAA固定资产【03资产主数据】
  11. hg6201m怎么设置虚拟服务器,移动光猫HG6201M定期重启设置
  12. selenium chromedriver 下载地址
  13. 微信公众号网页授权登录
  14. 游戏中的心理学(四):让用户掏腰包的秘密
  15. 计算机指法基础知识,电脑打字基础知识及打字指法
  16. 优盘插计算机上成快捷方式,u盘一插就变成快捷方式打不开怎么办 u盘变成快捷方式怎么办...
  17. 热点信号放大(WISP)、万能中继(Client+AP)+AP
  18. oracle中字段类型为date存储数据精确到时分秒的问题
  19. 仿简书,知乎pc官网顶部导航栏上下滚动效果
  20. windows phonegap android,phonegap windows 安装

热门文章

  1. 项目/程序的流程走向
  2. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
  3. [linux内核][linux中断]——软中断机制
  4. ubuntu修改主机名后无法解析主机
  5. 微软的研发思路发生改变了 Visual Studio 2012 Update 1抢先看
  6. OpenLayers 动态添加标记(Marker)和信息窗(Popup)
  7. 金融时报:谷歌撤离中国有99.9%的可能性
  8. C#枚举系统安装的所有打印机
  9. ASP.NET2.0 GridView小技巧汇粹
  10. 邮件发送类,支持HTML格式,支持优先级设置