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

article/2025/9/26 16:40:14

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



http://chatgpt.dhexx.cn/article/PavtURKB.shtml

相关文章

RTMP 利用第三方软件实现数据推流与客户端播放

服务器的搭建建 Red5 搭建基于RTMP协议的流媒体服务器 1.软件 数据推流软件 flash_media_live_encoder_3.2 客户端播放软件 vlc-2.1.5-win32.1406534096 2.安装软件 直接双击安装即可 3.数据推流 使用flash encoder软件 设置服务器的URL rtmp://localhos…

视频直播推流攻略(整理的各大平台推流界面)

如果我要做一场高端大气的直播活动,需要用高清摄像机拍摄画面,需要接入无人机的高空画面,需要在直播中插入多个镜头,甚至需要把电脑桌面共享到直播画面中...... 该如何将这类现场信号采集并整合起来传输到网络呢? 这个…

推流工具OBS 支持webrtc推流

OBS 是一款好用的直播流媒体内容制作软件,为用户提供了视频、文本、图像等的捕获录制功能,OBS 界面简洁并专业,功能强大。OBS 程序和其源代码都是免费提供给大家使用,版本更新一直比较活跃,支持 OS X、Windows、Linux …

直播-拉流和推流概述

拉流(播放) 根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据; 解析二进制数据,从中找到相关流信息;根据不同的封装格式(如FLV、TS)解…

【流媒体】推流与拉流简介

本文目录 一、概念 1.1 推流 1.2 拉流 二、示意图 三、RTMP传输协议 四、流媒体协议与格式 一、概念 话不多说,先了解概念,再看示意图更直观: 1.1 推流 推流:将直播的内容推送至服务器的过程。即指的是把采集阶段封包好的…

OBS推流直播软件安装教程

OBS推流直播软件安装教程 一、安装推流软件 1.双击运行 OBS-Studio-21.1-Full-Installer.exe 安装包程序 2.点击 Next 3.点击I Agree (不知道为啥显示图片了 可以复制里面的连接到浏览器打开) 4.点击Next 5.点击Install 6.点击Finish&#xff0…

四款好用的免费直播编码推流软件

现代生活已经离不开互联网,离不开软件了。 这说法毫不夸张。 比如手机上各种 APP 眼花缭乱 ,各种行业, 各种功能, 各种 Logo, 各种的各种。 没有良好的整理力,是真 的不好意思让别人看到啊。 这些功能各异的 APP 程序大多数是免费 APP。今天我们来谈谈…

Android手机屏幕RTMP推流工具

Android手机屏幕RTMP推流工具是基于ffmpegopencv开发的C(eclipse、androidstudio)程序,是一款可以将安卓手机屏幕上的任何内容推送到任意一款rtmp服务器上的工具,不仅可以分享手机屏幕内容,还可以分享手机上正在播放的…

三款免费的直播推流软件介绍

三款免费的直播推流软件介绍: 1. Adobe Flash Media Encoder 2. Open Broadcaster Software 3. iAVcast 1)Flash Media Live Encoder 3.2 由著名的Adobe公司出品,值得信赖,Adobe好长时间已经停止更新了&…

tensorflow中的sess.run()

1.feed_dict feed_dict的作用是给使用placeholder创建出来的tensor赋值,feed使用一个值临时替换一个op的输出结果。 2.sess.run() 构建完图后,需要在一个会话中启动图,启动的第一步是创建一个Session对象。在执行sess.run()时,te…

tensorflow sess.run()

函数参数run( fetches, feed_dictNone, optionsNone, run_metadataNone) feed_dict参数的作用是替换图中的某个tensor的值。例如: a tf.add(2, 5) b tf.multiply(a, 3) with tf.Session() as sess: sess.run(b) 21 replace_dict {a: 1…

sess.run()自我理解

import tensorflow as tf a tf.constant([[1,2],[3,4]]) print(a) matrix2 tf.placeholder(float32,[2,2]) matrix1 matrix2#浅拷贝 sess tf.Session() print(sess.run(a)) print(a) asess.run(a) print(a) print(sess.run(matrix2 ,feed_dict{matrix2:a})) #只要是sess.…

Oracle视图学习DBA_HIST_ACTIVE_SESS_HISTORY

dba_hist_active_sess_history:这个视图是用来生成 ASH report 的, 但是 ASH report 并没有充分的利用这个视图的强 大之处,我们通过分析这个视图的详细数据,往往可以找到问题发生的原因. 可以从宏观和微观两个维度来分析这个视图(用 11gR2 的 dba_hist_active_sess_history 做…

tensorflow的sess.run的参数执行顺序

sess.run的多个参数执行 是将整个计算图中所有需要计算的节点,计算完全后一次行输出, 两次print顺序不同,结果不同 import tensorflow as tf# 基础数据 state1 tf.Variable(0, dtypetf.int8,name mi) state tf.Variable(0, dtypetf.int8…

sess.run()

函数:run(fetches, feed_dictNone, optionsNone, run_metadataNone) 当构建完图后,需要在一个session会话中启动图,第一步是创建一个Session对象。 为了取回(Fetch)操作的输出内容, 可以在使用 Session 对象…

Paper Reading:SESS(Self-Ensembling Semi-supervised3D ObjectDetction)

BackGround 虽然3D点云的目标检测当前运用十分广泛,但是当前大部分3D目标检测的方法强依赖于带有标注的数据。这些带有标注的数据往往是需要付出昂贵的代价,在2021年的水平大概是¥0.1一个框,那么一帧数据也就是对应的&#xffe5…

SESS: Self-Ensembling Semi-Supervised 3D Object Detection论文阅读及理解

SESS: Self-Ensembling Semi-Supervised 3D Object Detection Abstract 3d检测通常以来目标的标签和注释,然而获得这些注释是十分困难的。 SESS一种自集成的半监督三维目标检测框架。 设计了一种扰动方案,加强对未标记数据和新的为可见数据的泛化。 …

Elasticsearch——》ngram分词器

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Elasticsearch 的 NGram 分词器使用技巧

一、什么是NGram 分词器? NGram分词器是ES自带的具有前缀匹配搜索功能的一个文本分词器。它能根据文本的步长逐步对写入的文本内容进行约束切割; 二、NGram和index-time搜索推荐原理 搜索的时候,不用再根据一个前缀,然后扫描整个倒排索引了…

Ngram模型

N-Gram是大词汇连续语音识别中常用的一种语言模型,对中文而言,我们称之为汉语语言模型(CLM, Chinese Language Model)。汉语语言模型利用上下文中相邻词间的搭配信息,在需要把连续无空格的拼音、笔划,或代表字母或笔划的数字&…