RKMEDIA--AI/AO的使用

本文介绍了rkmedia中AI/AO模块的使用方法,包括AI/AO的初始化配置、常见音频调试工具及命令,如arecord、aplay和amixer的使用技巧,并提供了解决无声问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节了解一下rkmedia中ai/ao模块的使用。

AI/AO模块通过对Linux ALSA音频接口的封装,实现音频输入输出功能。

AI初始化:

  AI_CHN_ATTR_S ai_attr;
  ai_attr.pcAudioNode = "default";
  ai_attr.enSampleFormat = enSampleFmt;
  ai_attr.u32NbSamples = RK_SAMPLE_FMT_S16;
  ai_attr.u32SampleRate = 1024;
  ai_attr.u32Channels = 2;
  ai_attr.enAiLayout = AI_LAYOUT_NORMAL;

  ret = RK_MPI_AI_SetChnAttr(0, &ai_attr);
  ret |= RK_MPI_AI_EnableChn(0);
  if (ret) {
    printf("Enable AI[0] failed! ret=%d\n", ret);
    return -1;
  }

AO初始化:

  AO_CHN_ATTR_S ao_attr;
  ao_attr.pcAudioNode = "default";
  ao_attr.enSampleFormat = RK_SAMPLE_FMT_S16;
  ao_attr.u32NbSamples = 1024;
  ao_attr.u32SampleRate = 16000;
  ao_attr.u32Channels = 2;
  ret = RK_MPI_AO_SetChnAttr(0, &ao_attr);
  ret |= RK_MPI_AO_EnableChn(0);
  if (ret) {
    printf("ERROR: create ao[0] failed! ret=%d\n", ret);
    return -1;
  }

音频节点默认是"default",实际就是card 0 ,device 0  。如果连接了其他声卡,节点需要更改。

可能是card 1,device 0 那就让他把节点设置成 hw:1,0

音频调试工具以及常用命令

录音(arecord)

1、列出声卡和数字音频设备:arecord -l

2、录音:arecord -Dhw:0,0 -c 2 -r 16000 -f S16_LE /temp/test.wav

                arecord -Dhw:0,0 -d 10 -r 16000 -c 2 -f S16_LE -t wav test.wav

                arecord -Dhw:0,0 -c 1 -r 8000 -f S16_LE /tmp/test.wav

播放(aplay)

1、播放:aplay -t raw -c 1 -f S16_LE -r 8000 test2.pcm 

 接口配置(amixer):

amixer:
Usage: amixer <options> [command]
几个重要命令介绍:
scontrols :  显示所有的简单控件
scontents:  显示所有的简单控件的描述
sset : 控制简单控件
sget:显示简单控件的内容
controls: 显示所有的控件
cset:控制控件
cget:显示控件

如果板子录音没有声音,可能是mixer 没有设置通路。
1、amixer contents
2、amixer cset numid=2,iface=MIXER,name='Capture MIC Path' 'Main Mic'
3、amixer cget numid=2,iface=MIXER,name='Capture MIC Path'   设置完后查看下是否设置成功

如果音响没有声音
amixer -c 0 contents
amixer -c 0 cset numid=1 2

以上两种设置语法格式,都可以设置。根据自己板子的信息来配置。


[root@RV1126_RV1109:/]# amixer contents
numid=3,iface=MIXER,name='Master Playback Volume'
  ; type=INTEGER,access=rw---RW-,values=2,min=0,max=255,step=0
  : values=255,255
  | dBscale-min=-20.00dB,step=0.03dB,mute=0
numid=2,iface=MIXER,name='Capture MIC Path'
  ; type=ENUMERATED,access=rw--l---,values=1,items=4
  ; Item #0 'MIC OFF'
  ; Item #1 'Main Mic'
  ; Item #2 'Hands Free Mic'
  ; Item #3 'BT Sco Mic'
  : values=1
numid=1,iface=MIXER,name='Playback Path'
  ; type=ENUMERATED,access=rw------,values=1,items=11
  ; Item #0 'OFF'
  ; Item #1 'RCV'
  ; Item #2 'SPK'
  ; Item #3 'HP'
  ; Item #4 'HP_NO_MIC'
  ; Item #5 'BT'
  ; Item #6 'SPK_HP'
  ; Item #7 'RING_SPK'
  ; Item #8 'RING_HP'
  ; Item #9 'RING_HP_NO_MIC'
  ; Item #10 'RING_SPK_HP'
  : values=0
numid=4,iface=MIXER,name='Digital Capture Volume'
  ; type=INTEGER,access=rw---RW-,values=2,min=0,max=100,step=0
  : values=100,100
  | dBscale-min=-30.00dB,step=0.30dB,mute=0

注意:在使用rkmedia 的音频输入有问题时,首先要确保使用arecord和aplay命令可以获取、播放声音。如果这个都无法保证,需要确认音频节点或者驱动、硬件等是否正确。

多路音频输入输出

具体可以参考rkmedia中example/multi_audio_test文件夹,需要配置asound.conf分离音频

如有其他问题,可以在评论区一起探讨。

文章汇总:RKMEDIA使用简介_未_定的博客-优快云博客

### 西门子 S7-200Smart 中 AIAO 的定义与功能 #### 定义 在西门子 S7-200Smart 控制系统中,AI 表示 **模拟量输入 (Analog Input)**,而 AO 则表示 **模拟量输出 (Analog Output)**。这些模块用于处理连续变化的物理信号,例如电压、电流或温度等。 - **AI(Analog Input)**: 这些模块负责将外部传感器采集到的模拟信号转换为数字信号并传递给 PLC 处理[^1]。常见的应用包括测量压力、流量、液位以及温度等参数。 - **AO(Analog Output)**: 此模块的作用是将来自 PLC 的数字信号转化为标准的模拟信号输出至执行机构,比如调节阀或者变频器中的速度控制器[^2]。 #### 功能描述 ##### 模拟量输入(AI)的功能特点: - 支持多种类型的模拟信号接入,如 0~10V DC, ±10V DC 或者 4~20mA 等; - 提供高精度的数据采样能力,能够满足工业现场对于实时性和准确性要求较高的场合需求; - 配合特定算法可实现复杂过程变量监测与分析,例如 PID 控制回路计算等功能[^3]; ##### 模拟量输出(AO)的主要用途: - 向外部设备发送精确调整后的指令值,典型例子有驱动电机转速设定点传输给 VFD 变频调速单元; - 实现闭环控制系统里反馈环节所需动作命令下达工作流程自动化管理目标达成效果更佳; - 结合 HMI 显示界面操作员可以直接观察当前运行状态同时也能方便快捷地修改相应参数设置从而提高工作效率减少人工干预次数提升整体生产效益水平[^4]。 ```python # 示例代码展示如何通过 Python 访问 S7-200Smart 的 AI/AO 数据 from snap7.client import Client def read_analog_input(client: Client, db_number=1, offset=0): data = client.db_read(db_number, offset, size=2) value = int.from_bytes(data, byteorder='big', signed=False) return value / 100.0 # Assuming the scaling factor is known and set to 100. def write_analog_output(client: Client, db_number=1, offset=0, value=5.0): scaled_value = round(value * 100) # Scale according to your application needs. bytes_to_write = scaled_value.to_bytes(length=2, byteorder='big', signed=False) client.db_write(db_number, offset, bytes_to_write) if __name__ == "__main__": c = Client() c.connect('192.168.0.1', rack=0, slot=1) ai_reading = read_analog_input(c) print(f"Read Analog Input Value: {ai_reading} V") write_analog_output(c, value=6.5) print("Wrote Analog Output Value.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值