功能简介
极简音视频点对点SDK:SDT-P2P
::: highlight red 💡
SDT点对点传输协议是基于QosFecNack库封装的低延迟、抗弱网传输协议,用于点对点场景。
:::
SDT点对点传输协议支持:抗弱网FEC\QOS传输、码率自适应建议输出、JitterBuff抖动自适应、发送端Smooth平滑、接收端丢包冻结、接收端IDR请求、码流拆分拼接等功能,对外提供非常简易的调用接口,方便快速集成。
SDT点对点传输协议包括两个版本:纯传输层版本、内置编解码器版本。前者仅处理编码后的音视频码流,编解码交由外层自行实现;后者在前者基础上进一步集成了音视频编解码,方便更上层应用直接调用。用户可根据自身情况选择合适的版本。
SDK特性:
- 1、 支持基于RS编码的FEC前向纠错,专为音视频类应用量身定制。
- 2、 支持FEC动态Group分组,避免分组跨帧同时尽可能提升抗连续丢包能力。
- 3、 发送端传入单帧码流,内部自行拆分拼接,实现透传。
- 4、 发送端支持Smooth平滑发送,对视频大I帧场景进行优化。
- 5、 支持接收端自适应JitterBuff缓存技术。
- 6、 独有的NACK重传技术,与FEC高度配合,降低无效重发率。
- 7、 两套独立SDK分别适应不同场景,一套仅负责传输层,外层应用负责编解码。一套负责编解码以及网络传输,外层负责采集、渲染。
- 8、 C++开发,性能强劲,自主知识产权,不依赖开源项目,无外部库依赖,支持Windows、Android、Linux、海思、瑞芯微等嵌入式,支持32位、64位系统,支持X86、ARM架构。
- 9、 API接口简洁易用、完善的文档与DEMO参考。
::: tip
SDT点对点传输协议支持ACK和NACK两种模式。NACK模式适用于绝大多数场景,建议使用。
:::
::: tip
SDT点对点传输协议 [纯传输层版本] 调用流程:
:::
1、设置对端IP、端口信息
2、设置传输抗弱网属性(冗余策略等)
3、发送一帧带起始码视频码流 或 一帧ADTS音频码流
4、接收端在接收回调中处理收到的一帧带起始码视频码流 或 一帧ADTS音频码流
::: tip
SDT点对点传输协议 [内置编解码器版本] 调用流程:
:::
1、设置对端IP、端口信息
2、设置传输抗弱网属性(冗余策略等)
3、设置编码属性(分辨率码率等)
3、发送一帧视频YUV 或 一帧音频PCM
4、接收端在接收回调中处理收到的一帧视频YUV 或 一帧音频PCM
::: highlight red 💡
重要术语说明
:::
FEC:前向纠错技术,通过增加冗余带宽方式,提高网络对于丢包的抵抗力。
NACK:重传请求机制,与FEC配合,在预估FEC无法恢复时触发接收端到发送端的重传请求,发送端予以重发响应。NACK仅重传一次,不保证数据一定传输成功,优点是可以获得稳定的低延时,缺点是画面仍可能因丢包而卡顿。
ACK:应答传输方式。ACK保证数据一定传输成功,但延时可能出现不可控的放大。具体表现为:非极端网络环境下,稳定性流畅度较NACK方案好。极端环境下可出现延时放大。本系统同时提供了ACK与NACK两种能力,通过开关可控,用户根据业务场景选择合适的工作方式。
Smooth平滑:发送端对一帧较大的码流在时间窗口内平滑发送,避免一次性发出给网络带来的压力。
JitterBuff:接收端为了抵消网络传输、丢包恢复、NACK重传引入的抖动,引入JitterBuff缓存。缓存时间越大,画面流畅度越高,但延时也同步增大。当需要极低延时时,可设置JitterBuff为0。设置为非0值时,该值将作为JitterBuff初始值,后续本模块将根据网络情况自行调整缓存时间。
IDR请求:接收端若出现视频帧丢包无法恢复时,将向发送端发起编码IDR帧请求,发送端可以即刻编码IDR帧,使得接收端尽快恢复。
丢包冻结机制:接收端若出现视频帧丢包无法恢复时,可以采取停止解码、渲染,直至完整的IDR帧到来再继续解码渲染的方式,避免用户察觉到画面花屏。本SDK内部实现了丢包冻结,确保外层始终获得可解码可渲染码流。
时间戳模式:本SDK提供了内置时间戳(默认)和外部时间戳两种模式,当用户选择外部时间戳模式时,需在发送端提供音视频时间戳(1KHZ时基,即毫秒单位),该时间戳将在接收端透传露出。当用户选择内置时间戳模式时,SDK将在用户调用SDK发送接口时自动生成时间戳,以简化用户使用。
码率自适应:本SDK提供了码率自适应能力,内部将根据网络状况实时对外输出码率调整建议。SDK支持的码率自适应模式包括:关闭码率自适应、优先调整帧率模式、优先调整编码码率模式三种。
1、优先调整帧率模式:是在保持编码器参数不变的情况下,通过降低实际送编码器的帧率(在采集之后、编码之前进行丢帧),实现画面质量基本不变的同时间接降低带宽。
2、优先调整编码码率模式:该模式要求外层编码器支持动态设置编码码率,保持画面流畅性,降低编码码率(画质)来适应网络。
目前业内以优先调整编码码率模式居多(流畅性优先),推荐使用。
::: caution
当使用ACK模式时,外层必须实现码率自适应策略。当使用NACK模式时,推荐外层实现码率自适应策略。
:::
::: caution
当启用码率自适应时,本SDK提供了两个码率自适应接口(调整帧率、调整码率),均需实现。因为码率自适应建议可能同时调整二者。
:::
内部拆包传输:外层传入一帧码流后,SDK内部将进行拆分发送,拆分包大小与FEC min group取值相关,原则上400~1000字节之间波动,拆分后的包大小加上私有头部、UDP\IP头部后不会超过1500字节。接收端SDK将完成拼接后送外层应用。外层应用对拆分与拼接无感知。
FEC相关参数:FEC相关参数包括FEC冗余度方法、FEC上行冗余度、FEC min group组大小、FEC max group组大小。FEC冗余度方法包括:固定冗余度、自动冗余度两种。
1、固定冗余度即全程使用用户指定的冗余度进行FEC编码。
2、自动冗余度则以用户指定的FEC冗余度为基础,根据网络情况进行调整,对于网络较好的场合使用低冗余尽量降低带宽。
FEC是分组进行的,即多个拆分包组成一个group,产生其冗余包。group越大,同样冗余度的情况下,产生的冗余包越多,抵抗连续丢包能力越强,但FEC分组越大消耗CPU资源也越大。
::: tip
建议配置FEC min group大小16;建议根据芯片处理性能设置FEC max group,在性能足够的设备上建议设置为64(PC、主流Android手机均可设置为64,嵌入式平台则根据实际情况设置)。
:::