【流媒体测试】推流学习笔记

news/2024/5/18 15:14:02 标签: 学习, 网络, udp

流媒体协议RTSP、RTMP
 RTSP+RTP主要用于IPTV,原因是传输数据使用的是UDP,在网络环境比较稳定的情况下,传输效率是比较高的;
 RTMP主要用于互联网音视频传输,它使用的是TCP传输,因为互联网环境相对较差,采用RTMP保证了视频的传输质量,但是其传输延迟相对较高,传输效率相对较低。

UDP与TCP比较:
UDP:无连接协议,也称透明协议,也位于传输层。
1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

在这里插入图片描述

1 推流

推流框架
将视频(H264)和音频(AAC)格式数据分别解码为图像(RGB/YUV)和声音(PCM),再根据时间戳同步播放。
在这里插入图片描述

1.1 实时推流
1)队列:音频包和视频包放到同1个队列
需要队列的原因:编码后直接把包推流,网络信号不好的时候,会被阻塞

  • 队列如何设计?
    生产者消费模型、现线程安全

2)如果网络拥塞,比如拥塞2秒
如果2秒没有推送任何数据包,那队列攒了2秒的数据。如果攒积数据太多,drop数据。检测到I帧,停止drop。

3)队列大小控制
积累1秒数据,能不能drop数据,要2秒才考虑去drop数据。

4)延迟:主要队列数据积累
在这里插入图片描述

  • 推流队列
    网络拥塞的时候会积攒数据,网络好的情况队列不会有缓存的。
    在这里插入图片描述
    推流端积攒数据,可以在推流端drop数据,音频做变速,视频drop非I帧
  • 流媒体服务器的缓存队列
    服务器->拉流端 网络不好的时候采集积攒数据,才会导致延迟。网络好的时候快速往拉流端发。
  • 拉流队列
    在这里插入图片描述

问题:拉流2秒信号不好,没有拉到数据,网络恢复后,500ms拿到2秒数据:正常速率播放,延迟1.5秒。
解决方式:改变速率播放(技术难)或drop数据(技术简单)。

5)队列时间统计
push->pop
获取
back_pts front_pts
计算队列里面数据包持续的时间
如果出现回绕怎么办,通过 帧间隔*包数量 去做矫正
ffmpeg接口阻塞的问题

RTMP Darren推流
流媒体服务器:单个tcp通道,音频、视频、控制数据都是同一个通道

拉流:
客户端RTMP
PC web HTTP-FLV webtrc
手机web HLS(延迟比较)
TS TS

1个人推流,多个人拉流
1)某个拉流卡顿是否会阻塞其他人:不会

拉流卡顿,服务器里面队列会被循环覆盖,服务器可以设置拉流大小的。

每个客户端的队列,拷贝的码流是浅拷贝,类似share_ptr智能指针内存引用计数。

2)如果客户端不出现网络卡顿,那服务器不会缓存多少数据,如果出现了卡顿服务器缓存数据不会太少。

卡顿5秒>流媒体缓存5秒>网络恢复后 客户端是很快收到5秒的数据 ->客户端缓存了5秒数据->如果正常速度播放,延迟会有5秒
(1)丢掉一部分数据,比如4秒
(2)变速播放

3)读写数据周期
读取数据的周期
在这里插入图片描述

read:
每次读取1帧数据,读5帧要用户态/内核切换5次
每次读取5帧数据,只需要切换1次

写数据的周期
比如攒积10帧数据再write,可以减少cpu占用率

4)服务器延迟

在这里插入图片描述
(1)读写数据周期
(2)拉流队列的缓存
(3)gop cache queue

检测到最新的I帧就更新gop cache

gop cache开启的情况下,工牌 queue才有数据
比如gop2秒
开启:I P … P P I PP…P I
1)第2个I最理想的情况:指cacheI帧,刚好拉取到I帧
2)最糟糕,刚好错过I帧,等到I帧才有画面(可能要等2秒)
3)如果客户端队列数据超过阈值(最大延迟1秒),缓存队列那就只能最多缓存1秒的数据,变速播放加快数据消耗

2 测试延迟

推流->流媒体服务器转发SRS->拉流
在哪里会产生延迟?
1)推流端、采集数据延迟、编码延迟、推流延迟
(1)采集延迟:8k 2048个采样点 耗时间隔0.256秒=256毫秒(一般是23.3ms)
(2)编码延迟:不要插入b帧,使用zero latency配置
(3)推流:数据就是实时采集的,有数据马上推出去
检测指标
队列里面:音频帧数量、视频数量,能持续播放的时长
码率分析
推流码率—编码码率
1mbps----2mbps
---- 降低码率 1mbps
卡的比较:优先发送音频包

2)流媒体服务器转发

在这里插入图片描述

