推流SDK分析

一、推流架构

推流SDK客户端的模块主要有三个,推流采集端、队列控制模块、推流端。其中每个模块的主要流程如下,本文的主要目的就是拆分推流流程,

1.1 采集端

视频采集:通过Camera采集视频。

音频采集:通过麦克风采集音频。

视频后处理:美颜、滤镜、贴纸、翻转等特效。

音频后处理:重采样、3A处理等。

视频编码:支持硬编码和软编码,同时支持H264和HEVC编码,特别要注意编码的特殊情况。

音频编码:AAC编码

采集端的很多功能都是平台相关的,相机采集、编码等Android和iOS上处理都不一样。尤其是Android平台,很多机型和芯片,当然会有一些特殊的情况需要兼容下,这个后面我们会详细描述的。

1.2 队列控制

队列控制模块是推流SDK非常重要的控制模块,推流SDK就是一个很简单的“生产者——消费者模型”,采集端是生产者,推流端是消费者,采集端采集的是本地数据,推流端和服务端交互,正常情况下都是推流端会出现延迟,像弱网情况下推流端消费肯定会很慢,但是采集端速度并不会慢下来,如果没有队列控制这个降压阀,那很多数据就会堆积在队列中,本地数据不断堆积,最终导致OOM。

队列控制应该如何控制?

视频的数据比音频大很多,所以队列控制主要是视频基准,音频跟着视频相应丢帧。

编码之后视频队列大小设置为60,在推流的过程中,发现视频的队列已满,需要丢弃队列最前面的一帧,然后再入队新的一帧,音频队列也要同步操作,对应时间点的音频数据也要丢掉。

1.3 推流端

推流采用的是RTMP协议,RTMP是Adobe公司开发的,算是事实上的工业标准,全称是Real Time Messaging Protocol,虽然实时性要比HLS好一点,但是也还有几秒左右的延迟。它的底层是基于TCP协议。

RTMP协议的建连流程如下:

RTMP建连需要商量两件事情:

版本号:客户端和服务器的版本号不一致,无法继续工作

时间戳,视频播放过程中,时间戳很重要,如果没有,后续的音视频同步无法继续开展。

首先,客户端发送 C0 表示自己的版本号,不必等对方的回复,然后发送 C1 表示自己的时间戳。服务器只有在收到 C0 的时候,才能返回 S0,表明自己的版本号,如果版本不匹配,可以断开连接。服务器发送完 S0 后,也不用等什么,就直接发送自己的时间戳 S1。客户端收到 S1 的时候,发一个知道了对方时间戳的 ACK C2。同理服务器收到 C1 的时候,发一个知道了对方时间戳的 ACK S2。

推流的过程,就是将 NALU 放在 Message 里面发送,这个也称为 RTMP Packet 包。Message 的格式就像这样。

一定要记住音频和视频的头部要单独发送,在发送视频头部的视频,需要将NALU起始标识符去掉,RTMP不需要它们。

二、技术要点

2.1 声音处理

在采集完声音之后,需要对音频进行3A处理,即声学回声消除(AEC)、背景噪声抑制(ANS)、自动增益控制(AGC),3A处理在声音后期处理中非常重要,在推流场景的声音处理中应用十分广泛。

AEC

回声消除(AEC)是指在二线传输的两个方向上同时间、同频谱地占用线路,在线路两个方向传输的信号完全混在一起,本端发信号的回波就成为了本端信号的干扰信号,利用自适滤波器可抵消回波以达到较好的接收信号质量,即为回声消除。

回声消除的原理就是利用接收到的音频与本地采集的音频做对比,添加反向的人造回声,将远端的声音消除。

ANS

背景噪声抑制(ANS)指的是将声音中的背景噪声识别并进行消除的处理。

背景噪声分平衡噪声瞬时噪声,平稳噪声频谱稳定,瞬时噪声频谱能量方差小,利用噪声的特点,对音频数据添加反向波形处理即可消除。

