前向糾錯也叫前向糾錯碼(Forward Error Correction,簡稱FEC),是增加數據通訊可信度的方法。在單向通訊信道中,一旦錯誤被發現,其接收器將無權再請求傳輸。FEC 是利用數據進行傳輸冗餘信息的方法,當傳輸中出現錯誤,將允許接收器再建數據。
FEC通過冗餘編碼的方式將當前幀數據冗餘一些到後一幀數據,因此當發現當前幀丟失,可以通過後一幀數據恢復。
int opus_decode ( OpusDecoder
∗ st, const unsigned char
∗ data, opus_int32
len, opus_int16
∗ pcm, int frame_size,
int decode_fec
)
opus_decode可以通過放空包或者打開的FEC的情況下嘗試恢復數據。
當data爲NULL時,len應該爲0, 此時opus嘗試解一幀pcm數據,猜出這一幀數據;
當decode_fec爲1時,使用FEC機制,嘗試恢復前一幀數據;否則編碼當前幀;
羅列以下三種情況並例舉僞代碼:
1. 前一幀與當前幀均正常, 前一幀數據正常解碼;
opus_decode(decoder, previous_frame, frame_size, pcm, pcm_size, 0);
2. 前一幀丟失,當前幀正常,可以通過打開FEC的方式解碼當前幀,嘗試恢復前一幀;
opus_decode(decoder, current_frame, frame_size, pcm, pcm_size, 1);
3. 前一幀與當前幀均丟失,通過放空包的方式,嘗試猜出前一幀數據;
opus_decoder(decoder, NULL, 0, pcm, pcm_size, 0);
因此可以通過預先緩存一幀數據的方式進行解碼,每次收到一幀數據後,解碼前一幀,此時需要考慮上述三種情況決定放入何種數據。