(1)怎么转发数据
各自有独立的队列,生产者(推流),消费者(拉流)
队列是有大小,比如最大缓存30秒。如果超过30秒的数据,覆盖旧数据。
(2)服务器有可能延迟
socket read读取数据是需要切换用户态/内核态的切换
20ms读取一次数据,200ms读取一次数据,延迟就比20ms读取一次大

3)拉流端
5秒后用户网络恢复正常
200ms内拉取5秒的数据

在这里插入图片描述
在这里插入图片描述
avformat_find_stream_info获取视频流, 查找编码信息,并尝试使用对应解码器去解,检测是否成功。
(1)从buffer读取数据,分析编码,但是对应这部分读取的buffer数据是不扔掉的,读取1秒时长去分析,这个函数被执行了1秒
(2)我们从buffer读取数据,分析编码器,也尝试解码,但是读取来的数据用完就扔掉

av_read frame 获取视频的一帧,获取音频的若干帧
(1)队列数据缓存较多
队列缓存数据多,不用丢掉,使用播放端是需要支持变速播放的功能
起播缓存阈值,这里音频数据达到X毫秒才开始播放。起播越大,越流畅,但是延迟大。

(2)网络抖动->直播是实时流,为什么还要做音视频同步,直播需要时间戳来做音视频同步。

网络抖动是指最大延迟和最小延迟的时差。比如你访问一个网站的最大延迟是10ms,最小延迟是5ms,那么网络抖动是5ms。

网络抖动原因:

  • I帧较大,占用带宽时间比较长
  • 信号不好的时候,网络拥塞的的时候

③ 解决网络抖动:
做缓存

– 采集端,采集间隔是匀称的,不代表接收端收到帧间隔也是匀称的。
I帧代表jpeg图片(371kb,40ms要能发送出去,37110248/0.04=75980800,约76mb,I帧发送,很容耗时大于>1/帧率)

I P P帧
40ms 40ms
– 接收端
P P I
90ms 80ms 0

  • 视频帧间隔不匀称
  • I帧

网络抖动是指最大延迟和最小延迟的时差。比如你访问一个网站的最大延迟是10ms,最小延迟是5ms,那么网络抖动是5ms

(2)服务器抖动 :读写

经常出现卡顿后,一般是攒积数据缓存

如有侵权,请联系删除。


http://www.niftyadmin.cn/n/146847.html

相关文章

电子信息研究生如何读一篇论文

如何读一篇论文 1、论文结构 ①、title ②、摘要abstract ③、引言introduction ④、相关工作提出的算法method ⑤、实验experiment ⑥、结论conclusion 一般论文都是这八股文的形式 2、三遍读一篇论文 第一遍:看标题和摘要、其次看结论。读完这三个部分大…

【iot】初识 边缘-网关-EMQX-Influxdb 全套流程 对比 边缘-网关-MQTT broker-Flink-influxdb

场景: 目前接手一个物联网项目,目前基本整理出了如下2套解决方案 图一:是我新调研的架构(基于EMQX架) 图二:是我们之前的架构(基于非EMQX产品Flink架构) 我始终相信,少…

Facebook的新算法,或许会让一些用户感到孤立?

"在一个数字化的世界里,我们需要更多的人类关系。我们需要的不仅仅是有机会去表达我们自己,而是有机会去连接我们与他人之间的关系。"这是Facebook创始人马克扎克伯格在2018年的一次演讲中所说的话。而如今,Facebook又一次推出了一…

Softing提供解决方案用于将Modbus TCP设备集成到工业物联网

一 挑战 随着工业物联网(IIoT)的不断发展,越来越多的现场设备数据需要被传输到上层应用中,以达到优化流程和提高效率的目的。 Modbus TCP是工业自动化系统中常用的通信协议,被广泛应用于控制器、数控机床和上位机等系…

【react】生命周期(旧)

生命周期的三个阶段: 初始化阶段:由ReactDOM.render()触发——初次渲染 constructor() 构造器componentWillMount() 组件将要挂载render() 初始化渲染和状态更新之后调用,调1n次componentDidMount() 常用 组件挂载完毕之后调用,…

MybatisPlus-Wrapper(条件构造器)

MybatisPlus-Wrapper(条件构造器) 1、wapper介绍 Wrapper : 条件构造抽象类,最顶端父类 ​ AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 ​ QueryWrapper : 查询条件封装 ​…

Go module依赖下载

require (github.com/json-iterator/go v1.1.12 )疑问假设go.mod中引入了以上这个依赖,那么go会如何去拉取依赖呢?Go的下载途径在回答这个问题之前,首先需要明确一点,go下载的依赖途径有两个:从vcs下载,例如…

Spring6的新特性,正式“抛弃”feign了

多数网友在对接第三方系统时,还在使用 httpclient、okhttp 等方式进行硬编码的形式实现对接。其实,我认为使用 feign 来实现更为方便快捷。feign 除了服务间的 http 调用外,还支持非服务间的 http 调用。只是,我们的一些思维还未转…