首页 > 其他分享 >常见音频格式的基础知识

常见音频格式的基础知识

时间:2023-02-14 22:33:27浏览次数:34  
标签:采样 字节 音频格式 pcm 常见 基础知识 PCM 数据 uint32

PCM

脉冲编码调制(Pulse Code Modulation),是未经压缩的音频数据裸流,它由模拟信号经过采样、量化、编码转换成的数字音频数据。

PCM的文件/流中只有数据,需要参数来描述。描述PCM数据的6个参数:

  • Sample Rate采样频率,8kHz(电话),44.1kHz(CD),48kHz(DVD)

  • Sample Size量化位数,通常该值为16bit

  • Number of Channels通道个数,常见有立体声和单声道

  • Sign,表示样本数据是否有符合位

  • Byte Ordering字节序,通常为little-endian

  • Integer Or Floating Point整形或浮点型,大多数PCM样本使用整形,一些精度要求高的使用浮点型。

比较重要的参数有:采样频率、通(声)道数

数据格式

如果是单声道的音频文件,采样数据按时间的先后顺序依次存入,如果是双声道的就按照LRLRLR的方式存储,16bit的存储和字节序有关。

G711

G711是国际电信联盟ITU-T定制出来的一套语言压缩标准,它代表了对数PCM(pulse code modulation/脉冲编码调制)抽样标准。采样率一般为8KHz。

G.711 标准下主要有两种压缩算法,u-law,主要应用于北美和日本;a-law,主要应用于欧洲和其他地区:

  • a-law:将一个13bit的pcm数据编码成一个8bit的pcm数据(PCMA)

  • u-law:将一个14bit的pcm数据编码成一个8bit的pcm数据(PCMU)

G711主要应用于电话语言通信,因为人声最大频率在3.4kHz,所以8kHz的采样率可以保证还原原始的声音。

WAV文件

wav是一种无损的音频文件格式。所有的WAV都有一个文件头,包含了这个音频的编码参数。wav对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。

对PCM数据来说,加上wav文件头就变成了wav格式。

不同格式的数据,wav文件头的格式也略有不同,标准PCM数据的wav文件头是44字节,而ulaw或alaw的文件头会多一个区块,占58字节。

PCM数据对应的WAV文件头:

区块名 bytes 端序 内容 说明
ChunkID 4 "RIFF"
ChunkSzie 4 N+sizeof(head)-8 N是音频数据的长度
Format 4 "WAVE"
Subchunk1ID 4 "fmt " fmt加空格
Subchunk1IDsize 4 16or18
AudioFormat 2 音频格式 PCM: 0x01;a-law: 0x06;u-law: 0x07
NumChannels 2 通道数 单声道:1,立体声:2
SampleRate 4 采样频率Hz
ByteRate 4
SampleRate * NumChannels * BitsPerSample/8
BlockAlign 2
NumChannels * BitsPerSample/8
BitPerSample 2or4 8bits=8, 16bits=16

采样位深
是压缩编码数据时占4字节,正常编码数据占2字节


factchunkID 4 "fact" 压缩编码的数据需要这个块,否则不需要
factchunkIDsize 4 4
factData 4
可以是音频数据长度
Subchunk2ID 4 "data"
Subchunk2IDsize 4 N 音频数据的长度
data N

//WAVE文件一般有四种块,它们依次是:RIFF块、格式块、附加块(可选),数据块    
#pragma pack(1)    
typedef struct {        
    //RIFF块        
    uint8_t   riffID[4];     //RIFF标识
    uint32_t  fileSize;      //文件大小        
    uint8_t   fccType[4];    //WAVE标志        
    //fmt块        
    uint8_t   fmtID[4];        //fmt         
    uint32_t  ckLen;           //块大小  pcm-0x10;ulaw-0x12;alaw-0x12
    uint16_t  wFormatTag;      //音频格式 pcm-0x01;ulaw-0x07;alaw-0x06
    uint16_t  nChannels;       //采样声道数
    uint32_t  nSamplesPerSec;  //采样率
    uint32_t  nAvgBytesPerSec; //每秒字节数  采样率*采样精度/8(字节位数)
    uint16_t  cbSize;        
    uint32_t  bPerSample;      //每个采样位数,量化数(pcm为2byte)
    //fact块,压缩编码须有该块        
    uint8_t   factID[4]; //fact
    uint32_t  factSzie;  //4
    uint32_t  factData;
    //data块
    uint8_t   wdid[4];   //data 标志
    uint32_t  wdSize;    //块大小    
} WAVFILEHEADER;    
//0x3A(58)字节
//针对ulaw和alaw,未经压缩的原始pcm对应的wav文件头有所不同
#pragma pack()

