不用第三方写一个简单的推流软件

2023-05-16

https://github.com/iOSSinger/SGLivingPublisher

不用第三方写一个简单的推流软件
  •  commits
  •  branch
  •  releases
  •  contributor
  1.  Objective-C 100.0%
Objective-C
Find file
Latest commit 122566b on 16 Feb @iOSSinger iOSSinger  更新readMe
SGLivingPublisher 更新Readme 7 months ago
README.md 更新readMe 7 months ago
RTMP.docx 添加rtmp文档 7 months ago

 README.md

#iOS不用任何第三方,写一个简单的RTMP直播推流器

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


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

  • 建立tcp连接
  • 建立rtmp连接,以及发送各种控制指令
  • 获取原始视频数据和音频数据
  • 对原始视频数据和音频数据进行压缩编码
  • 对编码后的视频数据和音频数据进行打包
  • 发送打包后的音频和视频数据

项目各个类的作用

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

  • 视频相关的类

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

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

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

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

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

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

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

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

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

      压缩后的视频帧 : 压缩后的视频有三种帧类型:I ,B ,P帧,I帧也叫关键帧.经过解码后能够独立展示出一幅图像,P帧是前向预测帧,参考前一帧才能解码显示出一幅完整的图像.B 为双向预测帧,必须参考前一帧和后一帧才能解码出图像.因此,I帧的压缩比最低,大约为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越小,关键帧数量就越多,带宽消耗量就越大.

    • 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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不用第三方写一个简单的推流软件 的相关文章

随机推荐

  • Jacobian矩阵和Hessian矩阵

    1 Jacobian 转载自 xff1a http jacoxu com p 61 146 在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a
  • 打工与乘公交

    去一个公司打工就如同上了一辆公交车 在上车之前 xff0c 你应该清楚自己打算去哪里 xff0c 打算在哪里下车 有的公交车很豪华 xff0c 有的很破烂 xff0c 但是这并不是重点 xff0c 所有能开到目的地的车都是好车 上了车之后
  • 卡尔曼滤波器(从vchelp的算法论坛上看到的)

    卡尔曼滤波器 Kalman Filter 1 xff0e 什么是卡尔曼滤波器 xff08 What is the Kalman Filter xff09 在学习卡尔曼滤波器之前 xff0c 首先看看为什么叫 卡尔曼 跟其他著名的理论 xff
  • 第4篇 FreeRTOS是如何工作的---基本原理3(上下文切换)

    上下文切换Context Switching 任务执行时 xff0c 它使用处理器 微控制器的寄存器并访问RAM和ROM xff0c 就像任何其他程序一样 这些资源 处理器寄存器 堆栈等 组成了任务执行上下文 任务是一段连续的代码 xff0
  • MissionPlanner-开发历程-1

    1 Mission Planner 简介 Mission Planner是使用C 开发的开源飞控地面站软件 xff0c 使用MavLink通信协议 xff0c 浏览官方网站 Mission Planner是ArduPilot开源自动驾驶项目
  • 关于SpringSecurity配置中的一些问题解决(登录页面不跳转,报错302)

    1 为何在自定义的登录页面中登录完页面不跳转 xff1f 主要是SpringSecurity在校验csrf跨域时候 xff0c 会传一个csrf相关的随机token值 xff01 在SpringSecurity 4 之后 xff0c 其cs
  • DAY2. jetson nx gpio

    更新 扩展接口说明 xff0c 官方说明文档 xff1a Jetson Xavier NX DevKit Carrier Board Specification v1 0 pdf 分割线 参照这个文档 xff1a https www jet
  • 使用kinect2进行目标跟踪-ROS平台

    之前闲得无聊 xff0c 在ROS平台上调用Kinect摄像头进行目标跟踪检测 首先 xff0c 要在ubuntu下安装好Kinect2和ROS的接口 xff0c 参考http www mamicode com info detail 15
  • 在ROS中使用opencv-灰度处理

    没什么好说的 xff0c 直接看代码理解吧 xff1a include lt ros ros h gt ros标准库头文件 include lt iostream gt C 43 43 标准输入输出库 cv bridge中包含CvBridg
  • GCC的编译流程分为了四个步骤:

    GCC的编译流程分为了四个步骤 1 预处理 xff0c 生成预编译文件 xff08 文件 xff09 xff1a Gcc E hello c o hello i 2 编译 xff0c 生成汇编代码 xff08 s文件 xff09 xff1a
  • Android自定义控件基础

    采用自定义控件解决重复编写代码的问题 总共分三步 1 写好一个自定义模板布局 title XML span class hljs pi lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34
  • String,StringBuffer,StringBuilder的区别(优缺点)

    最近学习到StringBuffer xff0c 心中有好些疑问 xff0c 搜索了一些关于String xff0c StringBuffer xff0c StringBuilder的东西 xff0c 现在整理一下 关于这三个类在字符串处理中
  • nginx+tomcat重复请求

    好久不写技术文章了 xff0c 越发的觉得单纯的讲技术没啥意思 怪不得知乎越来越火 xff0c 因为大家都喜欢看故事 xff0c 不喜欢硬生生的技术文章 笔者今天就来就给大家讲故事 最近网站压力突然增大 xff0c 把带宽都占满了 xff0
  • Android真机获得root权限修改文件权限

    好久没有更新博客了 xff0c 最近因为重装了系统导致所有的配置都不存在了 xff0c 当要修改Android权限去查看数据库文件的时候 xff0c 发现又忘记了怎么去获得修改权限 xff08 其实第一次弄这个内容的时候就费了很大的劲 xf
  • Android完全自定义控件并且实现监听事件

    本篇文章带来Android的完全自定义控件 载体是自定义一个开关的控件 xff0c 并且能够响应事件 xff0c 首先我们先创一个项目 xff0c 名字就叫ToggleView xff0c 修改MainActivity span class
  • 2016年总结,辛勤劳作的一年

    直到刚才听到门外的爆竹声 才意识到这一年 xff0c 快结束了 今天是11月26号 xff0c 其实离2017年还有一段距离 xff0c 趁着今天有空 xff0c 给自己写一篇文章 其实 xff0c 我是很不想说 xff0c 你好 xff0
  • Android屏幕适配实战

    说一下在项目里面遇到的一个问题 xff0c 和解决思路 需求来源于运营小姐姐 xff0c 她们希望在App的搜索关键字前面加上图片醒目效果图如下 布局很简单左边一个SimpleDraweeView xff0c 右边一个TextView xf
  • 定制阿里代码检查,实现你自己的代码规范检查

    几个月前 xff0c 阿里开源了p3c xff0c 我也接到了老大交给我的技术改造 是这样的 xff0c app是老项目了 xff0c 半年前接入了ARouter xff0c 由于Activity繁多 xff0c 就没有去全局支持ARout
  • Fresco内部诟病引起的初次从网络加载PNG图片失败

    如题描述 xff0c 这个问题在项目中存在已久 xff0c 今天由于自己的功能在首页 xff0c 初次启动的体验极其糟糕 xff0c 所以硬下头皮把这个问题解决了 先来描述一下怎么样一个差的体验吧 就是当我第一次加载网络PNG xff08
  • 不用第三方写一个简单的推流软件

    https github com iOSSinger SGLivingPublisher 不用第三方写一个简单的推流软件 6 commits 1 branch 0 releases 1 contributor Objective C 100