直播推流优化|音视频开发

article/2025/9/26 13:57:15

直播推流端是整个直播内容的生产源头。我们熟知的推流工具有:PC 推流工具 OBS、手持设备和各个直播平台的手机推流 App、针对一些复杂场景有更专业的导播台硬件等等。虽然工具众多,但推流端的整个工作流程还是比较固定的:

摄像头、麦克风采集 → 视频编码、音频编码 → 音视频封装合流 → 推流

在推流端我们可以针对用户播放体验做的优化主要包含:推流断流优化推流延时优化

在直播推流端,我们最关注的就是是否断流,因为推流断流最终可能造成播放端的卡顿、报错等问题,对直播业务有很大的负面影响。其中与推流断流相关的指标有下面这些:

  • 推流断流率,推流发生过断流的会话占比。

  • 平均断流次数,平均一次推流会话发生断流的次数。

  • 平均断流时长,平均一次断流时长。

此外,对某些业务场景来说,直播延时也是很重要的一个指标,除了在 CDN 服务端和播放端做一些优化外,推流端也可以做一些推流延时优化。

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

1、推流卡顿优化

造成直播推流卡顿的原因主要有设备、视频流、网络这三方面。

1.1、选择较高性能的推流设备

高清视频的编解码往往会给硬件带来更大的压力,由于编解码造成的卡顿尤为明显。对于推流端因为开播需要音视频编码、播放礼物动画、展示聊天消息等能力,这些组件叠加很容易使得 CPU、GPU 过载而导致手机发热和卡顿。

如果是这个原因,解决方法有以下几点:

  • 升级硬件、软件设备,提高兼容性和容错率

  • 尽量使用硬编硬解方案,充分利用 GPU 加速

  • 降低视频帧率码率,选择流畅或者标清画质进行推流

  • 切换到 PC OBS 推流

1.2、确保音频和视频时间戳同步

在直播中,当音视频时间戳不同时,会影响画面渲染,导致画面解析时出现问题,造成一卡一卡的现象,音视频时间戳非单调递增会导致播放器在解析画面时出现错乱的情况,前后画面衔接会出现不连续甚至花屏的现象。

在实际场景中,有些推流中断的情况是由于设备音视频权限被抢占或打断造成的。比如,在推流时,弹出一个视频播放把音频权限模式给改掉了,导致推流没有音频采集权限而中断。这种情况在复杂的业务场景里是有可能出现的。

对应这种情况,可以这样解决:

  • 1)如果能感知和监控音视频权限的变化,可以在权限变化时,将权限设置回正确的模式。

  • 2)音视频采集权限被抢占最终会影响采集到的数据,所以也可以监控音视频数据采集缓冲区来判断是否采集权限出了问题,从而尝试恢复权限。

1.3、防止推流帧率过低

根据人眼的视觉暂留原理,每秒的画面帧数必须达到一定的数值,人眼观看才是连续有效的,帧率(帧率即每秒的画面帧数)过低会导致用户视觉感受是卡顿的。

此外,如果视频的帧率设置过低,可能导致视频流的编码方式与服务器有不兼容的情况,这样在服务器转码直播流数据时可能出现了解析错误,也会导致直播放卡顿的问题。

1.4、断流重连

直播从推流端,到服务端,再到播放端,各节点一般都会有音视频流数据的缓冲。在推流端发生断流,在各级缓冲没有消耗完音视频数据之前,如果能恢复数据生产,还是有希望避免播放端出现断播或卡顿的。这样一来,实现推流断流重连还是很有必要的。

推理断流重连的实现说起来其实比较简单,就是断开原有的推流会话,然后重启会话来建连推流。但这里有两点需要注意:

  • 1)是要完善推流会话各层的错误回调,这样才能即使感知到推流中断,从而做重连;

  • 2)要和服务端协商好推流连接的生命周期时效,保证重启会话建立的连接还是推流到原来的直播间。

推流断流重连还可以做一个间隔重试策略,比如,间隔 1s 重试一次直至推流成功或外部停止推流,或者重试间隔时间线性递增直至推流成功或外部停止推流。

1.5、退后台保持推流

在实际应用场景中,很多主播都是使用手机进行推流,这时会有一个问题,如果主播受到其他打扰,比如来了电话或者查看微信,就会退出应用,这时候也会造成推流断流。对于这种情况,可以支持退后台继续推流,不过有几点需要注意:

  • 1)退后台如果继续采集音频可能涉及到隐私问题。对于这个问题,可以退后台停止采集,但是保持推静音音频数据。当然,如果产品上可以退后台继续采集音频,就使用系统的能力持续采集就好了。

  • 2)退后台无法继续采集视频,这时候如果不推视频数据,那么可能会引起 CDN 和播放器的不兼容的问题。因为有的 CDN 和播放器是需要检查视频数据,以及根据视频数据做一些功能和策略的。对于这个问题,可以推退后台前的最后一帧画面,并且适当降低帧率来降低推流的码率。

  • 3)由于退后台时间较长后,App 的网络请求可能被系统中断,甚至 App 可能被杀死。对于这个问题,可以尝试一些后台保活的方案,比如 iOS 可以在退后台后播放静音音频来保活。

