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
};
相关推荐
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉6 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
Dola_Pan7 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2337 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程7 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
阿洵Rain8 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法