From accbd80b04664e7c84a98ff323e206920e3ce2be Mon Sep 17 00:00:00 2001
From: "carlos.meng" <7754760+meng_zhengwei@user.noreply.gitee.com>
Date: Thu, 27 Mar 2025 11:17:46 +0800
Subject: [PATCH] =?UTF-8?q?docs>(audio):=20=E6=96=B0=E5=A2=9EPCM,G711,G722?=
=?UTF-8?q?,G729=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增PCM,G711,G722,G729接口文档
固件版本: N/A
是否需要文案翻译: 否
---
zh/medialib/audio.PCM.md | 438 +++++++++++++++++++++++++++++++++++++++
1 file changed, 438 insertions(+)
create mode 100644 zh/medialib/audio.PCM.md
diff --git a/zh/medialib/audio.PCM.md b/zh/medialib/audio.PCM.md
new file mode 100644
index 0000000..34943bd
--- /dev/null
+++ b/zh/medialib/audio.PCM.md
@@ -0,0 +1,438 @@
+# class PCM - PCM音频数据
+
+该类提供PCM音频数据的读写接口,PCM数据可用于音频编码。
+
+> 所有支持audio的型号均支持PCM。
+
+## 创建对象
+
+### `audio.Audio.PCM`
+
+```python
+class audio.Audio.PCM(mic_dev, channel, samplerate, flag,mode, periodcnt)
+```
+
+创建Audio对象。
+
+**参数描述:**
+
+
+* 参数说明详见下表
+
+| 参数 | 参数类型 | 参数说明 |
+| ------------ | -------- | ------------------------------------------------------------ |
+| `mic_dev` | int | mic通道:
`0` - 听筒
`1` - 耳机
`2` - 自动 |
+| `channel` | int | 通道数:
`1`:单声道( PCM.MONO)
`2`:立体音(PCM.STEREO) |
+| `samplerate` | int | 采样率:
8000, 16000 |
+| `flag` | int | 模式:
`0`:只读(PCM.READONLY)
`1`:只写(PCM.WRITEONLY)
`2`:读写(PCM.WRITEREAD) |
+| `mode` | int | 阻塞(缺省值为1):
`1`:阻塞式(PCM.BLOCK)
`2`:非阻塞式(PCM.NOBLOCK) |
+| `periodcnt` | int | 缓存buf大小,取值范围:`[2,25]`
单位为帧。 一帧20ms,缺省值为3(即默认最多储存3帧数据) |
+
+**示例:**
+
+```python
+from audio import Audio
+pcm = Audio.PCM(1, Audio.PCM.MONO, 8000, Audio.PCM.WRITEREAD, Audio.PCM.BLOCK)
+```
+
+## 方法
+
+### `PCM.read`
+
+```python
+PCM.read(size)
+```
+
+该方法用于读取模组MIC录音的PCM数据。
+
+**参数描述:**
+
+- `size` - 最大读取数据量,int类型,单位字节。(单次读取的数据量不超过设置的缓存buf大小)
+
+> 注:录音时间可根据采样率,通道数,采样精度计算,具体计算公式为:
+>
+> 时间(s)=想要获取的数据量(byte) / (采样率(hz) * 通道数(channel) * 采样精度(byte/sample) )
+>
+> 例如:设置采样率8000,单声道,想读取数据size=320。模组PCM采样精度为2,所以该接口录音时间为0.02s
+
+**返回值描述:**
+
+成功返回数据buffer;
+
+失败则返回`-1`。
+
+### `PCM.write`
+
+```python
+PCM.write(buff)
+```
+
+该方法用于写入将要进行播放的PCM数据。
+
+**参数描述:**
+
+- `buff` - 需要写入的PCM数据,bytearray类型。
+
+**返回值描述:**
+
+成功返回写入的数据量;
+
+失败则返回`-1`。
+
+**示例:**
+
+```python
+from audio import Audio
+pcm = Audio.PCM(1, Audio.PCM.MONO, 8000, Audio.PCM.WRITEREAD, Audio.PCM.BLOCK)
+
+pcm_buf = pcm.read(320)
+pcm.write(pcm_buf)
+```
+
+### `PCM.close`
+
+```python
+PCM.close()
+```
+
+该方法用于关闭PCM,释放相应资源。
+
+**返回值描述:**
+
+`0` 表示成功,`-1`表示失败。
+
+### `PCM.setVolume`
+
+```python
+PCM.setVolume(vol)
+```
+
+该方法用于设置播放音量大小,音量值在区间[0 ~ 11],0表示静音。
+
+**参数描述:**
+
+- `vol` - 音量大小,int类型,区间[0 ~ 11]。
+
+**返回值描述:**
+
+`0` 表示成功,`-1`表示失败。
+
+> 注:该方法设置的是audio播放音量,与Audio.setVolume设置音量效果相同
+
+### `PCM.setVolume`
+
+```python
+PCM.getVolume()
+```
+
+该方法用于获取当前播放音量大小,音量值在区间[0 ~ 11],0表示静音。
+
+**返回值描述:**
+
+整型音量大小值。
+
+
+
+## 音频编码-G711
+
+该模块用于G711格式的录音和音频播放。
+
+### 构造函数
+
+```python
+class G711(pcm)
+```
+
+创建G711对象。
+
+**参数描述:**
+
+- `device` - PCM对象,obj类型,见[PCM](#创建对象)。(G711默认只支持8K采样率,创建PCM对象时请注意此问题)
+
+**示例:**
+
+```python
+import G711
+import audio
+
+pcm = audio.Audio.PCM(0, 1, 8000, 2)
+g711 = G711(pcm)
+```
+
+### `G711.read`
+
+该方法用于读取G711格式录音数据,单次输出一帧录音数据(一帧录音时间为20ms,8k采样率下数据长度为160字节)。
+
+```python
+G711.read(format)
+```
+
+**参数描述:**
+
+- `format` - 编码格式,int类型,`0`:A-LAW,`1`:U-LAW。
+
+**返回值描述:**
+
+成功则返回音频buffer;
+
+失败则返回`-1`。
+
+> 注:通常PCM数据按G711格式编码后数据量只有原先的1/2,反之G711解码为PCM后数据量为原先的2倍。
+
+
+### `G711.write`
+
+该方法用于将G711音频数据解码,并播放。
+
+```python
+G711.write(buffer, format)
+```
+
+**参数描述:**
+
+- `format` - 音频数据的编码格式,int类型,`0`:A-LAW,`1`:U-LAW。
+- `buff` - 需要解码的音频数据,bytearray类型。
+
+**返回值描述:**
+
+成功返回写入的解码后的数据量;
+
+失败则返回`-1`。
+
+**示例:**
+
+```python
+import G711
+import audio
+import uos
+
+pcm = audio.Audio.PCM(0, 1, 8000, 2)
+g711 = G711(pcm)
+#g711 code
+def g711_compress(frame):
+ f = open("/usr/test.g711", "wb")
+ count = frame
+ while count:
+ count-=1
+ g711_buf = g711.read(0)
+ print("len:",len(g711_buf))
+ if(len(g711_buf) > 0):
+ f.write(g711_buf)
+ f.close()
+#g711 decode
+def g711_decompression():
+ file_size = uos.stat("/usr/test.g711")[6] # get file size
+ print(file_size)
+ with open("/usr/test.g711", "rb")as f:
+ while 1:
+ b = f.read(320)
+ if not b:
+ break
+ write_len = g711.write(b, 0)
+ f.close()
+
+if __name__ == "__main__":
+ g711_compress(200)
+ g711_decompression()
+```
+
+
+
+## 音频编码-G722
+
+该模块用于G722格式的录音和音频播放。
+
+### 构造函数
+
+```python
+class G722(pcm, bitrate)
+```
+
+创建G722对象。
+
+**参数描述:**
+
+- `device` - PCM对象,obj类型,见[PCM](#创建对象)。(G722默认支持16K采样率,创建PCM对象时请注意此问题)
+- `bitrate` - 比特率,int类型,可选值:`64000` , `56000`,`48000`。
+
+**示例:**
+
+```python
+import G722
+import audio
+
+pcm = audio.Audio.PCM(0, 1, 16000, 2)
+g722 = G722(pcm, 64000)
+```
+
+### `G722.read`
+
+该方法用于读取G722格式录音数据,单次输出一帧录音数据(一帧录音时间为20ms,16k采样率下数据长度为160字节)。
+
+```python
+G722.read()
+```
+
+**返回值描述:**
+
+成功则返回音频buffer;
+
+失败则直接报错。
+
+> 注:通常PCM数据按G722编码后数据量只有原先的1/4,反之G722解码为PCM后数据量为原先的4倍。
+
+### `G722.write`
+
+该方法用于将G722音频数据解码成PCM,并放入播放缓存中进行播放。
+
+```python
+G722.write(buffer)
+```
+
+**参数描述:**
+
+- `buff` - 需要解码的音频数据,bytearray类型。
+
+**返回值描述:**
+
+成功返回写入的数据量;
+
+失败则返回`-1`。
+
+**示例:**
+
+```python
+import audio
+import G722
+import uos
+
+pcm = audio.Audio.PCM(0, 1, 16000, 2, 1)
+g722 = G722(pcm, 64000)
+#g722 code
+def g722_compress(frame):
+ f = open("/usr/test.g722", "wb")
+ count = frame
+ while count:
+ count-=1
+ g722_buf = g722.read()
+ print("len:",len(g722_buf))
+ if(len(g722_buf) > 0):
+ f.write(g722_buf)
+ f.close()
+#g722 decode
+def g722_decompression():
+ file_size = uos.stat("/usr/test.g722")[6] # get file size
+ print("size=",file_size)
+ with open("/usr/test.g722", "rb")as f:
+ while 1:
+ b = f.read(160)
+ if not b:
+ break
+ write_len = g722.write(b)
+ f.close()
+
+if __name__ == "__main__":
+ g722_compress(200)
+ g722_decompression()
+```
+
+
+
+## 音频编码-G729
+
+该模块用于G729格式的录音和音频播放。
+
+### 构造函数
+
+```python
+class G729(pcm)
+```
+
+创建G729对象。
+
+**参数描述:**
+
+- `device` - PCM对象,obj类型,见[PCM](#创建对象)。
+
+**示例:**
+
+```python
+import G729
+import audio
+
+pcm = audio.Audio.PCM(0, 1, 8000, 2)
+g729 = G729(pcm)
+```
+
+### `G729.read`
+
+该方法用于读取G722格式录音数据,单次输出一帧录音数据(一帧录音数据长度为20字节)。
+
+```python
+G729.read()
+```
+
+**返回值描述:**
+
+成功则返回音频buffer;
+
+失败则直接报错。
+
+> 注:通常PCM数据按G729编码后数据量只有原先的1/16,反之G729解码为PCM后数据量为原先的16倍。
+
+
+### `G729.write`
+
+该方法用于将G729音频数据解码成PCM,并放入播放缓存中进行播放。
+
+```python
+G729.write(buffer)
+```
+
+**参数描述:**
+
+- `buff` - 需要解码的音频数据,bytearray类型。
+
+**返回值描述:**
+
+成功返回写入的数据量;
+
+失败则返回`-1`。
+
+**示例:**
+
+```python
+import audio
+import G729
+import uos
+
+pcm = audio.Audio.PCM(0, 1, 8000, 2, 1)
+g729 = G729(pcm)
+#g729 code
+def g729_compress(frame):
+ f = open("/usr/test.g729", "wb")
+ count = frame
+ while count:
+ count-=1
+ g729_buf = g729.read()
+ print("len:",len(g729_buf))
+ if(len(g729_buf) > 0):
+ f.write(g729_buf)
+ f.close()
+#g729 decode
+def g729_decompression():
+ file_size = uos.stat("/usr/test.g729")[6] # get file size
+ print("size=",file_size)
+ with open("/usr/test.g729", "rb")as f:
+ while 1:
+ b = f.read(20)
+ if not b:
+ break
+ write_len = g729.write(b)
+ f.close()
+
+if __name__ == "__main__":
+ g729_compress(200)
+ g729_decompression()
+```
+
--
Gitee