Loading...
首页问答详情

【已解决】FDK AAC 噪音求指导

 
justchen
justchen  发布于  2018-07-30 16:23:25
采纳率 0%
11个问答

本帖最后由 ezreal_cs 于 2018-7-30 18:44 编辑

海思采用的是 I2S输入 48K 16位立体声.相关配置如下 [code]stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000; stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE; stAioAttr.enSoundmode = AUDIO_SOUND_MODE_STEREO; stAioAttr.u32EXFlag = 0; stAioAttr.u32FrmNum = 30; stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; //320 stAioAttr.u32ClkChnCnt = 2;
stAioAttr.u32ChnCnt = 2; stAioAttr.u32ClkSel = 0;[/code]

获取音频数据并保存为文件的代码如下: [code]for(i=0; i<stFrame.u32Len; i+=2) { fwrite(stFrame.pVirAddr[0]+i, 1 ,2 , fileFD);
fwrite(stFrame.pVirAddr[1]+i, 1 ,2 , fileFD);
}[/code]

此时获取到的PCM文件在PC上播放正常,左右声道都很正确,, (附件中的 xxx.pcm 文件).

然后将获取到的音频数据 进行FDK AAC编码后在声音稍大些的时候会有爆音. 无论是海思芯片上还是PC上都试过,效果一样.

FDK AAC相关代码 照搬https://github.com/mstorsjo/fdk-aac/blob/master/aac-enc.c修改而来. [code]while (1) { AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 }; AACENC_InArgs in_args = { 0 }; AACENC_OutArgs out_args = { 0 }; int in_identifier = IN_AUDIO_DATA; int in_size, in_elem_size; int out_identifier = OUT_BITSTREAM_DATA; int out_size, out_elem_size; int read, i; void in_ptr, out_ptr; uint8_t outbuf[20480]; AACENC_ERROR err;

    //read = wav_read_data(wav, input_buf, input_size);
    read = fread( input_buf, 1, 640, inFd );

    if( read <= 0 )
    {
        printf("xxxxx文件读完了!!!\n");
        exit(-1);
    }

    for (i = 0; i < read/2; i++) {
        const uint8_t* in = &input_buf[2*i];
        convert_buf[i] = in[0] | (in[1] << 8);
    }
    if (read <= 0) {
        in_args.numInSamples = -1;
    } else {
        in_ptr = convert_buf;
        in_size = read;
        in_elem_size = 2;

        in_args.numInSamples = read/2;
        in_buf.numBufs = 1;
        in_buf.bufs = &in_ptr;
        in_buf.bufferIdentifiers = &in_identifier;
        in_buf.bufSizes = &in_size;
        in_buf.bufElSizes = &in_elem_size;
    }
    out_ptr = outbuf;
    out_size = sizeof(outbuf);
    out_elem_size = 1;
    out_buf.numBufs = 1;
    out_buf.bufs = &out_ptr;
    out_buf.bufferIdentifiers = &out_identifier;
    out_buf.bufSizes = &out_size;
    out_buf.bufElSizes = &out_elem_size;

    if ((err = aacEncEncode(_encoder, &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) {
        if (err == AACENC_ENCODE_EOF)
            break;
        fprintf(stderr, "Encoding failed\n");
        return;
    }
    if (out_args.numOutBytes == 0)
        continue;
    fwrite(outbuf, 1, out_args.numOutBytes, outFd);
}[/code]

尝试改过 fdk-aac的AACENC_BufDesc 结构配置,以即初始化的配置.. 但都不行 求大神指点下了.. 附件是我的工程代码, CMAKE写的, (fdk-aac 是用的静态库 ubuntu 16.04 64bit) 直接 [code]cmake . make[/code] 可以生成 pcmToAAC 文件, 运行会读取 xxx.pcm文件并编码生成 xxx.aac. 不知道哪位大神调过FDK AAC,望指点. [attach]7559[/attach]

文件: pcmToAAC.tar.gz
下载
我来回答
回答可得5积分
2682
1
0
回答
10个
justchen 发布于2018-07-30 17:21:37
问题已经找到...
用海思mpp里的sample配置时, stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;  //320
就是每个数据包里320个数据.
在FDK AAC中有个配置
[code]  AACENC_GRANULE_LENGTH           = 0x0105,  /*!< Core encoder (AAC) audio frame length in samples:
                                                  - 1024: Default configuration.
                                                  - 512: Default LD/ELD configuration.
                                                  - 480: Optional length in LD/ELD configuration. */[/code]

所以按每取一个音频包就给AAC编码时会出现数据匹配不上,导致破音.
解决办法也简单,改AAC编码器配置或海思采样数都可以解决
0
jipd 发布于2018-07-30 17:42:59
大神,给楼主顶起来:victory:
0
封锁记忆 发布于2018-07-31 09:12:37
大神,你这个CMakefile很好,有没有相关教程啊
0
justchen 发布于2018-07-31 09:41:29
[quote][url=forum.php?mod=redirect&goto=findpost&pid=102373&ptid=51498]封锁记忆 发表于 2018-7-31 09:12[/url]
大神,你这个CMakefile很好,有没有相关教程啊[/quote]

CMAKE 网上教程大把
0
ck2952 发布于2018-07-31 10:10:49
[quote][url=forum.php?mod=redirect&goto=findpost&pid=102356&ptid=51498]justchen 发表于 2018-7-30 17:21[/url]
问题已经找到...
用海思mpp里的sample配置时, stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;  // ...[/quote]

海思群里的那个大神网网。。。。。。
0
rfk 发布于2018-08-08 14:55:23
厉害:victory::victory::victory:
0
stoneunix 发布于2020-09-18 11:23:21

0
Shmily 发布于2021-11-10 09:18:36

大佬,能不能看下你FDK-aac set_para的设置啊,我编码后的音频一直有噪音而且还是倍速的,哭了

0
虽万人吾往矣 发布于2021-11-10 10:45:05
略略

0
点滴记忆 发布于2021-12-03 13:19:45

优秀

0

Markdown 语法

  • 加粗 **内容**
  • 斜体 *内容*
  • 删除线 ~~内容~~
  • 引用 > 引用内容
  • 代码 `代码`
  • 代码块 ```编程语言↵代码```
  • 链接 [链接标题](url)
  • 无序列表 - 内容
  • 有序列表 1. 内容
  • 缩进 内容
  • 图片 ![alt](url)

Markdown 语法

  • 加粗 **内容**
  • 斜体 *内容*
  • 删除线 ~~内容~~
  • 引用 > 引用内容
  • 代码 `代码`
  • 代码块 ```编程语言↵代码```
  • 链接 [链接标题](url)
  • 无序列表 - 内容
  • 有序列表 1. 内容
  • 缩进 内容
  • 图片 ![alt](url)
+ 添加网盘链接/附件
或将文件直接拖到这里
悬赏:
EBC
文件格式必须为doc,docx,xls,xlsx,pdf,ppt,pptx,txt,zip,rar,tar,7z,gz
网盘
* 网盘链接:
* 提取码:
悬赏:
EBC
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区