Mew

Mew

0个粉丝

3

问答

0

专栏

0

资料

Mew  发布于  2018-06-15 20:53:22
采纳率 0%
3个问答
2436

请教为什么这段录音代码会出现内存泄漏?

 
[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()为什么会导致内存泄漏,望大伙指点指点。
我来回答
回答2个
时间排序
认可量排序

ezreal_cs

1个粉丝

2

问答

7

专栏

1

资料

ezreal_cs 2018-06-16 21:38:31
认可0
建议判断下 fflush 的返回值

henman

0个粉丝

7

问答

0

专栏

0

资料

henman 2018-06-19 11:00:11
认可0
我觉得不是内存泄漏,而是文件缓存在增大。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区