文章目录
- AAC 组成
- 函数分析
- 读aac帧
- 写aac帧
- aac的head参数设置
- 运行结果
AAC 组成
AAC音频格式:是⼀种由MPEG-4标准定义的有损⾳频压缩格式
ADTS:是AAC音频的传输流格式
AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成
每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息等,⼀般情况下ADTS的头信息都是7个字节,分为2部分:
adts_fixed_header(); // 固定头信息
adts_variable_header(); // 可变头信息
adts_fixed_header():
syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
Layer:always: ‘00’ 总是一字节的0
protection_absent:表示是否误码校验。
profile:表示使⽤哪个级别的AAC
adts_variable_header():
frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流
size(head) + size(AACFrame)
adts_buffer_fullness:0x7FF 说明是码率可变的码流
说number_of_raw_data_blocks_in_frame : 值为 0, 表示说ADTS帧中有⼀个AAC数据块
函数分析
读aac帧
函数: int av_read_frame(AVFormatContext *s, AVPacket *pkt);
先定义AVPacket pkt对象,初始化,在while循环中读取数据帧
AVPacket pkt;
// 初始化packet
av_init_packet(&pkt);
while (av_read_frame(ifmt_ctx, &pkt) >=0 ) {
//...
}
写aac帧
c标准库fopen创建文件aac文件,通过fwrite写文件,因为av_read_frame读取内容不包含head,所以需要先写adts head,再写adts data ,为完整一帧aac数据。
FILE *aac_fd = NULL;
aac_fd = fopen(aac_filename, "wb");
while(av_read_frame(ifmt_ctx, &pkt) >=0) {
char adts_header_buf[7] = {0};
fwrite(adts_header_buf, 1, 7, aac_fd);
fwrite( pkt.data, 1, pkt.size, aac_fd);
// ...
}
aac的head参数设置
根据ADTS的head表设置变量值,如设置syncword变量值
如,syncword 值为 0xFFF, 需要2个字节的空间, 一个指针为4个字节,字节排序为大端序(数据的地位字节放到内存的高位地址)
char * const p_adts_header;
// syncword :同步头 总是0xFFF
p_adts_header[0] = 0xff;
//syncword:0xfff 高8bits
p_adts_header[1] = 0xf0;
//syncword:0xfff 低4bits
运行结果
输出aac音频文件