ADTS

ADTS的全称是Audio Data Transport Stream,是AAC音频的一种传输流格式。

这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。也就是说它每一帧都有头信息,可以在任意位置开始解码。

AAC音频文件的每一帧由Header和Data组成,header长度为7字节或者9字节,一般为7字节,有CRC校验为9字节。

如下表:

bits
fixed_header
syncword 12 同步头,总是0xFFF
ID 1 0标识MPEG-4,1标识MPEG-2
layer 2 总是00
protection_absent 1 1没有CRC,0有CRC
profile 2 AAC级别
sampling_frequency_index 4 采样率列表的下标
private_bit 1
channel_configuration 3 声道数
original_copy 1
home 1
variable_header
copyright_id_bit 1
copyright_id_start 1
aac_frame_length 13 帧长度,包括帧头和数据
adts_buffer_fullness 11 0x7FF表示码率可变
number_of_raw_data_blocks_in_frame 2
//采样率列表
static unsigned const samplingFrequencyTable[16] = {   
    96000, 88200, 64000, 48000,   
    44100, 32000, 24000, 22050,   
    16000, 12000, 11025, 8000,   
    7350, 0, 0, 0    
};

标签:采样,字节,音频格式,pcm,常见,基础知识,PCM,数据,uint32
From: https://www.cnblogs.com/TaXueWuYun/p/17084003.html

相关文章

  • 常见的SQL注入绕过身份验证
    or1=1or1=1–or1=1#or1=1/*admin”or“1”=”1″–admin”or“1”=”1″#admin”or“1”=”1″/*admin”or1=1or“”=”admin”or1=1admin”or1=1–admin......
  • 计算机基础知识
    冯.诺依曼体系结构cpu里面主要有运算器和控制器,控制器可以控制输入设备、存储器、输出设备,运算器从存储器中提取数据进行运算然后返回给存储器。计算机软件系统软件:;DOS......
  • java基础知识点(while循环、do....while循环以及while和for循环之间
    一:循环1.格式:初始化语句;      while(条件判断语句){       循环体语句;  .​     条件控制语句;}​2.eg:intx=1;//定义变量初始......
  • RTCP常见报文格式(申请I帧/RR/SR/SDES)
        本篇文章是基于对RTCP基本协议有所了解情况下,进行说明,因为RTCP在丢包重传(ARQ)方面需要使用到,具体可以查看RTCP相关rfc文档或者博客。所以本篇文章主要是从抓包......
  • Redis常见使用场景
    1、缓存热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。2、数据共享分布式String类型,因为Redis是分布式的独立服务,可以在多个应用......
  • 2.13python基础知识
      编程语言的发展史1.机器语言:内部用0和1表示2.汇编语言:简单的字母表示二进制3.高级语言:人类可以理解的1、执行效率:机器语言>汇编语言>高级语言(编译型>解释型)2......
  • 最全的常见端口及其利用方式 (速查表 比以往还全)
    当然今天又是水文章的一天,今天看到有个大哥分享的文章再想想端口利用方式的文章在文件夹吃灰,就想起总结一下端口利用当然,好不容易写出来的(抄的)咳咳!  端口利用端......
  • kafka 常见命令以及增加topic的分区数
    基础命令1.创建topickafka-topics.sh--bootstrap-server${kafkaAddress}--create--topic${topicName}--partitions${partipartions}--replication-factor${rep......
  • Linux最常见的4个截取命令详解!
    在Linux系统中截取命令有很多,但比较常用的截取命令一般包含:cut命令、printf命令、awk命令、sed命令,接下来我们通过这篇文章为大家详细的介绍一下这四个命令。1、cut......
  • Python常见面试题(持续更新 23-2-13)
    Python常见面试题(持续更新23-2-13)参考资料https://github.com/taizilongxu/interview_pythonhttps://github.com/hantmac/Python-Interview-Customs-Collectionhtt......