本帖最后由 小麦克 于 2024-7-31 14:20 编辑
之前写了一篇开箱报告,了解到开发板自带了ARM原生GCC编译器。这篇帖子我们通过ARM原生GCC编译器来测试一下第三方PJSIP
库开发。
PJSIP
PJSIP是一个包含了SIP、SDP、RTP、RTCP、STUN、ICE等协议实现的开源库。它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次、抽象的多媒体通信API,这套API能够很容易的一直到各种构架中,不管是桌面计算机,还是嵌入式设备等。
后面我们可以通过这个库实现一个网络对讲机。
准备工作
使用ssh登陆开发板,串口也可以,但是串口打印字符比较耗时间。我一般用来做一些基本命令的操作。
ssh root@172.20.10.5
显示文件信息ls
命令默认没有颜色,编辑~/.profile
文件
cd ~
vi .profile
alias ls='ls --color'
source ./.profile
下载编译
下载最新的PJSIP 2.14.1,添加-fPIC
,支持C++
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
touch user.mak
vi user.mak
export CFLAGS += -fPIC
make dep
make -j2
可以看到-j2
编译时CPU利用率为100%,能完全榨干CPU的性能
不到10分钟,编译成功,pjsip-apps
目录下有自带的测试例程。
功能测试
cd pjsip-apps/bin
./pjsystest-aarch64-unknown-linux-gnu
报错:找不到音频设备的问题,这是因为PJSIP依赖ALSA库,设备中没带ALSA的开发包。
解决方法
编辑 ./pjproject/pjlib/include/pj/config_site.h
添加宏定义PJMEDIA_AUDIO_DEV_HAS_ALSA
#include <pj/config_site_sample.h>
#define PJMEDIA_AUDIO_DEV_HAS_ALSA 1
再次编译
make clean
./configure
make dep -j2
make -j2
编译报错 fatal error: alsa/asoundlib.h: No such file or directory
参考这里
需要下载安装asoundlib
库。
wget http:
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
查询音频设备
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.c Running Audio Device List
Audio Device List
Found 2 devices
0: ALSA [pulse] (1/1)
1: ALSA [sysdefault:CARD=SGTL5000Card] (1/1)
可以看到这里查询到了两个设备
作为对比,使用ALSA的 arecord
和 aplay
工具查询音频设备列表,看看有什么差别。
音频接口查询,注意-l
和 -L
查询的结果有差别。
root@myd-lmx9x:~
**** List of CAPTURE Hardware Devices ****
card 0: SGTL5000Card [SGTL5000-Card], device 0: 443b0000.sai-sgtl5000 sgtl5000-0 [443b0000.sai-sgtl5000 sgtl5000-0]
Subdevices: 1/1
Subdevice
root@myd-lmx9x:~
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:~
**** List of PLAYBACK Hardware Devices ****
card 0: SGTL5000Card [SGTL5000-Card], device 0: 443b0000.sai-sgtl5000 sgtl5000-0 [443b0000.sai-sgtl5000 sgtl5000-0]
Subdevices: 1/1
Subdevice
root@myd-lmx9x:~
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
root@atk-imx93:~/work
**** List of PLAYBACK Hardware Devices ****
card 0: es8388audio [es8388-audio], device 0: HiFi ES8388 HiFi-0 [HiFi ES8388 HiFi-0]
Subdevices: 1/1
Subdevice
card 1: H340 [Logi USB Headset H340], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice
arecord -D plughw:1,0 -f cd -t wav -d 10 test.wav
aplay -D plughw:1,0 test.wav
其他
测试中,找到了相关命令测试方法,一并记录在这里
/
**** List of CAPTURE Hardware Devices ****
card 0: xxsndcard [xx-snd-card], device 1: TDM_Capture (*) []
Subdevices: 1/1
Subdevice
card 0: xxsndcard [xx-snd-card], device 2: DMIC_Capture (*) []
Subdevices: 1/1
Subdevice
card 0: xxsndcard [xx-snd-card], device 3: AWB_Record (*) []
Subdevices: 1/1
Subdevice
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 指定生成的文件格式
调整音量
默认的输入音量有点小,先调整一下
alsamixer
我的电脑F快捷键有问题,通过tab键切换到Capture
。由于对Linux音频不太了解,这么多输入项,都调大点吧~
对讲测试
进行简单的SIP点对点测试,验证测试音频实时对讲是否正常
cd pjsip-apps/bin/samples/aarch64-unknown-linux-gnu
./simpleua sip:bruce@172.20.10.3
./simpleua sip:bruce@172.20.10.14
经过测试发现,点对点的SIP已经能正确建立,但是没有声音。首先排除PC电脑端的声音问题,阅读simpleua.c
源码,pjmedia_snd_port_create
使用了默认音频设备,可能是这里默认指定的设备有问题。
* 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,测试发现音频通话质量比较好。
status = pjmedia_snd_port_create(inv->pool,
2,
2,
PJMEDIA_PIA_SRATE(&media_port->info),
PJMEDIA_PIA_CCNT(&media_port->info),
PJMEDIA_PIA_SPF(&media_port->info),
PJMEDIA_PIA_BITS(&media_port->info),
0,
&g_snd_port);
结论
虽然IMX93包含两个A55的64位CPU,编译性能和普通的PC还是差太多,上面测试的PJSIP库在x86下面编译不到1分钟就搞定了。为了开发效率,我们后面还是使用PC进行开发。