首页 > 其他分享 >直播推流技术指南

直播推流技术指南

时间:2023-06-19 10:32:19浏览次数:47  
标签:指南 视频 00 队列 音频 采集 直播 推流


一、推流架构

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

直播推流技术指南_github

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协议的建连流程如下:

直播推流技术指南_android_02

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

  • 版本号:客户端和服务器的版本号不一致,无法继续工作
  • 时间戳,视频播放过程中,时间戳很重要,如果没有,后续的音视频同步无法继续开展。

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

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

直播推流技术指南_音视频_03

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

三、技术要点

3.1 声音处理

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

  • AEC

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

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

  • ANS

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

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

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

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

  • AGC

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

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

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

3.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

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

3.3 推流控制

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

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

3.4 支持FLV-HEVC

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

www.zhihu.com/question/41…

四、三方库介绍

  • libfdk_aac:github.com/mstorsjo/fd…
  • libx264:code.videolan.org/videolan/x2…
  • libx265:github.com/videolan/x2…
  • ffmpeg:github.com/FFmpeg/FFmp…
  • librtmp:github.com/ossrs/librt…
  • libsox:github.com/dmkrepo/lib…
  • sonic:github.com/waywardgeek…
  • librosa:github.com/librosa/lib…

作者:安纯旦

标签:指南,视频,00,队列,音频,采集,直播,推流
From: https://blog.51cto.com/u_16163480/6511346

相关文章

  • 现代C++学习指南-类型系统
    在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统。写在前面在进入类型系统之前,我们应该先达成一项共识——尽可能使用C++的现代语法。众所周知,出于兼容性的考虑,C++中很多语法都是合法的。但是随着新......
  • 行行AI人才直播第2期:八友科技创始人梁斌博士《大模型训练数据的一些事》
    自从OpenAI发布ChatGPT4.0之后,大模型热度一直不减,国内不管是大厂还是创业团队纷纷杀入大模型领域,大模型的建立首先离不开的是数据,数据才是一切大模型训练的基础,那么目前国内大模型团队的数据需求究竟是什么?如何通过学习数据采集,对大模型数据预测商业发展呢?大模型训练数据方......
  • 现代C++学习指南-方向篇
    C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。C++0......
  • pywinauto使用指南
    @目录安装使用须知确定app的可访问技术启动应用程序辅助工具详细使用开启app连接已经打开的应用程序选择程序窗口窗口控件分类窗口控件基本属性获取方法获取控件的文本内容对窗口/控件的截图处理菜单的相关操作菜单控件菜单项控件等待机制wait系列timings系列编辑类控件模拟用户......
  • 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器
    专栏简介本专栏将带领您进入Docker的世界。您是否对Docker有所耳闻?那么,您是否知道使用Docker可以带来什么样的好处呢?如果您还不了解Docker,不用担心,让我们一起探索这个神奇的世界吧!DockerDocker最初是dotCloud公司内部项目,由SolomonHykes在法国创立。它基于dotCloud公司多年......
  • nvm详细安装步骤避坑指南以及使用(以win11系统为例)
    版权声明:本文为CSDN博主「Lucky@czj」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/czj_com/article/details/127103504  使用背景:nvm是一个管理nodejs版本的工具。在实际的开发中,有些项目的开发依赖需要低版本的nodej......
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实
    异常传播有时候,您可能需要重新抛出捕获到的异常。这种情况通常发生在捕获到Error或RuntimeException时,因为您可能没有预料到这些异常,但在声明捕获Throwable和Exception时,它们也被包含在内了。为了解决这个问题,Guava提供了多种方法来判断异常类型并重新抛出异常。例如:try{......
  • 约会安排指南
    笔者因为以前一直是异地恋,现在结束异地恋了。有点不知道约会该怎么安排,弄了很久才算完成约会的安排。这篇文章就是为了给以后的自己还有各位兄弟做点参考。主要分为以下三个部分,约会地点和流程安排,酒店寻找(预算有限才会有这个步骤吧),约会备案约会地点和流程约会地点应该是最重要......
  • 11. 100ASK-V853-PRO开发板 RGB屏测试指南
    硬件要求:100ASK-V853-PRO开发板七寸RGB屏软件要求:固件下载地址:链接:百度网盘提取码:sp6a固件位于资料光盘中的10_测试镜像/1.测试七寸RGB屏/v853_linux_100ask_uart0.img1.硬件连接按照下图所示将RGB屏连接开发板按照下图所示连接12V电源和两条Type-C数据线​2.......
  • 12. 100ASK-V853-PRO开发板 MIPI屏测试指南
    硬件要求:100ASK-V853-PRO开发板四寸MIPI屏软件要求:固件下载地址:链接:百度网盘提取码:sp6a固件位于资料光盘中的10_测试镜像/2.测试4寸MIPI屏/v853_linux_100ask_uart0.img1.硬件连接按照下图所示将MIPI屏连接开发板按照下图所示连接12V电源和两条Type-C数据线2.烧录......