美文网首页
FAAD2解码步骤举例

FAAD2解码步骤举例

作者: 客昂康 | 来源:发表于2020-11-26 12:14 被阅读0次

    AAC有两种格式,ADIF和ADTS,以下示例仅限ADTS。

    #include <stdio.h>
    #include <stdlib.h>
    #include "faad.h"
    
    // 读取aac文件内容到buffer
    static unsigned char* getAacData(char *name, int *dataSize){
        FILE *fp = fopen(name, "rb");
        if(fp == NULL) return NULL;
        fseek(fp, 0, SEEK_END);
        int size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        unsigned char *buffer = malloc(size+16);
        fread(buffer, size, 1, fp);
        *dataSize = size;
        fclose(fp);
        return buffer;
    }
    
    int main(int argc, char* argv[]){
        if(argc < 2) return 0;
        int aacDataSize = 0;
        unsigned char *aacData = getAacData(argv[1], &aacDataSize);
        printf("aacDataSize = %d\n", aacDataSize);
        
        // 打开faad2解码器
        NeAACDecHandle faadHandle = NeAACDecOpen();
        if(faadHandle == NULL) return -1;
        
        // 解码之前需要初始化
        unsigned char channels = 0;
        unsigned long samplerate = 0;
        long ret = NeAACDecInit(faadHandle, aacData, aacDataSize, &samplerate, &channels);
        printf("ret = %ld, channels = %u, samplerate = %lu\n", ret, channels, samplerate);
        
        // 循环解码
        int aacOffset = 0;
        void *sampleData = NULL;
        NeAACDecFrameInfo frameInfo;
        while(aacOffset < aacDataSize){
            
            // faad2 解码
            sampleData = NeAACDecDecode(faadHandle, &frameInfo, aacData+aacOffset, aacDataSize-aacOffset);
            if((sampleData == NULL) || (frameInfo.error)) break;
            
            // sampleData是解码出来的sample,注意不要free(sampleData)。
            // frameInfo.bytesconsumed 是本次被解码掉的字节数
            // frameInfo.samples       是sample个数
            // frameInfo.samplerate    是频率
            // frameInfo.channels      是通道数
            printf("bytesconsumed = %lu, samples = %lu, samplerate = %lu, channels = %u\n",
                frameInfo.bytesconsumed,
                frameInfo.samples,
                frameInfo.samplerate,
                frameInfo.channels
            );
            
            aacOffset += frameInfo.bytesconsumed;
        }
        
        // 关闭解码器
        NeAACDecClose(faadHandle);
        free(aacData);
        return 0;
    }
    

    遇到过5.1声道的情况,经过探索,解码出来的5.1声道PCM内存布局应该是这样的:
    [正中声道, 左声道, 右声道, 左环绕, 右环绕, 低频增强]
    5.1声道转2声道采取以下算法效果较好:
    左 = 正中声道 + 左声道 + 左环绕 + 低频增强;
    右 = 正中声道 + 右声道 + 右环绕 + 低频增强;

    相关文章

      网友评论

          本文标题:FAAD2解码步骤举例

          本文链接:https://www.haomeiwen.com/subject/xepaiktx.html