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 个有效数据恢复出来。