小麦克 发表于 2024-7-31 14:18

【米尔 NXP i.MX93 开发板评测】 PJSIP开发笔记

本帖最后由 小麦克 于 2024-7-31 14:20 编辑

> 之前写了一篇开箱[报告](https://bbs.eeworld.com.cn/thread-1289138-1-1.html),了解到开发板自带了ARM原生GCC编译器。这篇帖子我们通过ARM原生GCC编译器来测试一下第三方`PJSIP`库开发。

## PJSIP
PJSIP是一个包含了SIP、SDP、RTP、RTCP、STUN、ICE等协议实现的开源库。它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次、抽象的多媒体通信API,这套API能够很容易的一直到各种构架中,不管是桌面计算机,还是嵌入式设备等。
后面我们可以通过这个库实现一个网络对讲机。

## 准备工作

使用ssh登陆开发板,串口也可以,但是串口打印字符比较耗时间。我一般用来做一些基本命令的操作。

```bash
ssh root@172.20.10.5
```

显示文件信息`ls`命令默认没有颜色,编辑`~/.profile`文件

```bash
cd ~
vi .profile
# 在文件末尾添加
alias ls='ls --color'
source ./.profile
```

## 下载编译

下载最新的PJSIP 2.14.1,添加`-fPIC`,支持C++

```bash
# 下载最新的PJSIP库
wget https://github.com/pjsip/pjproject/archive/refs/tags/2.14.1.tar.gz
# 解压
tar -xzf 2.14.1.tar.gz
cd pjproject-2.14.1
# 配置
./configure
# 创建 user.mak
touch user.mak
# 编辑添加 CFLAGS += -fPIC
vi user.mak
export CFLAGS += -fPIC
make dep
# 使用双核心编译,加快编译速度
make -j2
```

可以看到`-j2`编译时CPU利用率为100%,能完全榨干CPU的性能



不到10分钟,编译成功,`pjsip-apps`目录下有自带的测试例程。

## 功能测试

```bash
cd pjsip-apps/bin
# 执行PJSIP自带的测试程序
./pjsystest-aarch64-unknown-linux-gnu
```

报错:找不到音频设备的问题,这是因为PJSIP依赖ALSA库,设备中没带ALSA的开发包。


**解决方法**

编辑 `./pjproject/pjlib/include/pj/config_site.h` 添加宏定义`PJMEDIA_AUDIO_DEV_HAS_ALSA`

```c
#include <pj/config_site_sample.h>

#define PJMEDIA_AUDIO_DEV_HAS_ALSA 1
```

再次编译

```bash
make clean
./configure
make dep -j2
make -j2
```

编译报错 `fatal error: alsa/asoundlib.h: No such file or directory`

参考[这里](https://github.com/pjsip/pjproject/issues/2521)

需要下载安装`asoundlib`库。

```bash
# fatal error: alsa/asoundlib.h: No such file or directory
wget http://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.12.tar.bz2
tar -xjf alsa-lib-1.2.12.tar.bz2
cd alsa-lib-1.2.12/
# 配置
./configure
make -j2
make install
```

继续通过`./pjsip-apps/bin/pjsystest-aarch64-unknown-linux-gnu`查询音频设备

```bash
M E N U :
---------
0: Tests
00: Run test wizard
01: Device Test
02: Play Tone
03: Play WAV File1
04: Play WAV File2
05: Record Audio
06: Latency Test
07: AEC/AES Test

09: Exit
1: Options
10: View Devices
11: View Settings

Enter the menu number: 10
14:41:03.128            systest.cRunning Audio Device List
Audio Device List
Found 2 devices
0: ALSA (1/1)
1: ALSA (1/1)
```

可以看到这里查询到了两个设备

作为对比,使用ALSA的 `arecord` 和 `aplay` 工具查询音频设备列表,看看有什么差别。

> 音频接口查询,注意`-l` 和 `-L` 查询的结果有差别。

```bash
# 查看输入音频接口
root@myd-lmx9x:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: SGTL5000Card , device 0: 443b0000.sai-sgtl5000 sgtl5000-0
Subdevices: 1/1
Subdevice #0: subdevice #0
root@myd-lmx9x:~# arecord -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
sysdefault:CARD=SGTL5000Card
    SGTL5000-Card, 443b0000.sai-sgtl5000 sgtl5000-0
    Default Audio Device

# 查看输入音频接口
root@myd-lmx9x:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: SGTL5000Card , device 0: 443b0000.sai-sgtl5000 sgtl5000-0
Subdevices: 1/1
Subdevice #0: subdevice #0
root@myd-lmx9x:~# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
sysdefault:CARD=SGTL5000Card
    SGTL5000-Card, 443b0000.sai-sgtl5000 sgtl5000-0
    Default Audio Device
root@myd-lmx9x:~#
```

接下来对比正点原子IMX93开发板查询结果,这块开发板接上了H340 USB耳机。

> 两款开发板用的音频芯片不一样,正点原子使用的是国产`ES8388`,米尔和官方EVK开发板使用一样的音频芯片`SGTL5000`

```bash
root@atk-imx93:~/work# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: es8388audio , device 0: HiFi ES8388 HiFi-0
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: H340 , device 0: USB Audio
Subdevices: 1/1
Subdevice #0: subdevice #0

# 录音:指定H340作为输入MIC
arecord -D plughw:1,0 -f cd -t wav -d 10 test.wav

# 播放:指定H340作为输出SPEAKER
aplay -D plughw:1,0 test.wav
```

### 其他

测试中,找到了相关命令测试方法,一并记录在这里

```bash
/ # arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: xxsndcard , device 1: TDM_Capture (*) []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: xxsndcard , device 2: DMIC_Capture (*) []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: xxsndcard , device 3: AWB_Record (*) []
Subdevices: 1/1
Subdevice #0: subdevice #0

# 录音
arecord -Dhw:0,1 -d 10 -f cd -r 44100 -c 2 -t wav test.wav
参数解析
-D 指定了录音设备,0,1 是card 0 device 1的意思,也就是TDM_Capture
-d 指定录音的时长,单位秒
-f 指定录音格式 cd cdr dat
-r 指定了采样率,单位Hz
-c 指定channel个数
-t 指定生成的文件格式
```

### 调整音量

默认的输入音量有点小,先调整一下

```bash
alsamixer
```

我的电脑F快捷键有问题,通过tab键切换到`Capture`。由于对Linux音频不太了解,这么多输入项,都调大点吧~



### 对讲测试

进行简单的SIP点对点测试,验证测试音频实时对讲是否正常

```bash
cd pjsip-apps/bin/samples/aarch64-unknown-linux-gnu
# 172.20.10.3为PC IP,安装了Linphone
./simpleua sip:bruce@172.20.10.3
./simpleua sip:bruce@172.20.10.14
```

经过测试发现,点对点的SIP已经能正确建立,但是没有声音。首先排除PC电脑端的声音问题,阅读`simpleua.c`源码,`pjmedia_snd_port_create` 使用了默认音频设备,可能是这里默认指定的设备有问题。

```c
/*
* Create bidirectional port.
*/
PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool,
                                             int rec_id,
                                             int play_id,
                                             unsigned clock_rate,
                                             unsigned channel_count,
                                             unsigned samples_per_frame,
                                             unsigned bits_per_sample,
                                             unsigned options,
                                             pjmedia_snd_port **p_port)
{
    //...
}
```

`rec_id` 指录音设备id,`play_id` 指播放设备id。



改为 1, 0 后能正常语音了,但是感觉从开发板出去的音频有点卡顿。在下图红框中的时候声音会不正常,感觉被处理掉了

接上H340 USB耳机,改pjmedia_snd_port_create id为2,2,测试发现音频通话质量比较好。
```c
    /* Create sound port */
    status = pjmedia_snd_port_create(inv->pool,
                            2,
                            2,
                            PJMEDIA_PIA_SRATE(&media_port->info),/* clock rate      */
                            PJMEDIA_PIA_CCNT(&media_port->info),/* channel count    */
                            PJMEDIA_PIA_SPF(&media_port->info), /* samples per frame*/
                            PJMEDIA_PIA_BITS(&media_port->info),/* bits per sample*/
                            0,
                            &g_snd_port);
```

## 结论

虽然IMX93包含两个A55的64位CPU,编译性能和普通的PC还是差太多,上面测试的PJSIP库在x86下面编译不到1分钟就搞定了。为了开发效率,我们后面还是使用PC进行开发。

Jacktang 发表于 2024-8-1 09:02

<p>编译性能和普通的PC还是差太多,看了楼主的测试记录应该是这样</p>
页: [1]
查看完整版本: 【米尔 NXP i.MX93 开发板评测】 PJSIP开发笔记