如何使用FEC解决网络丢包

    技术2023-05-24  71

    int main(int argc, char *argv[]) { int i, j, k; char arr[10][100] = { "aaa","bbb","ccc" ,"ddd","eee","fff", "ggg","hhh","iii", "jjj" }; char *data[10]; for (i = 0; i < 10; i++) { data[i] = arr[i]; } for (i = 0; i < 10; i++) { printf("before rs encode: <%s>\n", data[i]); } //6 strings protect 5 strings. //通过 K个有效数据,产生 M 个 FEC 冗余包,这 K + M 个数据,任意丢失 M 个数据,都能把 K 个有效数据恢复出来。 //此处K为6,M为10-6=4, rs_encode2(6, 10, data, 3); for (i = 0; i < 10; i++) { printf("after rs encode: <%s>\n", data[i]); } //simulate lost data. //任意丢失M个数据(4个)个数据 data[0] = 0; // 0 is NULL. data[1] = 0; data[2] = 0; data[4] = 0; //data[1]=0; //data[2]=0; int ret = rs_decode2(6, 10, data, 3); for (i = 0; i < 6; i++) { printf("after rs decode: <%s>\n", data[i]); } return 0; }

    基于UDP的RTP传输在复杂的公网环境下,尤其是3G、4G、WIFI网络时面临丢包、乱序、重复、抖动等问题,严重影响实时音视频互动效果,即使是一个rtp包得丢失,如果接收端不做处理,也会导致视频马赛克的出现,本方案采用多种方式结合,致力于解决udp传输视频包丢失问题,方案包括视频接收端jitter buffer 处理包乱序/重复问题,FEC(前向纠错) 优先处理丢包恢复,以及当fec恢复不了丢失数据包时采用丢包重传策略请求重传数据包,如果重传依然有丢包情况,则解码端不去解码(有可能花屏),直接请求发送方发送I帧,这几种方式组合,在实践中能有效避免丢包导致的花屏,卡顿现象,通过调整FEC冗余度,可以达到不同丢包率的处理。

    这里的FEC前向纠错技术已经应用很广泛,其大概原理就是每K个媒体包发出后,利用这个K个媒体包生成N-K个冗余包,这里的N是媒体包和数据包的总和,接收端只要接收到K个数据包(包括媒体包和冗余包),就可以恢复出K个媒体包中任意一个丢失的媒体包  

     

     

    通过 K个有效数据,产生 M 个 FEC 冗余包,这 K + M 个数据,任意丢失 M 个数据,都能把 K 个有效数据恢复出来。

    https://www.yisu.com/zixun/14314.html

    Processed: 0.009, SQL: 9