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
};
相关推荐
EasyCVR4 小时前
EasyRTC嵌入式视频通话SDK的跨平台适配,构建web浏览器、Linux、ARM、安卓等终端的低延迟音视频通信
android·arm开发·网络协议·tcp/ip·音视频·webrtc
Dream it possible!5 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
My Li.6 小时前
c++的介绍
开发语言·c++
邪恶的贝利亚8 小时前
C++之序列容器(vector,list,dueqe)
开发语言·c++
原来是猿8 小时前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
成功助力英语中国话8 小时前
SDK编程,MFC编程,WTL编程之间的关系
c++·mfc
StudyWinter8 小时前
FFmpeg-chapter7和chapter8-使用 FFmpeg 解码视频(原理篇和实站篇)
ffmpeg·音视频
仟濹9 小时前
【算法 C/C++】二维差分
c语言·c++·算法
总斯霖9 小时前
题解:士兵排列
数据结构·c++·算法
稳兽龙9 小时前
P4268 [USACO18FEB] Directory Traversal G
c++·算法·换根dp