解码流程

  • 解码aac数据,的数据来源主要有两个:
    • aac文件
    • 网络流
  • 当是aac文件时,可用av_read_frame读取packet数据,进行解码,解码流程为:
    • 创建解码器
    • 设置文件流
    • 读取aac数据(包含aac头),解码
  • 当是aac文件或者网络流时,解码流程为:

    • 读取aac的头部,从头部解析aac_frame的长度aac_frame_len
    • 通过aac_frame_len获取aac_frame数据
    • 解码aac的流

      需要注意的点

  • 从aac头解析aac_frame_len

    1. int get_aac_frame_len(UINT8* aac_header)
    2. {
    3. int size = 0;
    4. if (NULL == aac_header)
    5. {
    6. return -1;
    7. }
    8. size |= (aac_header[3] & 0b00000011) << 11; //0x03 前两个最高位,要移到高位(13 - 11 = 2)
    9. size |= aac_header[4] << 3; //中间的8bit,要移到前两个高位后,13 - 2 = 11 - 8 = 3
    10. size |= (aac_header[5] & 0b11100000) >> 5; //0xe0 最后的3Bit,要移到最后
    11. printf("size:%d\n", size);
    12. return size;
    13. }
  • aac解码后的pcm时fltp位深,需要转换成s16位深,这样声卡才能播放

    代码地址: https://github.com/zymerry/ffmpeg_prime.git