如何使用FEC解決網絡丟包

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章