声网 Agora 在 2019 年 10 月 24 日,正式对所有开发者开源自研的抗丢包音频编解码器 SOLO。该编解码器适用于所有需要实时音频交互的场景,特别针对弱网对抗进行了优化,并且在相同弱网环境下 MOS 分优于 Opus。SOLO 可应用于各类 RTC 应用,并且可不与 Agora SDK 绑定。
本文作者:声网 Agora 音频算法工程师 赵晓涵。
SKP_int SKP_Silk_SDK_Encode(void *encState, /* I/O: State */const SKP_SILK_SDK_EncControlStruct *encControl, /* I: Control structure */const SKP_int16 *samplesIn, /* I: Input samples */SKP_int nSamplesIn, /* I: Number of samples */SKP_uint8 *outData, /* O: Encoded output */SKP_int16 *nBytesOut /* I/O: I: Max bytes O:out bytes */)
SKP_int SKP_Silk_encode_frame_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_uint8 *pCode, /* O Payload */SKP_int16 *pnBytesOut, /* I/O Payload bytes *//* input: max ; output: used */const SKP_int16 *pIn /* I Input speech frame */)
SKP_int SKP_Silk_VAD_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */const SKP_int16 *pIn /* I Input signal */)
void SKP_Silk_find_pitch_lags_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */SKP_float res[], /* O Residual */const SKP_float x[] /* I Speech signal */)
void SKP_Silk_noise_shape_analysis_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */const SKP_float *pitch_res, /* I LPC residual */const SKP_float *x /* I Input signal */)
void SKP_Silk_find_pred_coefs_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */const SKP_float res_pitch[] /* I Residual */)
void SKP_Silk_NSQ_wrapper_FLP(SKP_Silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */SKP_Silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */const SKP_float x[], /* I Prefiltered input signal */SKP_int8 q[], /* O Quantized pulse signal */SKP_int8 *q_md[], /* O Quantized pulse signal */const SKP_int useLBRR /* I LBRR flag */)
void SKP_Silk_NSQ_del_dec(SKP_Silk_encoder_state *psEncC, /* I/O Encoder State */SKP_Silk_encoder_control *psEncCtrlC, /* I Encoder Control */SKP_Silk_nsq_state *NSQ, /* I/O NSQ state */SKP_Silk_nsq_state NSQ_md[MAX_INTERLEAVE_NUM], /* I/O NSQ state */const SKP_int16 x[], /* I Prefiltered input signal */SKP_int8 q[], /* O Quantized pulse signal */SKP_int8 *q_md[ MAX_INTERLEAVE_NUM ], /* O Quantized qulse signal */SKP_int32 r[], /* O Output residual signal */const SKP_int LSFInterpFactor_Q2, /* I LSF interpolation factor in Q2 */const SKP_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Prediction coefs */const SKP_int16 LTPCoef_Q14[ LTP_ORDER * NB_SUBFR ], /* I LT prediction coefs */const SKP_int16 AR2_Q13[ NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping filter */const SKP_int HarmShapeGain_Q14[ NB_SUBFR ], /* I Smooth coefficients */const SKP_int Tilt_Q14[ NB_SUBFR ], /* I Spectral tilt */const SKP_int32 LF_shp_Q14[ NB_SUBFR ], /* I Short-term shaping coefficients */const SKP_int32 Gains_Q16[ NB_SUBFR ], /* I Gain for each subframe */const SKP_int32 MDGains_Q16[ NB_SUBFR ], /* I New gain, no use now */const SKP_int32 DeltaGains_Q16, /* I Gain for odd subframe */const SKP_int Lambda_Q10, /* I Quantization coefficient */const SKP_int LTP_scale_Q14 /* I LTP state scaling */)
void SKP_Silk_encode_parameters(SKP_Silk_encoder_state *psEncC, /* I/O Encoder state */SKP_Silk_encoder_control *psEncCtrlC, /* I/O Encoder control */SKP_Silk_range_coder_state *psRC, /* I/O Range encoder state */SKP_intmd_type, /* I Use MDC or not */const SKP_int8 *q /* I Quantization indices */)
1. 只收到第一条描述码流;
2. 只收到第二条描述码流;
3. 两条码流都收到;
4. 该帧对应码流都没有收到。
SKP_int AgoraSateDecodeTwoDesps(SKP_Silk_decoder_state *psDec, /* I/O Silk decoder state */SKP_Silk_decoder_control*psDecCtrl,SKP_int16 pOut[], /* O Output speech frame */const SKP_int nBytes1, /* I Payload length */const SKP_int nBytes2, /* I Payload length */const SKP_uint8 pCode1[], /* I Pointer to payload */const SKP_uint8 pCode2[], /* I Pointer to payload */SKP_intdesp_type,SKP_int decBytes[] /* O Used bytes */)


