初学音视频(四)-AAC音频码流分析

本文介绍了AAC音频码流分析的基础知识,包括ADTS(Audio Data Transport Stream)传输格式,同步字0xFFF的使用,以及如何从码流中分离和解析ADTS帧。通过分析ADTS帧头部,可以获取采样率、声道数等关键信息。同时,文章指出在实际操作中,AAC码流可能来源于已封装好的ADTS帧,如FLV中的原始码流,这在理解过程中可能带来一些混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AAC音频码流分析

基础知识

  • ADTS:Audio Data Transport Stream是AAC的一种十分常见的传输格式。
  • AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。
  • ES流(Elementary Stream): 基本码流,编码器出来的流。他们的结构如下图所示。

  • 其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。

  • AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
  • 这个同步字其实是在头信息里面,这个头信息:ADTS 头中相对有用的信息 采样率、声道数、帧长度,等于是一个类一样,告诉你这个码流里面的相对信息是什么。

  • 以下代码是实现的部分: 分析码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。

    代码的开端:simplest_aac_parser("/home/huangyu/HYtest/aac/nocturne.aac");  



        //函数:获取到一个ADTSframe的数据 :
        //其中参数为input_data = aacbuffer: 这个参数是读取了1024*1024-offset(ifile文件中的数据长度)的流--------- buffer
        //data_size读取1byte有效的数据的次数-----------------------------------------------------------------  buf_size
        //aacframe是一个堆中的5KB的数据空间------------------------------------------------------------------  data
        //size的地址值--------------------------------------------------------------------------------------定义一个长度
        //这里传递过来的都是地址值 除了buf_siez.修改后外面的值都会改变

        //9.1 进入到这个方法里面
    int getADTSframe(unsigned char* buffer, int buf_size, unsigned char* data ,int* data_size){  
    int size = 0;  

        //9.2 等于是一个判空的操作
    if(!buffer || !data || !data_size ){  
        return -1;  
    }  

    while(1){  
        //9.3 这里为什么要判断buf_size<7,因为一个ADTSframe的头信息 一般是7个Byte,如果7个都没有 说明信息是错误的,可以看上面的图
        if(buf_size  < 7 ){  
            return -1;  
        }  
        //Sync words  
        //9.4 这里buffer是读取了ifile流数据的
        if((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0) ){  

            //9.4.1 进入到这里 说明前4个Byte 是 0xfffff0              & 运算 相同为1,不同为假。 
            // << :表达式14 << 2的值为56,因为14(即
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值