1.6、码率自适应

推流端在遇到网络较差,音视频码率发送不出去的时候也会造成播放端的卡顿或者报错,因此推流端也需要做码率自适应来适配网络。

推流端的码率自适应主要是通过计算单位时间内编码码率与发送码率来判断网络的实时情况,然后可以根据多次判定的结果进行码率调整。

下面是 RTMP 推流码率自适应的一种示例策略:

  • 网络状况判断:每秒统计当前编码码率发送码率进行对比,统计连续 10 次的对比结果,定义:这 10 次统计中发送码率大于或等于编码码率的次数在 [N, 10] 区间,则判定网络优秀;在 [M, N) 区间,则判定网络一般;在 [0, M) 区间,则判定网络较差。

  • 如果网络优秀:可在不超过设定的码率或帧率最大值的前提下,提高编码码率或帧率。这里需要注意,提升码率需要慢慢来,例如每次幅度增加 25kbps-50kbps 左右。

  • 如果网络一般,则不进行操作。

  • 如果网络较差:1)优先降低帧率,例如认为 FPS >= 12 的流畅度可接受,则可以先将编码前帧率逐渐降低到 12,同时调整实时码率匹配此时的帧率,这样可以保证清晰度不变。2)当帧率降低到最小容忍值后,网络依然较差,则可以继续降码率。这里的策略可以是将码率每次降低 100kbps 左右;或者调整码率为最近连续几次发送码率的平均值。这里需要注意,降低码率需要快速降。3)如果依然发送阻塞,最后可以进行丢帧操作。丢帧的策略可以优先丢非参考帧 B 帧,然后丢 P 帧、I 帧,最后丢 Audio 帧。

1.7、多模板策略

上面讲的推流码率自适应主要是推流端在已经开播后动态适配网络的码率策略。而通常在开播前,我们也可以根据需要对开播端进行网络探测,从而配置不同的推流模板以适配网络。这里的推流模板包含了推流的码率、帧率、分辨率、GOP 长度、编码方式等参数。

推流多模板策略包括以下几个步骤:

  • 1)定义多个推流模板。一般来讲,首先要根据编码方式分为多个模板组,比如 H.264 编码的推流模板一组,H.265 编码的推流模板一组;然后,帧率、GOP 长度保持一样即可;最后,码率、分辨率根据情况配置。

  • 2)探测机型支持的编码方式,选择对应的模板组。不同的机型支持的编码方式可能不同,比如对于支持 H.265 硬编的机型,可以优先使用 H.265 编码,这时候就选择 H.265 编码的模板组。

  • 3)开播前进行网络探测。这个探测过程按照推流模板组中的码率,从高到低进行推流测试,如果当前码率可以流畅推出一定时长,则采用该模板。如果推流不流畅,则可以降级到较低码率的模板继续进行推流测试,直到找到合适的模板。

1.8、AI 动态码率计算

通过 AI 算法加持,对于推流进行数据识别,将识别后的结果进行打分,得出需要准确的码率大小,这样可以更精准的控制码率,从而提升用户体验。

2、推流延时优化

直播过程中整体延时通常指的是生产端到消费端的延时,也就是推流相机采集的每一帧到用户观看的每一帧时间差,通常我们可以用秒表来粗略估算,但代码中可以使用 SEI 配合 NTP 时间戳进行计算。

推流端延时则是从推流端到 CDN 服务端的延时。要对推流端的延时做优化主要是控制推流端的缓冲区策略,此外更重要的是选择合适的传输协议。

2.1、推流缓冲区控制

推流端的缓冲区比较典型的通常有两个:音视频数据采集模块和编码模块之间的缓冲区,编码模块和网络发送模块之间的缓冲区。

当这两个缓冲区中累积的数据比较多时,推流端的延时就会比较大,所以需要优化采集模块、编码模块、网络发送模块的性能和协调性,尽量降低缓冲区的数据累积。比如,当编码模块压力比较大时,可能导致采集模块和编码模块之间的缓冲区数据累积较多,这时候可以调整采集模块降低帧率来减轻编码模块的压力。

2.2、基于 TCP 协议的推流

我们对当前主流直播技术做了分析,在低延时直播技术出现前主要有 HLS 和 RTMP/HTTP-FLV 两个协议。

  • HLS:延时主要来自编码解码时产生延时、网络延时、CDN 分发延时。由于它是切片协议,延时分两大块,一个是服务端有切片缓冲延时,另一个是在播放端防抖缓冲会有延时。切片的大小和数量都会 HLS 影响延时大小,一般在 10s 以上。

  • RTMP/HTTP-FLV:目前国内大部分厂家在用的 RTMP,它相对于 HLS 在服务端做了优化。RTMP 服务端不再进行切片,而是分别转发每一帧,CDN 分发延时非常小。RTMP 延时主要来自播放端防抖缓冲:为提升弱网环境下抖动时直播的流畅度,缓冲延时一般有 5-10s。

