【米尔 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进行开发。
<p>编译性能和普通的PC还是差太多,看了楼主的测试记录应该是这样</p>
页:
[1]