目录

1.音频AI模块

2.AI模块结构体的重要参数

3.设置AI模块的API

3.1. RK_MPI_AI_SetChnAttr

3.2. RK_MPI_AI_EnableChn

3.3. RK_MPI_AI_StartStream

4.代码

ffplay播放pcm数据需要的命令:


1.音频AI模块

RV1126的AI模块指的是音频输入模块,它的作用是通过内置芯片读取麦克风等音频的模拟信号,然后把音频模拟信号转换成数字信号。在RV1126里面,音频AI模块是所有音频输入的入口。下面是AI模块和麦克风等音频输入模块的关系

2.AI模块结构体的重要参数

下面是AI_CHN_ATTR_S结构体的成员变量

2.1.pcAudioNode:AUDIO音频节点,默认是default

2.2. enSampleFormat采样格式,下面是RV1126的提供的采样格式,下面好多种采样格式,我们来分别讲解一下:

2.2.1.RK_SAMPLE_FMT_U8:无符号整型8位采样格式,它是8BIT采样格式的一种,这里的Uunsigned的缩写

2.2.2.RK_SAMPLE_FMT_S16:整型16位采样格式,它是16IT采样格式,Ssigned的缩写

2.2.3.RK_SAMPLE_FMT_S32:整型32位采样格式,它是32IT采样格式,Ssigned的缩写

2.2.4.RK_SAMPLE_FMT_FLT:利用float格式去采样,它是用浮点型格式进行采样。取值范围是[-1.0, 1.0]

2.2.5.RK_SAMPLE_FMT_U8P:无符号整型8位采样平面格式,这里的P表示的是平面格式,平面格式指的是非交错模式,如:LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL

2.2.6.RK_SAMPLE_FMT_S16P:整型16位采样平面格式,这里的P表示的是平面格式,平面格式指的是非交错模式,如:LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL

2.2.7.RK_SAMPLE_FMT_S32P:整型32位采样平面格式,这里的P表示的是平面格式,平面格式指的是非交错模式,如:LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRLR

2.2.8.RK_SAMPLE_FMT_FLTP:浮点型采样平面格式,这里的P表示的是平面格式,平面格式指的是非交错模式,如:LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL

2.2.9.RK_SAMPLE_FMT_G711A:G711A是标准的ITU-T推荐的标准之一采用8位精度进行采样,它主要运用在电话领域。A表示的是将一个13bitPCM样本压缩成8bit样本

RK_SAMPLE_FMT_G711U:G711U是标准的ITU-T推荐的标准之一采用8位精度进行采样,它主要运用在电话领域。U表示的是将一个14bitPCM样本压缩成8bit样本。

2.3. u32Channels音频通道数,音频默认通道数是2

2.4. u32SampleRate音频采样率,在RV1126里面常用的采样率是160004410048000三种。目前在这个开发中,我们用的是48000,因为48000采样率的音频效果最好。

2.5. u32NbSample每一帧的采样个数,这个参数要和对应的音频编码格式来设置。AAC音频编码格式对应的采样个数是1024MP3音频编码格式对应的采样个数是1152

2.6. enAiLayout音频输入布局类型,它提供了三个成员变量选择:AI_LAYOUT_NORMALAI_LAYOUT_MIC_REF、AI_LAYOUT_REF_MIC。它默认是用的是AI_LAYOUT_NORMAL类型,默认是AI_LAYOUT_NORMAL。

3.设置AI模块的API

3.1. RK_MPI_AI_SetChnAttr

RK_MPI_AI_SetChnAttr功能主要是设置AI通道属性

第一个参数:AI模块的通道号ID,取值范围是[0, AI_MAX_CHN_NUM]

第二个参数:AI_CHN_ATTR_S结构体指针

3.2. RK_MPI_AI_EnableChn

RK_MPI_AI_EnableChn功能主要是打开AI通道

第一个参数:AI模块的通道号ID,这里填的值和设置的通道号一致

3.3. RK_MPI_AI_StartStream

RK_MPI_AI_StartStream功能主要是启动AI音频流

第一个参数:AI模块的通道号ID,这里填的值和设置的通道号一致

4.代码

通过RKMEDIA的API获取音频的输入的PCM数据并且保存起来。

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#include "rkmedia_api.h"
#define AUDIO_PATH "default"
#define AI_CHN 0

void* get_ai_pcm_thread(void * args)
{
    pthread_detach(pthread_self());
    FILE *pcm_file = fopen("test_ai.pcm","w+");
    MEDIA_BUFFER mb;
    
    while (1)
    {
        mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AI,AI_CHN,-1);
        if(!mb)
        {
            printf("RK_MPI_SYS_GetMediaBuffer Failed\n");
            break;
        }
        
        printf("RK_MPI_SYS_GetMediaBuffer Success\n");
        fwrite(RK_MPI_MB_GetPtr(mb),RK_MPI_MB_GetSize(mb),1,pcm_file);

        RK_MPI_MB_ReleaseBuffer(mb);
        
    }
    
return NULL;
}

int main(int argc, char *argv[])
{
    int ret ;

    AI_CHN_ATTR_S ai_chn_attr;

    ai_chn_attr.pcAudioNode = AUDIO_PATH;
    ai_chn_attr.u32Channels = 2;
    ai_chn_attr.u32NbSamples = 1024;
    ai_chn_attr.u32SampleRate = 48000;
    ai_chn_attr.enAiLayout = AI_LAYOUT_NORMAL;
    ai_chn_attr.enSampleFormat =   RK_SAMPLE_FMT_S16;

    ret = RK_MPI_AI_SetChnAttr(AI_CHN,&ai_chn_attr);
    if(ret )
    {
        printf("RK_MPI_AI_SetChnAttr Failed\n");
        return 0;
    }
    else
    {
        printf("RK_MPI_AI_SetChnAttr Success\n");
    }

    ret = RK_MPI_AI_EnableChn(AI_CHN);
    if(ret )
    {
        printf("RK_MPI_AI_EnableChn Failed\n");
        return 0;
    }
    else
    {
        printf("RK_MPI_AI_EnableChn Success\n");
    }

    ret = RK_MPI_AI_StartStream(AI_CHN);
    if(ret )
    {
        printf("RK_MPI_AI_StartStream Failed\n");
        return 0;
    }
    else
    {
        printf("RK_MPI_AI_StartStream Success\n");
    }

    pthread_t pcm_pid;

    pthread_create(&pcm_pid,NULL,get_ai_pcm_thread,NULL);

    while (1)
    {
        sleep(2);
    }

    RK_MPI_AI_DisableChn(AI_CHN);
    

    return 0;
}

ffplay播放pcm数据需要的命令:

ffplay -ar 采样率 -channels 通道数 -f 采样格式(s16le) -i pcm文件

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