2450
- 收藏
- 点赞
- 分享
- 举报
请教为什么这段录音代码会出现内存泄漏?
[code]#include
#include
#include
#include
#include
#include
#include
#include "hi_type.h"
#include "acodec.h"
#include "mpi_sys.h"
#include "mpi_ao.h"
#include "mpi_adec.h"
#include "mpi_ai.h"
#include "mpi_aenc.h"
#include "mpi_vb.h"
#include "mpi_vi.h"
#include "mpi_vo.h"
#include "mpi_venc.h"
#include "mpi_vpss.h"
#include "mpi_vdec.h"
#define ACODEC_FILE "/dev/acodec"
#define MPP_AO_DEV_ID 0
#define MPP_AI_DEV_ID 0
void *ThreadAi(void *param)
{
if(param != NULL) {};
PAYLOAD_TYPE_E streamType = PT_LPCM;
AUDIO_SOUND_MODE_E streamMode = AUDIO_SOUND_MODE_MONO;
AUDIO_SAMPLE_RATE_E streamRate = AUDIO_SAMPLE_RATE_44100;
AUDIO_STREAM_S stream;
//输入设备号
AUDIO_DEV aiDev = MPP_AI_DEV_ID;
//输入通道号
AI_CHN aiChn = 0;
//编码通道号
AENC_CHN aencChn = 0;
//设置输入参数
AIO_ATTR_S aiAttr;
aiAttr.enSamplerate = streamRate; //采样频率
aiAttr.enBitwidth = AUDIO_BIT_WIDTH_16; //采样位宽
aiAttr.enWorkmode = AIO_MODE_I2S_MASTER; //工作模式(主Master从Slave模式)
aiAttr.enSoundmode = streamMode; //声道模式
aiAttr.u32EXFlag = 0; //位宽扩展标识(8bit->16bit时用到)
aiAttr.u32FrmNum = 30; //缓存帧数(2~MAX_AUDIO_FRAME_NUM)
aiAttr.u32PtNumPerFrm = 320; //每帧的采样数(80/160/240/320/480/1024/2048,ADPCM IMA应+1,AMR只支持160)
aiAttr.u32ChnCnt = 1; //通道数(1/2/4/8)
aiAttr.u32ClkSel = 0; //时钟选择(0表示输入输出的时钟分开,1表示输入使用输出的时钟)
HI_MPI_AI_SetPubAttr(aiDev, &aiAttr);
//打开输入设备
HI_MPI_AI_Enable(aiDev);
//打开输入通道
HI_MPI_AI_EnableChn(aiDev, aiChn);
//打开编码通道
AENC_ATTR_LPCM_S aencAttrLpcm;
AENC_CHN_ATTR_S aencChnAttr;
aencChnAttr.enType = streamType; //编码类型
aencChnAttr.u32BufSize = 30; //缓冲区大小(2~MAX_AUDIO_FRAME_NUM)
aencChnAttr.u32PtNumPerFrm = aiAttr.u32PtNumPerFrm; //每帧的采样数
aencChnAttr.pValue = &aencAttrLpcm;
HI_MPI_AENC_CreateChn(aencChn, &aencChnAttr);
//绑定输入通道和编码通道
MPP_CHN_S mppSrcChn, mppDstChn;
mppSrcChn.enModId = HI_ID_AI;
mppSrcChn.s32DevId = aiDev;
mppSrcChn.s32ChnId = aiChn;
mppDstChn.enModId = HI_ID_AENC;
mppDstChn.s32DevId = 0;
mppDstChn.s32ChnId = aencChn;
HI_MPI_SYS_Bind(&mppSrcChn, &mppDstChn);
//保存录音数据
FILE *fp = fopen("./record.wav", "w+");
while(1)
{
HI_MPI_AENC_GetStream(aencChn, &stream, -1);
fwrite(stream.pStream, 1, stream.u32Len, fp);
fflush(fp);
if(HI_SUCCESS != HI_MPI_AENC_ReleaseStream(aencChn, &stream))
{
printf("Failed to release.\n");
}
}
fclose(fp);
//解绑编码通道和输入通道
HI_MPI_SYS_UnBind(&mppSrcChn, &mppDstChn);
//关闭输入通道
HI_MPI_AI_DisableChn(aiDev, aiChn);
//关闭输入设备
HI_MPI_AI_Disable(aiDev);
//关闭编码通道
HI_MPI_AENC_DestroyChn(aencChn);
printf("AI Stop!\n");
return NULL;
}
int main(void)
{
printf("Hello World!\n");
//初始化MPP系统
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
VB_CONF_S vbConf;
memset(&vbConf, 0, sizeof(VB_CONF_S));
HI_MPI_VB_SetConf(&vbConf);
HI_MPI_VB_Init();
MPP_SYS_CONF_S mppSysConf;
mppSysConf.u32AlignWidth = 64;
HI_MPI_SYS_SetConf(&mppSysConf);
HI_MPI_SYS_Init();
//初始化AudioCodec
HI_S32 fdAcodec = open(ACODEC_FILE, O_RDWR);
ioctl(fdAcodec, ACODEC_SOFT_RESET_CTRL);
u_int32_t i2sFs = 0x1a;
ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &i2sFs);
ACODEC_MIXER_E inputMode = ACODEC_MIXER_IN;
ioctl(fdAcodec, ACODEC_SET_MIXER_MIC, &inputMode);
close(fdAcodec);
//执行线程
//pthread_t thdAo;
pthread_t thdAi;
//pthread_create(&thdAo, 0, ThreadAo, NULL);
pthread_create(&thdAi, 0, ThreadAi, NULL);
//pthread_join(thdAo, NULL);
pthread_join(thdAi, NULL);
//关闭MPP系统
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
return 0;
}
[/code]
问题应该是出在fwrite(stream.pStream, 1, stream.u32Len, fp)这句代码上,没了这句代码,使用top指令监视内存时就不会发现内存泄漏,但我不明白fwrite()为什么会导致内存泄漏,望大伙指点指点。
#include
#include
#include
#include
#include
#include
#include "hi_type.h"
#include "acodec.h"
#include "mpi_sys.h"
#include "mpi_ao.h"
#include "mpi_adec.h"
#include "mpi_ai.h"
#include "mpi_aenc.h"
#include "mpi_vb.h"
#include "mpi_vi.h"
#include "mpi_vo.h"
#include "mpi_venc.h"
#include "mpi_vpss.h"
#include "mpi_vdec.h"
#define ACODEC_FILE "/dev/acodec"
#define MPP_AO_DEV_ID 0
#define MPP_AI_DEV_ID 0
void *ThreadAi(void *param)
{
if(param != NULL) {};
PAYLOAD_TYPE_E streamType = PT_LPCM;
AUDIO_SOUND_MODE_E streamMode = AUDIO_SOUND_MODE_MONO;
AUDIO_SAMPLE_RATE_E streamRate = AUDIO_SAMPLE_RATE_44100;
AUDIO_STREAM_S stream;
//输入设备号
AUDIO_DEV aiDev = MPP_AI_DEV_ID;
//输入通道号
AI_CHN aiChn = 0;
//编码通道号
AENC_CHN aencChn = 0;
//设置输入参数
AIO_ATTR_S aiAttr;
aiAttr.enSamplerate = streamRate; //采样频率
aiAttr.enBitwidth = AUDIO_BIT_WIDTH_16; //采样位宽
aiAttr.enWorkmode = AIO_MODE_I2S_MASTER; //工作模式(主Master从Slave模式)
aiAttr.enSoundmode = streamMode; //声道模式
aiAttr.u32EXFlag = 0; //位宽扩展标识(8bit->16bit时用到)
aiAttr.u32FrmNum = 30; //缓存帧数(2~MAX_AUDIO_FRAME_NUM)
aiAttr.u32PtNumPerFrm = 320; //每帧的采样数(80/160/240/320/480/1024/2048,ADPCM IMA应+1,AMR只支持160)
aiAttr.u32ChnCnt = 1; //通道数(1/2/4/8)
aiAttr.u32ClkSel = 0; //时钟选择(0表示输入输出的时钟分开,1表示输入使用输出的时钟)
HI_MPI_AI_SetPubAttr(aiDev, &aiAttr);
//打开输入设备
HI_MPI_AI_Enable(aiDev);
//打开输入通道
HI_MPI_AI_EnableChn(aiDev, aiChn);
//打开编码通道
AENC_ATTR_LPCM_S aencAttrLpcm;
AENC_CHN_ATTR_S aencChnAttr;
aencChnAttr.enType = streamType; //编码类型
aencChnAttr.u32BufSize = 30; //缓冲区大小(2~MAX_AUDIO_FRAME_NUM)
aencChnAttr.u32PtNumPerFrm = aiAttr.u32PtNumPerFrm; //每帧的采样数
aencChnAttr.pValue = &aencAttrLpcm;
HI_MPI_AENC_CreateChn(aencChn, &aencChnAttr);
//绑定输入通道和编码通道
MPP_CHN_S mppSrcChn, mppDstChn;
mppSrcChn.enModId = HI_ID_AI;
mppSrcChn.s32DevId = aiDev;
mppSrcChn.s32ChnId = aiChn;
mppDstChn.enModId = HI_ID_AENC;
mppDstChn.s32DevId = 0;
mppDstChn.s32ChnId = aencChn;
HI_MPI_SYS_Bind(&mppSrcChn, &mppDstChn);
//保存录音数据
FILE *fp = fopen("./record.wav", "w+");
while(1)
{
HI_MPI_AENC_GetStream(aencChn, &stream, -1);
fwrite(stream.pStream, 1, stream.u32Len, fp);
fflush(fp);
if(HI_SUCCESS != HI_MPI_AENC_ReleaseStream(aencChn, &stream))
{
printf("Failed to release.\n");
}
}
fclose(fp);
//解绑编码通道和输入通道
HI_MPI_SYS_UnBind(&mppSrcChn, &mppDstChn);
//关闭输入通道
HI_MPI_AI_DisableChn(aiDev, aiChn);
//关闭输入设备
HI_MPI_AI_Disable(aiDev);
//关闭编码通道
HI_MPI_AENC_DestroyChn(aencChn);
printf("AI Stop!\n");
return NULL;
}
int main(void)
{
printf("Hello World!\n");
//初始化MPP系统
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
VB_CONF_S vbConf;
memset(&vbConf, 0, sizeof(VB_CONF_S));
HI_MPI_VB_SetConf(&vbConf);
HI_MPI_VB_Init();
MPP_SYS_CONF_S mppSysConf;
mppSysConf.u32AlignWidth = 64;
HI_MPI_SYS_SetConf(&mppSysConf);
HI_MPI_SYS_Init();
//初始化AudioCodec
HI_S32 fdAcodec = open(ACODEC_FILE, O_RDWR);
ioctl(fdAcodec, ACODEC_SOFT_RESET_CTRL);
u_int32_t i2sFs = 0x1a;
ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &i2sFs);
ACODEC_MIXER_E inputMode = ACODEC_MIXER_IN;
ioctl(fdAcodec, ACODEC_SET_MIXER_MIC, &inputMode);
close(fdAcodec);
//执行线程
//pthread_t thdAo;
pthread_t thdAi;
//pthread_create(&thdAo, 0, ThreadAo, NULL);
pthread_create(&thdAi, 0, ThreadAi, NULL);
//pthread_join(thdAo, NULL);
pthread_join(thdAi, NULL);
//关闭MPP系统
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
return 0;
}
[/code]
问题应该是出在fwrite(stream.pStream, 1, stream.u32Len, fp)这句代码上,没了这句代码,使用top指令监视内存时就不会发现内存泄漏,但我不明白fwrite()为什么会导致内存泄漏,望大伙指点指点。
我来回答
回答2个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2017-04-25 09:49:39
-
2018-08-08 17:03:11
-
2018-12-19 09:03:57
-
2020-03-04 14:36:53
-
2012-12-02 22:50:44
-
2018-10-16 13:51:57
-
2016-12-30 16:38:00
-
2017-08-12 19:03:33
-
2019-01-12 11:01:48
-
2018-12-10 16:57:20
-
2018-12-29 14:43:36
-
2018-11-13 09:25:52
-
2021-02-01 17:34:38
-
2021-03-01 09:41:46
-
2020-03-02 18:55:57
-
2018-10-24 15:42:32
-
2020-11-16 14:49:40
-
2016-08-12 09:02:28
-
2024-02-06 11:43:37
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
50帮忙解决个交叉编译的问题
-
20帮忙交叉编译个源码
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认