justchen

justchen

1个粉丝

11

问答

0

专栏

1

资料

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

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

 

本帖最后由 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
下载
我来回答
回答10个
时间排序
认可量排序

justchen

1个粉丝

11

问答

0

专栏

1

资料

justchen 2018-07-30 17:21:37
认可0
问题已经找到...
用海思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编码器配置或海思采样数都可以解决

jipd

0个粉丝

14

问答

0

专栏

0

资料

jipd 2018-07-30 17:42:59
认可0
大神,给楼主顶起来:victory:

封锁记忆

0个粉丝

39

问答

0

专栏

1

资料

封锁记忆 2018-07-31 09:12:37
认可0
大神,你这个CMakefile很好,有没有相关教程啊

justchen

1个粉丝

11

问答

0

专栏

1

资料

justchen 2018-07-31 09:41:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=102373&ptid=51498]封锁记忆 发表于 2018-7-31 09:12[/url]
大神,你这个CMakefile很好,有没有相关教程啊[/quote]

CMAKE 网上教程大把

ck2952

0个粉丝

14

问答

0

专栏

0

资料

ck2952 2018-07-31 10:10:49
认可0
[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]

海思群里的那个大神网网。。。。。。

rfk

0个粉丝

7

问答

0

专栏

0

资料

rfk 2018-08-08 14:55:23
认可0
厉害:victory::victory::victory:

stoneunix

0个粉丝

0

问答

0

专栏

0

资料

stoneunix 2020-09-18 11:23:21
认可0

Shmily

0个粉丝

0

问答

0

专栏

0

资料

Shmily 2021-11-10 09:18:36
认可0

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

虽万人吾往矣

3个粉丝

17

问答

42

专栏

86

资料

虽万人吾往矣 2021-11-10 10:45:05
认可0

点滴记忆

0个粉丝

0

问答

0

专栏

0

资料

点滴记忆 2021-12-03 13:19:45
认可0

优秀

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区