C++ 音频

一、采样频率

当前主流的采样频率为22.05K Hz、44.1K Hz、48KHz

22.05KHz :为FM广播声音品质

44.1KHz :为理论上最高的CD声音品质(直播,录像,acc)

48KHz人耳可分辨的最高采样频率

( 比如 " 44100Hz 16bit stereo " 表示 采样频率44.1 KHz,每个采样点占2 字节,双声道

( 比如 " 22050Hz 8bit mono " 表示 采样频率22.05 KHz,每个采样点占1 字节,单声道

二、PCM

PCM(Pulse Code Modulation) 为 脉冲编码调制。PCM中的声音数据没有被压缩。

一般情况下,一帧PCM由2048次采样获得。

注意:双声道时,采样低字节在前,高字节在后

1分钟的PCM声音大小 = 44100 × 2(声道) × 2(字节) 60(秒) ÷ 1024 ÷ 1024 ≈ 10MB(兆)

直接传输非常大,因此需要对PCM流进行压缩。(最常见的压缩方式:aac)

三、aac

aac是音频流PCM最常用的压缩方式,除此以外还有g711,opus,mp3等。

3.1 数据格式

acc有两种数据格式:

ADIF(Audio Data Interchage Format):音频数据交换格式。只有一个统一的头,

必须得到所有数据后才能解码,适用于本地文件。

ADTS(Audio Data Transport Stream):音频数据传输流。每一帧都有头信息,

任意帧解码,适用于传输流

cpp 复制代码
struct AdtsHeader {        
    unsigned int syncword;  //12 bit 同步字 '1111 1111 1111',一个ADTS帧的开始
    uint8_t id;        //1 bit 0代表MPEG-4, 1代表MPEG-2。
    uint8_t layer;     //2 bit 必须为0
    uint8_t protectionAbsent;  //1 bit 1代表没有CRC,0代表有CRC

    uint8_t profile;           //2 bit AAC级别(MPEG-2 AAC中定义了3种profile,MPEG-4 AAC中定义了6种profile)
    uint8_t samplingFreqIndex; //4 bit 采样率(4表示44100Hz)
    uint8_t privateBit;        //1bit 编码时设置为0,解码时忽略
    uint8_t channelCfg;        //3 bit 声道数量
    uint8_t originalCopy;      //1bit 编码时设置为0,解码时忽略
    uint8_t home;               //1 bit 编码时设置为0,解码时忽略

    uint8_t copyrightIdentificationBit;   //1 bit 编码时设置为0,解码时忽略
    uint8_t copyrightIdentificationStart; //1 bit 编码时设置为0,解码时忽略
    unsigned int aacFrameLength;               //13 bit 一个ADTS帧的长度包括ADTS头和AAC原始流
    unsigned int adtsBufferFullness;           //11 bit 缓冲区充满度,0x7FF说明是码率可变的码流,不需要此字段。CBR可能需要此字段,不同编码器使用情况不同。这个在使用音频编码的时候需要注意。

    /* number_of_raw_data_blocks_in_frame
     * 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧
     * 所以说number_of_raw_data_blocks_in_frame == 0
     * 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
     */
    uint8_t numberOfRawDataBlockInFrame; //2 bit
};
相关推荐
Wendy_robot12 分钟前
远程连接MySQL并操作
linux·c++·mysql
DisonTangor29 分钟前
DepthCrafter:为开放世界视频生成一致的长深度序列
人工智能·计算机视觉·音视频
oliveira-time30 分钟前
C++ prime plus课后习题-第二章
开发语言·c++·算法
mit6.8241 小时前
[Linux#49][UDP] 2w字详解 | socketaddr | 常用API | 实操:实现简易Udp传输
linux·网络·c++·笔记·后端
0点51 胜1 小时前
[ffmpeg]音频格式转换
开发语言·c++·ffmpeg
guigui_hello1 小时前
VScode的简单使用
c++·ide·vscode·编辑器
宗浩多捞2 小时前
C++设计模式(更新中)
开发语言·c++·设计模式
Smart-Space2 小时前
HtmlRender - c++实现的html生成类
c++·html
学习使我变快乐4 小时前
C++:析构函数
开发语言·c++
Aomnitrix4 小时前
网络协议全景:Linux环境下的TCP/IP、UDP
linux·运维·网络·c++·网络协议·tcp/ip·运维开发