- 收藏
- 点赞
- 分享
- 举报
【已解决】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]
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
-
2021-03-17 16:46:55
-
2019-01-11 09:48:22
-
2018-07-24 16:14:31
-
2018-11-21 15:36:29
-
2016-06-14 08:38:27
-
12019-11-15 15:37:24
-
2013-06-07 10:59:06
-
2019-01-22 10:06:52
-
2015-08-09 16:31:17
-
2015-10-22 16:19:12
-
2016-12-07 10:35:25
-
2018-10-24 15:11:12
-
2018-12-28 16:38:16
-
2017-08-29 11:08:47
-
2018-12-11 16:16:56
-
2016-07-31 17:25:20
-
2016-04-24 00:33:08
-
22018-12-27 18:56:09
-
2018-03-01 14:37:56
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
-
10求HI3519DV500_SDK_V2.0.1.1
-
5有偿求HI3516DV500 + OV5647驱动
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明