1. 音频质量提升
实时音频的传输中为了提升音频质量,一般要对音频做特殊处理:降噪、回声消除、自动增益(3A算法)。通过编解码器自身的的算法特性可以实现上述内容。但是也有专门的库来帮助实现对音频质量的提升。speexdsp库可以对声音数据中的高频声音和低频声音进行抑制,并进行降噪。同时speexdsp也提供了3A算法对音频增益。
1.1 speexdsp实现降噪
参考:https://avmedia.0voice.com/?id=54262
下面是使用speexdsp库抑制声音数据中的高频声音、低频声音并进行降噪的示例代码,假设采样率为44100Hz。
#include <stdio.h>
#include <stdlib.h>
#include <speex/speex_preprocess.h>
#define FRAME_SIZE 1024
int main()
{// 创建Speex预处理器SpeexPreprocessState *preprocess_state;preprocess_state = speex_preprocess_state_init(FRAME_SIZE, 44100); // 根据实际采样率调整// 设置预处理参数,包括高频抑制、低频抑制和降噪int enabled = 1;speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_DENOISE, &enabled);speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_AGC, &enabled);speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_DEREVERB, &enabled);// 打开输入文件和输出文件FILE *input_file, *output_file;input_file = fopen("input.raw", "rb");output_file = fopen("output.raw", "wb");if (input_file == NULL || output_file == NULL) {printf("文件打开失败\n");return -1;}short in[FRAME_SIZE];short out[FRAME_SIZE];while (fread(in, sizeof(short), FRAME_SIZE, input_file) > 0) {// 处理输入数据speex_preprocess_run(preprocess_state, in);// 写入处理后的数据到输出文件fwrite(in, sizeof(short), FRAME_SIZE, output_file);}fclose(input_file);fclose(output_file);// 清理资源speex_preprocess_state_destroy(preprocess_state);return 0;
}
编解码
1.1 实时音频传输常用编解码格式
1.2 OPUS编解码
实时传输
抗弱网
1.1 传输层
jitterBuffer(重组)、RTCP、自动重传
1.2 编码层
opus编解码:前向纠错(FEC)、丢包隐藏(PLC)、流量控制