音视频--音频实时传输

1. 编解码

1.1 音频编解码原理

参考:https://blog.csdn.net/qq_42233059/article/details/134628085

(1) 编码

音频编码的基本原理是利用声学特性和听觉心理学原理对音频信号进行压缩。具体过程包括以下几个步骤:

  • 采样:将连续的模拟音频信号转换为离散的数字信号,即进行采样操作。
  • 量化:将采样后的信号进行量化,将连续的信号值映射为离散的取值,以减小数据量。
  • 压缩编码:对量化后的信号进行编码,将信号表示为更紧凑的形式。编码方法包括预测编码、变换编码和熵编码等。
  • 打包:将编码后的数据组织为数据包,便于传输和存储。

(2) 解码

音频解码的过程则是编码过程的逆过程,包括解包、解码、反量化和重构等步骤。解码后的信号经过数字模拟转换,即可恢复为模拟音频信号,下面是音频解码的主要步骤和原理:

  • 解包(Demultiplexing):音频解码器首先需要对编码后的音频数据进行解包。编码过程中,音频数据可能被分割成多个包或帧,并与其他相关的信息(如采样率、比特率、声道数等)一起打包在一起。解包阶段的任务是从数据流中提取出音频数据和相关信息。

  • 解码(Decoding):解码是音频解码的核心步骤。在这一步骤中,音频编码器使用特定的解码算法将压缩的音频数据转换回原始的数字音频信号。解码算法根据编码过程中使用的压缩算法和编码参数,对压缩后的数据进行逆操作,还原出原始的频域或时域表示。

  • 反量化(Dequantization):在编码过程中,音频信号的频域或时域表示经过了量化操作,即将连续的信号值转换为离散的数值。在解码阶段,需要对量化后的数据进行反量化操作,将离散的数值恢复为连续的近似值。反量化过程使用与编码过程相反的量化表或算法,将离散的数据重新映射到原始的数值范围内。

  • 重构(Synthesis):重构是将解码和反量化后的数据转换为模拟音频信号的过程。根据音频编码的特性和算法,重构阶段可能涉及滤波、插值和合成等操作。这些操作的目标是将解码后的数据转换为与原始音频尽可能接近的模拟信号。

  • 数字模拟转换(Digital-to-Analog Conversion):解码和重构后的音频数据仍然是数字形式的,需要进行数字模拟转换(DAC)以将其转换为模拟音频信号。DAC将离散的数字样本转换为连续的模拟信号,以便在扬声器或耳机等音频播放设备上播放。

通过以上步骤,音频解码器能够逆向操作,从压缩的音频数据中还原出高质量的模拟音频信号。解码的过程需要根据所采用的音频编码标准和算法进行相应的解析和计算,以确保解码后的音频质量和准确性。

1.2 实时音频传输常用编解码格式

PCMA、PCMU、Opus等

1.3 OPUS编解码

1.3.1 Opus特性

Opus在实时音频传输中的抗弱网能力比较优秀,但是需要开启RTCP的支持。

Opus编解码器具有以下显著特性,使其在多种应用场景中表现出色,尤其是在实时通信和流媒体领域:

  • 广泛的比特率支持:Opus可以在极低到极高的比特率范围内工作,从6kb/s至510kb/s,这使得它既适合低带宽的语音通话,也适合高质量的音乐传输。
  • 动态调整编码参数:Opus采用自适应编码算法,能够根据音频信号的内容和网络条件动态调整编码参数,包括比特率和复杂度,以优化压缩效率和音质。
  • 多采样率支持:支持从窄带(8kHz)到全频带(48kHz)的采样率,适应不同质量需求和网络环境。
  • 低延迟:Opus设计用于低延迟传输,其默认延迟仅为22.5毫秒,非常适合实时交互式通信,如VoIP、在线游戏和视频会议。
  • 带内前向纠错(FEC):内置前向纠错功能可以在不增加额外带宽需求的情况下提高包丢失网络中的音频质量。
  • 静音检测与丢弃(DTX):在没有声音输入时减少不必要的数据传输,进一步节省带宽。
  • 包丢失隐藏(PLC):即使在网络丢包的情况下也能提供连续的音频体验,通过算法预测丢失的数据来减少中断感。
  • 开源免费:Opus是完全开源的,并且不受专利限制,适用于各种应用场景,无需支付许可费用。
  • 兼容性和标准化:Opus被标准化为RFC 6716,得到广泛的支持,包括WebRTC标准的一部分,以及多种操作系统和音频软件。
  • 融合编码技术:结合了Skype的SILK(擅长语音编码)和Xiph.Org的CELT(擅长音乐编码)的优点,使得Opus在不同类型的音频内容上都能表现良好。

这些特性共同构成了Opus编解码器的强大性能,使其在众多音频编解码方案中脱颖而出,尤其是在对延迟敏感和网络条件多变的环境中。

1.3.2 Opus使用

可以基于libopus开源库实现原始音频数据的Opus编解码操作

2. 音频质量提升

实时音频的传输中为了提升音频质量,一般要对音频做特殊处理:降噪、回声消除、自动增益(3A算法)。通过编解码器自身的的算法特性可以实现上述内容。但是也有专门的库来帮助实现对音频质量的提升。speexdsp库可以对声音数据中的高频声音和低频声音进行抑制,并进行降噪。同时speexdsp也提供了3A算法对音频增益。

2.1 speexdsp实现降噪

参考:https://avmedia.0voice.com/?id=54262

下面是使用speexdsp库抑制声音数据中的高频声音、低频声音并进行降噪的示例代码,假设采样率为44100Hz。

c 复制代码
#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 传输层

jitterBuffer(重组)、RTCP、自动重传

1.2 编码层

opus编解码:前向纠错(FEC)、丢包隐藏(PLC)、流量控制

相关推荐
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
声网2 小时前
「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024
人工智能·音视频
Mr.简锋6 小时前
opencv视频读写
人工智能·opencv·音视频
春末的南方城市7 小时前
开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序
人工智能·计算机视觉·aigc·音视频
Hali_Botebie7 小时前
采样率22050,那么CHUNK_SIZE 一次传输的音频数据大小设置多少合适?unity接收后出现卡顿的问题的思路
音视频
风之馨技术录8 小时前
智谱AI清影升级:引领AI视频进入音效新时代
人工智能·音视频
晚点吧8 小时前
视频横屏转竖屏播放-使用人脸识别+目标跟踪实现
人工智能·目标跟踪·音视频
EasyCVR8 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
cuijiecheng201810 小时前
音视频入门基础:MPEG2-TS专题(3)——TS Header简介
音视频
学编程的小程18 小时前
【安全通信】告别信息泄露:搭建你的开源视频聊天系统briefing
安全·开源·音视频