目前,对于平稳的噪声已经有很多种简单方法能够成功抑制,但是生活中常见的一些瞬态噪声却依然缺乏好办法。

瞬态噪声的共同特点就是突发性极强,在时域上呈振荡衰弱的形式,持续时间在十几毫秒至上百毫秒不等;在频域上分布很宽,瞬态噪声的频谱基本上是和正常语音的频谱混叠在一起,很难进行抑制。

AGC

自动增益控制(AGC)主要用于调整音量幅值,提高语音通信系统在带噪声环境中的性能。

人们正常交谈的音量在 40-60dB 之间,低于 25dB 的声音听起来很吃力,而超过 100dB 的声音会让人感到不适,AGC 的作用就是将音量调整到人接受的范围

音频响度及麦克风拾音控制是保证音视频沟通质量的重要技术手段,一般来说,音频标准、传输条件、人为失误等因素都可能导致音频信号之间出现声音突变或者响度不一致的情况,这时候就需要对音频信号放大或缩小以得到自然清晰的语音通信。

2.2 视频处理

相机采集的原始数据首先要进行帧处理,主播通常会应用一些特效,例如美颜、滤镜等,这些都会在视频帧后处理流程中开展,帧处理之后才会进行编码处理。

H264和H265编码还有点不同。

H264头部由SPS和PPS组成,SPS是序列参数集,包括一个图像序列的所有信息,如图像尺寸、视频格式等;PPS是图像参数集,包括一个图像的所有分片的相关信息,如图片类型、序列号。

H264的码流结构如下:

起始码 + SPS + 起始码 + PPS + 起始码 + SEI + 起始码 + I帧 + 起始码 + P帧 + ......

H265头部除了SPS和PPS之外,还有一个VPS,VPS是视频参数集。

H265码流结构如下:

起始码 + VPS + 起始码 + SPS + 起始码 + PPS + 起始码 + SEI + 起始码 + I帧 + 起始码 + P帧 + ......

其中H264和H265的码流类型有两种,一种是Annexb格式,另一种是MP4格式,使用最广泛的还是Annexb格式,本文主要以Annexb为例。

起始码只是起到分割的作用,并不是有效的视频数据,起始码也有两种:

4字节的00 00 00 01

3字节的00 00 01

但是图像编码中也有可能出现00 00 00 01和00 00 01,出现这种情况怎么办?

00 00 00 修改为 00 00 03 00

00 00 01 修改为 00 00 03 01

00 00 02 修改为 00 00 03 02

00 00 03 修改为 00 00 03 03

这样在编码的过程中就不会出现混淆了。

2.3 推流控制

上文也说了在采集端和推流段其实是通过一个队列控制的,采集端采集本地的视频和音频,然后编码好了放入队列中,推流段从队列中取出视频和音频然后根据特定的格式发送到服务端。相当于采集端是往水池中注水,推流段是放水。

采集端是很快的,推流段是受限于网络的,如果网络状态比较好的情况下,可以达到一个较好的平衡,但是一旦网络变差,队列就会出现堆积,我们不可能让队列无限堆积,需要设置一个队列阈值,当然队列已满,需要将队列中原有的数据抛弃,将新数据入队。这样就会出现丢帧,这时候推流段可以适当降低码率降低丢帧的概率。

2.4 支持FLV-HEVC

flv 是不支持H265的,需要手动修改FLV支持H265编码和解码的解析,当然也需要拉流段支持FLV-H265。具体的修改方式如下:

https://www.zhihu.com/question/41393752/answer/2775763571

三、三方库介绍

libfdk_aac:https://github.com/mstorsjo/fdk-aac

libx264:https://code.videolan.org/videolan/x264

libx265:https://github.com/videolan/x265

ffmpeg:https://github.com/FFmpeg/FFmpeg

librtmp:https://github.com/ossrs/librtmp

libsox:https://github.com/dmkrepo/libsox

sonic:https://github.com/waywardgeek/sonic

librosa:https://github.com/librosa/librosa

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容