多媒体知识体系之音频格式
2016-07-28 10:04:59 2 举报
AI智能生成
多媒体知识体系之音频格式
作者其他创作
大纲/内容
AAC
常见格式
LATM格式
Low-overhead MPEG-4 Audio TransportMultiplex
主要由AudioSpecificConfig(音频特定配置单元)与音频负载
带内传
每一个LATM 帧,都含有一个AudioSpecificConfig 信息
带外传
每一个LATM帧都不含有AudioSpecificConfig 信息
而通过其他方式把AudioSpecificConfig信息发送到解码端
由于AudioSpecificConfig 信息一般是不变的
所以只需发送一次即可
而通过其他方式把AudioSpecificConfig信息发送到解码端
由于AudioSpecificConfig 信息一般是不变的
所以只需发送一次即可
CMMB中音频压缩标准为AAC时,默认采用LATM封装
适用于RTP传输
ADTS
Audio Data Transport Stream
ADTS头
syncword
ID 总是设置为1
layer Indicates which layer is used. Set to ‘00’
protection_absent 表示是否误码校验
profile 表示使用哪个级别的AAC,如01 Low Complexity(LC)--- AACLC
sampling_frequency_index 表示使用的采样率下标
sampling_frequency_index sampling frequeny [Hz]
channel_configuration 表示声道数
frame_length 一个ADTS帧的长度包括ADTS头和raw data block.
adts_buffer_fullness 0x7FF 说明是码率可变的码流
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个采样及相关数据
adts_fixed_header();
adts_fixed_header()
{
syncword: 12 bslbf
ID: 1 bslbf
layer: 2 uimsbf
protection_absent: 1 bslbf
profile: 2 uimsbf
sampling_frequency_index: 4 uimsbf
private_bit: 1 bslbf
channel_configuration: 3 uimsbf
original/copy: 1 bslbf
home: 1 bslbf
}
adts_variable_header();
adts_variable_header()
{
copyright_identification_bit: 1 bslbf
copyright_identification_start: 1 bslbf
frame_length: 13 bslbf
adts_buffer_fullness: 11 bslbf
number_of_raw_data_blocks_in_frame: 2 uimsfb
}
ADTS帧
原始帧加上ADTS头进行ADTS 的封装
默认状况下,编码参数如下:双声道,采样率24KHZ,帧长变长,码流可变码率的码流,
一般采用的AAC profile为AAC-LC。
一般采用的AAC profile为AAC-LC。
MPEG-2 TS中多以ADTS格式封装AAC
开源解码库
FAAD2
an open source MPEG-4 and MPEG-2 AAC decoder
NeAACDecHandle NEAACAPI NeAACDecOpen(void);
创建解码环境并返回一个句柄
void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder);
关闭解码环境
NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder);
获取当前解码器库的配置
unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config);
为解码器库设置一个配置结构
long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels);
初始化解码器库
void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size);
解码AAC数据
MP3
PCM
Pulse Code Modulation也被称为 脉码编码调制
基本组织单位是BYTE(8bit)或WORD(16bit)
一般情况下,一帧PCM是由2048次采样组成的
最常见的PCM格式
WAV、APE、FLAC
最常说的“无损音频”来说,一般都是指传统CD格式中的16bit/44.1kHz采样率的文件格式,而知所以称为无损压缩,也是因为其包含了20Hz-22.05kHz这个完全覆盖人耳可闻范围的频响频率而得名
数据存放
对于ffmpeg来说
音频数据会保存在AVFrame中extended_data数组中,如果是打包模式(packed),就只用extended_data[0],
如果是planar模式,则每个channel分别保存在extended_data[i]中。
对于音频,只有linesize[0]有效,打包模式保存整个音频帧的buff大小,planar模式保存每个channel的buff大小
如果是planar模式,则每个channel分别保存在extended_data[i]中。
对于音频,只有linesize[0]有效,打包模式保存整个音频帧的buff大小,planar模式保存每个channel的buff大小
short *sample_buffer_L = pFrame->extended_data[0];//存放着左声道的数据
short *sample_buffer_R = pFrame->extended_data[1];//存放着右声道的数据
两者都是16bit,而裸的PCM文件里的数据是按照 LRLRLRLR 这样存储的,所以我们需要按照这种格式存储16bit的数据:
//Left channel
data[i] = (char)(sample_buffer_L[j] & 0xff);//左声道低8位
data[i+1] = (char)((sample_buffer_L[j]>>8) & 0xff);;//左声道高8位
//Right channel
data[i+2] = (char)(sample_buffer_R[j] & 0xff);//右声道低8位
data[i+3] = (char)((sample_buffer_R[j]>>8) & 0xff);;//右声道高8位
收藏
0 条评论
下一页