这两类协议都是基于 TCP,国内厂商基本上已经将 RTMP over TCP 的延时做到的极致,如果一个协议仍然基于 TCP 优化延时,效果上很难优于目前的 RTMP。

TCP 由于其自身的一些特性,并不适用于低延时直播场景,主要原因如下:

  • 重传慢:TCP 的 ACK 确认机制,丢包后发送侧超时重传,超时时间一般 200ms,会造成接收侧帧抖动。

  • 拥塞判断不准确:基于丢包的拥塞控制算法无法准确判断拥塞,丢包并不等于拥塞;也会造成发送链路 bufferbloat,链路 RTT 增大,延时增加。

  • 灵活性差:这是最主要原因,TCP 拥塞控制算法在操作系统内核层实现,优化成本较高,移动端只有利用系统已有的优化。

2.3、基于 UDP 协议的推流

上图是基于 UDP 的两种方案对比,第一种是可靠 UDP 方向,比如 Quic;另一种是 RTC 方案,比如 WebRTC。

从五个维度对两种方案进行对比:

  • 传输方式:Quic 是可靠传输;而 RTC 是半可靠传输,特定情境下可对音视频有损传输,可有效降低延时。

  • 复杂度:Quic 的复杂度非常低,相当于将 TCP 接口换位 Quic 接口即可,RTC 方案的复杂度很高,涉及一整套的协议设计和 QOS 保障机制。

  • 音视频友好性:Quic 不关心传输内容,对音视频数据透明传输。RTC 对音视频更友好,可针对音视频做定制化优化。

  • 方案完备性:从方案完备性方面来讲,Quic 是针对传输层优化,而 WebRTC 可提供端对端优化方案。

  • 理论延时:经实验室测试以及线上数据分析,WebRTC 方案的延时可以达到 1 秒以内。

综上,Quic 方案的最大优点是复杂度低,不过这个方案要想达到更低的延时,也需要引入更多的复杂度。从方案的先进性上看,选择 WebRTC 技术的低延时方案,RTC 技术和直播技术的融合,是未来音视频传输技术的一个趋势。

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓


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

相关文章

OBS推流工具介绍及桌面录屏推流功能实现

OBS推流工具介绍及桌面录屏推流功能实现 文章目录 OBS推流工具介绍及桌面录屏推流功能实现1 OBS工具介绍2 OBS工具安装及简单使用2.1 安装步骤2.2 简单使用介绍 3 OBS实现桌面录屏推流工具实现4 总结 流媒体开发工程中,我们除了使用ffmpeg等工具辅助调试外&#xff…

RTMP推流方案总结

由于项目需要 RTMP 推送 H264 数据,在网上查找了下相关的方案,总结一下。 RTMP协议简介 在总结之前,我们先简单介绍一下 RTMP 协议。 RTMP(Real Time Messaging Protocol) 实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间…

推流工具 OBS 使用指南

推流工具 OBS 使用指南 内容转载阿里云文档–第三方推流工具使用指南 OBS介绍 什么是OBS? Open Broadcaster Software 是一款好用的直播流媒体内容制作软件。 OBS使用是否收费? 不收费,这个程序和它的源代码都是免费的。 OBS都支持哪些…

rtmp推流和拉流

提前说明,文章所用主要摘自网络,本文只是整合。鉴于来源太多,不进行引用说明 NGINX 安装nginx及安装nginx模块 nginx下载地址 http://nginx.org/download/nginx-1.20.1.tar.gz nginx-rtmp模块 组件下载地址 https://github.91chifun.w…

使用软件实现直播推流

rtmp媒体服务器:这里使用srs :https://github.com/ossrs/srs 首先clone到本地,进入到trunk目录: git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure 最后执行:make 执行成功后,就…

基于FFmpeg进行rtsp推流及拉流(详细教程)

目录 1. 安装FFmpeg 1.1 Windows系统 1.2 Ubuntu 和 Debian 系统 1.3 CentOS 和 Fedora 系统 1.4 macOS系统 2. 安装rtsp-simple-server 3. FFmpeg推流 3.1 UDP推流 3.2 TCP推流 3.3 循环推流 4 拉流 4.1 ffplay/VLC拉流显示 4.2 FFmpeg拉流保存成视频 1. 安装FFm…

音视频直播推流和拉流到底是什么意思?

为什么直播现场的信息,用户通过手机或者网站就能很快的看到呢?为什么有时候网络不稳定,直播效果会有延迟呢?现场的视频信号又是如何传到网络呢? 这些所有问题的产生,都离不开视频直播中常说的两个词&#…

音视频流媒体-推流与拉流简介

一、概念 话不多说,先了解概念,再看示意图更直观: 1.1 推流 推流:将直播的内容推送至服务器的过程。即指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高&a…

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

https://github.com/iOSSinger/SGLivingPublisher 不用第三方写一个简单的推流软件 6 commits 1 branch 0 releases 1 contributor Objective-C 100.0% Objective-C Clone or download Find file Branch: master New pull request Latest commit 122566b on 16 Feb iOSS…

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…