基于R329开发板构建多房间音频组播系统1——测评
-
一直想自己动手做一套多房间音频组播系统,研发硬件产品得选择电子器件,而其中很重要的器件就是主控CPU。搜集了不少资料,最终选择全志R329,因为它内置双核A53作为Linux主控性能够强大,此外还集成专业音频处理核HiFi4 DSP(不需要额外硬件就能实现音响产品必须的调音量、调EQ等功能)以及AI核Zhouyi NPU(满足个性化语音控制等智能化需求)。
选好了主控,接下来该弄块电路板玩玩,最快捷的方式是买开发板。全志官方推出了R329 evb5开发板,板载WiFi模组、MIC阵列、喇叭接口,还几乎引出了所有IO,是我想要的。在全志官方淘宝店咨询了客服,没有现货,多问几次后给了我在线官方交流群号,让我找产品经理提购买需求,加群后成功买到开发板,还特意送了我一块。
开发板到手,按照官方指引测试了点灯、WiFi联网和录音与播放都正常。但我更关注WiFi和音频的性能:WiFi连接下的ping值和吞吐量,音频的声道数、采样率和采样精度。
1 WiFi性能测试
R329 evb5开发板、Dell Ubuntu笔记本和Lenovo win10一体机都通过无线连接到路由器,将Ubuntu作为对照组来评估R329开发板WiFi性能。为排除干扰因素保证测试准确性,路由器WAN口未上联到任何网络。
1.1 ping值测试
R329 evb5 ping路由器root@TinaLinux:/# ping 192.168.2.1 -c 20 PING 192.168.2.1 (192.168.2.1): 56 data bytes 64 bytes from 192.168.2.1: seq=0 ttl=64 time=6.348 ms 64 bytes from 192.168.2.1: seq=1 ttl=64 time=7.485 ms 64 bytes from 192.168.2.1: seq=2 ttl=64 time=6.894 ms 64 bytes from 192.168.2.1: seq=3 ttl=64 time=5.353 ms 64 bytes from 192.168.2.1: seq=4 ttl=64 time=8.104 ms 64 bytes from 192.168.2.1: seq=5 ttl=64 time=19.801 ms 64 bytes from 192.168.2.1: seq=6 ttl=64 time=7.150 ms 64 bytes from 192.168.2.1: seq=7 ttl=64 time=6.628 ms 64 bytes from 192.168.2.1: seq=8 ttl=64 time=7.348 ms 64 bytes from 192.168.2.1: seq=9 ttl=64 time=6.825 ms 64 bytes from 192.168.2.1: seq=10 ttl=64 time=7.057 ms 64 bytes from 192.168.2.1: seq=11 ttl=64 time=6.887 ms 64 bytes from 192.168.2.1: seq=12 ttl=64 time=7.128 ms 64 bytes from 192.168.2.1: seq=13 ttl=64 time=7.208 ms 64 bytes from 192.168.2.1: seq=14 ttl=64 time=7.008 ms 64 bytes from 192.168.2.1: seq=15 ttl=64 time=6.811 ms 64 bytes from 192.168.2.1: seq=16 ttl=64 time=2.825 ms 64 bytes from 192.168.2.1: seq=17 ttl=64 time=7.661 ms 64 bytes from 192.168.2.1: seq=18 ttl=64 time=8.144 ms 64 bytes from 192.168.2.1: seq=19 ttl=64 time=6.582 ms --- 192.168.2.1 ping statistics --- 20 packets transmitted, 20 packets received, 0% packet loss round-trip min/avg/max = 2.825/7.462/19.801 ms
Ubuntu ping路由器
gmei@dell:~$ ping 192.168.2.1 -c 20 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. 64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=3.59 ms 64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=3.46 ms 64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=3.43 ms 64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=3.51 ms 64 bytes from 192.168.2.1: icmp_seq=5 ttl=64 time=3.40 ms 64 bytes from 192.168.2.1: icmp_seq=6 ttl=64 time=6.13 ms 64 bytes from 192.168.2.1: icmp_seq=7 ttl=64 time=3.48 ms 64 bytes from 192.168.2.1: icmp_seq=8 ttl=64 time=3.53 ms 64 bytes from 192.168.2.1: icmp_seq=9 ttl=64 time=3.50 ms 64 bytes from 192.168.2.1: icmp_seq=10 ttl=64 time=2.88 ms 64 bytes from 192.168.2.1: icmp_seq=11 ttl=64 time=2.90 ms 64 bytes from 192.168.2.1: icmp_seq=12 ttl=64 time=2.95 ms 64 bytes from 192.168.2.1: icmp_seq=13 ttl=64 time=3.64 ms 64 bytes from 192.168.2.1: icmp_seq=14 ttl=64 time=5.46 ms 64 bytes from 192.168.2.1: icmp_seq=15 ttl=64 time=3.92 ms 64 bytes from 192.168.2.1: icmp_seq=16 ttl=64 time=3.94 ms 64 bytes from 192.168.2.1: icmp_seq=17 ttl=64 time=3.68 ms 64 bytes from 192.168.2.1: icmp_seq=18 ttl=64 time=3.37 ms 64 bytes from 192.168.2.1: icmp_seq=19 ttl=64 time=3.19 ms 64 bytes from 192.168.2.1: icmp_seq=20 ttl=64 time=3.32 ms --- 192.168.2.1 ping statistics --- 20 packets transmitted, 20 received, 0% packet loss, time 19031ms rtt min/avg/max/mdev = 2.880/3.664/6.130/0.770 ms
结论:R329开发板ping值是Dell笔记本的2倍??
1.2 吞吐量测试
R329开发板作为服务端,win10台式机作为客户端。
TCP:F:\sw\it\iperf-2.0.9-win64>iperf -c 192.168.2.31 -i 1 -t 30 -p 5001 -b 1000M ------------------------------------------------------------ Client connecting to 192.168.2.31, TCP port 5001 TCP window size: 208 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.2.11 port 65519 connected with 192.168.2.31 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 1.0 sec 2.85 MBytes 23.9 Mbits/sec [ 3] 1.0- 2.0 sec 2.97 MBytes 24.9 Mbits/sec [ 3] 2.0- 3.0 sec 3.16 MBytes 26.5 Mbits/sec [ 3] 3.0- 4.0 sec 1.70 MBytes 14.3 Mbits/sec [ 3] 4.0- 5.0 sec 3.45 MBytes 29.0 Mbits/sec [ 3] 5.0- 6.0 sec 2.10 MBytes 17.6 Mbits/sec [ 3] 6.0- 7.0 sec 2.30 MBytes 19.3 Mbits/sec [ 3] 7.0- 8.0 sec 2.68 MBytes 22.5 Mbits/sec [ 3] 8.0- 9.0 sec 3.02 MBytes 25.3 Mbits/sec [ 3] 9.0-10.0 sec 2.75 MBytes 23.1 Mbits/sec [ 3] 10.0-11.0 sec 3.53 MBytes 29.6 Mbits/sec [ 3] 11.0-12.0 sec 3.60 MBytes 30.2 Mbits/sec [ 3] 12.0-13.0 sec 3.32 MBytes 27.8 Mbits/sec [ 3] 13.0-14.0 sec 3.50 MBytes 29.4 Mbits/sec [ 3] 14.0-15.0 sec 3.34 MBytes 28.1 Mbits/sec [ 3] 15.0-16.0 sec 1.14 MBytes 9.53 Mbits/sec [ 3] 16.0-17.0 sec 2.46 MBytes 20.7 Mbits/sec [ 3] 17.0-18.0 sec 3.26 MBytes 27.3 Mbits/sec [ 3] 18.0-19.0 sec 3.63 MBytes 30.5 Mbits/sec [ 3] 19.0-20.0 sec 3.31 MBytes 27.8 Mbits/sec [ 3] 20.0-21.0 sec 3.21 MBytes 26.9 Mbits/sec [ 3] 21.0-22.0 sec 2.97 MBytes 24.9 Mbits/sec [ 3] 22.0-23.0 sec 3.08 MBytes 25.9 Mbits/sec [ 3] 23.0-24.0 sec 3.52 MBytes 29.6 Mbits/sec [ 3] 24.0-25.0 sec 2.48 MBytes 20.8 Mbits/sec [ 3] 25.0-26.0 sec 2.22 MBytes 18.6 Mbits/sec [ 3] 26.0-27.0 sec 3.27 MBytes 27.4 Mbits/sec [ 3] 27.0-28.0 sec 3.09 MBytes 25.9 Mbits/sec [ 3] 28.0-29.0 sec 1.94 MBytes 16.3 Mbits/sec [ 3] 29.0-30.0 sec 2.59 MBytes 21.7 Mbits/sec [ 3] 0.0-30.0 sec 86.5 MBytes 24.2 Mbits/sec F:\sw\it\iperf-2.0.9-win64>
UDP:
root@TinaLinux:/# iperf -u -s -i 1 -p 5001 ------------------------------------------------------------ Server listening on UDP port 5001 Receiving 1470 byte datagrams UDP buffer size: 224 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.2.31 port 5001 connected with 192.168.2.11 port 57044 [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 3] 0.0- 1.0 sec 2.05 MBytes 17.2 Mbits/sec 1.282 ms 639/ 2104 (30%) [ 3] 1.0- 2.0 sec 2.41 MBytes 20.2 Mbits/sec 1.165 ms 5324/ 7041 (76%) [ 3] 2.0- 3.0 sec 2.15 MBytes 18.1 Mbits/sec 0.712 ms 3982/ 5518 (72%) [ 3] 3.0- 4.0 sec 2.26 MBytes 19.0 Mbits/sec 0.928 ms 5366/ 6979 (77%) [ 3] 4.0- 5.0 sec 2.26 MBytes 19.0 Mbits/sec 2.296 ms 4061/ 5674 (72%) [ 3] 5.0- 6.0 sec 2.04 MBytes 17.1 Mbits/sec 1.324 ms 4636/ 6089 (76%) [ 3] 6.0- 7.0 sec 2.29 MBytes 19.2 Mbits/sec 0.931 ms 5174/ 6807 (76%) [ 3] 7.0- 8.0 sec 2.39 MBytes 20.0 Mbits/sec 1.682 ms 4343/ 6046 (72%) [ 3] 8.0- 9.0 sec 1.96 MBytes 16.5 Mbits/sec 0.640 ms 3504/ 4903 (71%) [ 3] 9.0-10.0 sec 2.60 MBytes 21.8 Mbits/sec 0.922 ms 4491/ 6345 (71%) [ 3] 10.0-11.0 sec 2.55 MBytes 21.4 Mbits/sec 1.571 ms 2774/ 4592 (60%) [ 3] 11.0-12.0 sec 2.04 MBytes 17.1 Mbits/sec 1.242 ms 2751/ 4209 (65%) [ 3] 12.0-13.0 sec 2.21 MBytes 18.6 Mbits/sec 0.632 ms 5089/ 6668 (76%) [ 3] 13.0-14.0 sec 2.32 MBytes 19.4 Mbits/sec 1.602 ms 4464/ 6116 (73%) [ 3] 14.0-15.0 sec 2.35 MBytes 19.7 Mbits/sec 0.825 ms 4585/ 6263 (73%) [ 3] 15.0-16.0 sec 2.37 MBytes 19.9 Mbits/sec 1.590 ms 4099/ 5790 (71%) [ 3] 16.0-17.0 sec 2.19 MBytes 18.4 Mbits/sec 0.402 ms 3852/ 5417 (71%) [ 3] 17.0-18.0 sec 2.54 MBytes 21.3 Mbits/sec 2.604 ms 3999/ 5811 (69%) [ 3] 18.0-19.0 sec 2.09 MBytes 17.5 Mbits/sec 0.871 ms 3217/ 4705 (68%) [ 3] 19.0-20.0 sec 1.85 MBytes 15.5 Mbits/sec 1.224 ms 4089/ 5409 (76%) [ 3] 20.0-21.0 sec 2.58 MBytes 21.7 Mbits/sec 1.067 ms 5517/ 7360 (75%) [ 3] 21.0-22.0 sec 2.43 MBytes 20.4 Mbits/sec 1.182 ms 3624/ 5359 (68%) [ 3] 22.0-23.0 sec 2.35 MBytes 19.7 Mbits/sec 1.085 ms 4552/ 6227 (73%) [ 3] 23.0-24.0 sec 2.37 MBytes 19.9 Mbits/sec 0.519 ms 3974/ 5662 (70%) [ 3] 24.0-25.0 sec 2.30 MBytes 19.3 Mbits/sec 0.930 ms 4587/ 6229 (74%) [ 3] 25.0-26.0 sec 2.36 MBytes 19.8 Mbits/sec 0.795 ms 4314/ 6000 (72%) [ 3] 26.0-27.0 sec 2.36 MBytes 19.8 Mbits/sec 0.528 ms 4714/ 6394 (74%) [ 3] 27.0-28.0 sec 2.41 MBytes 20.2 Mbits/sec 1.235 ms 3772/ 5489 (69%) [ 3] 28.0-29.0 sec 2.30 MBytes 19.3 Mbits/sec 1.076 ms 4112/ 5751 (72%) [ 3] 29.0-30.0 sec 2.48 MBytes 20.8 Mbits/sec 0.734 ms 4058/ 5824 (70%) [ 3] 0.0-30.2 sec 70.3 MBytes 19.5 Mbits/sec 1.797 ms 2147257037/2147307148 (1e+02%) root@TinaLinux:/#
Dell笔记本作为服务端,win10一体机作为客户端。
TCP:F:\sw\it\iperf-2.0.9-win64>iperf -c 192.168.2.21 -i 1 -t 30 -p 5001 -b 1000M ...... [ 3] 0.0-30.0 sec 161 MBytes 45.0 Mbits/sec F:\sw\it\iperf-2.0.9-win64>
UDP:
gmei@dell:~iperf -u -s -i 1 -p 5001 ...... [ 3] 0.0-29.9 sec 196 MBytes 55.0 Mbits/sec 1.027 ms 977/140872 (0.69%) gmei@dell:~$
win10一体机作为服务端,R329开发板作为客户端。
TCP:root@TinaLinux:/# iperf -c 192.168.2.11 -i 1 -t 30 -p 5001 -b 1000M ...... [ 3] 0.0-30.0 sec 145 MBytes 40.6 Mbits/sec root@TinaLinux:/#
UDP:
root@TinaLinux:/# iperf -u -c 192.168.2.11 -i 1 -t 30 -p 5001 -b 1000M ...... [ 3] 0.0-30.0 sec 165 MBytes 46.1 Mbits/sec [ 3] Sent 117592 datagrams root@TinaLinux:/#
win10一体机作为服务端,Dell笔记本开发板作为客户端。
TCP:gmei@dell:~$ iperf -c 192.168.2.11 -i 1 -t 30 -p 5001 -b 1000M ...... [ 3] 0.0-30.0 sec 170 MBytes 47.6 Mbits/sec gmei@dell:~$
UDP:
gmei@dell:~$ iperf -u -c 192.168.2.11 -i 1 -t 30 -p 5001 -b 1000M ...... [ 3] 0.0-30.0 sec 207 MBytes 57.9 Mbits/sec [ 3] Sent 147853 datagrams gmei@dell:~$
结论:作为服务端,R329吞吐量只有Dell笔记本的一半;作为客户端,R329吞吐量与Dell笔记本相当??
2 音频性能测试
利用Tina SDK自带的arecord测试R329开发板支持的声道数、采样率和采样精度。
是否支持192K采样率、24位采样精度?root@TinaLinux:/# arecord -r 192000 -c 2 -f U24_LE -d 10 20211119.wav [13449.631722] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_startup [13449.639222] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_hw_params [13449.646676] sunxi-internal-cpudai cpudai: ======== hw_params ======== [13449.653912] sunxi-internal-cpudai cpudai: pcm_params->format:2 [13449.660469] sunxi-internal-cpudai cpudai: pcm_params->channels:5 [13449.667220] sunxi-internal-cpudai cpudai: pcm_params->rate:16000 [13449.673980] sunxi-internal-cpudai cpudai: pcm_params->period_size:1024 [13449.681317] sunxi-internal-cpudai cpudai: pcm_params->periods:4 [13449.687972] sunxi-internal-cpudai cpudai: pcm_params->pcm_frames:1024 [13449.695212] sunxi-internal-cpudai cpudai: pcm_params->buffer_size:4096 [13449.702548] sunxi-internal-cpudai cpudai: =========================== [13449.734939] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_params Recording WAVE '20211119.wav' : Unsigned 24 bit Little Endian, Rate 192000 Hz, Stereo arecord: begin_wave:2521: [13449.776745] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_free Wave doesn't support U24_LE format... [13449.911776] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_shutdown root@TinaLinux:/#
不支持U24_LE,那支持哪几种格式?查代码,得到如下结果:
out/r329-evb5/compile_dir/target/alsa-utils-1.1.0/aplay/aplay.c 2505 switch ((unsigned long) hwparams.format) { 2506 case SND_PCM_FORMAT_U8: 2507 bits = 8; 2508 break; 2509 case SND_PCM_FORMAT_S16_LE: 2510 bits = 16; 2511 break; 2512 case SND_PCM_FORMAT_S32_LE: 2513 case SND_PCM_FORMAT_FLOAT_LE: 2514 bits = 32; 2515 break; 2516 case SND_PCM_FORMAT_S24_LE: 2517 case SND_PCM_FORMAT_S24_3LE: 2518 bits = 24; 2519 break; 2520 default: 2521 error(_("Wave doesn't support %s format..."), snd_pcm_format_name(hwparams.format)); 2522 prg_exit(EXIT_FAILURE); 2523 }
可知支持U8、S16_LE、S24_LE、S24_3LE、S32_LE,对应8位、16位、24位、32位采样精度。
root@TinaLinux:/# arecord -r 192000 -c 3 -f S32_LE -d 5 20211119.wav [10023.671676] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_startup [10023.679195] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_hw_params [10023.686649] sunxi-internal-cpudai cpudai: ======== hw_params ======== [10023.693897] sunxi-internal-cpudai cpudai: pcm_params->format:2 [10023.700460] sunxi-internal-cpudai cpudai: pcm_params->channels:5 [10023.707213] sunxi-internal-cpudai cpudai: pcm_params->rate:16000 [10023.713970] sunxi-internal-cpudai cpudai: pcm_params->period_size:1024 [10023.721307] sunxi-internal-cpudai cpudai: pcm_params->periods:4 [10023.727961] sunxi-internal-cpudai cpudai: pcm_params->pcm_frames:1024 [10023.735207] sunxi-internal-cpudai cpudai: pcm_params->buffer_size:4096 [10023.742546] sunxi-internal-cpudai cpudai: =========================== [10023.774954] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_params Recording WAVE '20211119.wav' : Signed 32 bit Little Endian, Rate 192000 Hz, Channels 3 overrun!!! (at least 0.021 ms long) overrun!!! (at least 0.021 ms long) overrun!!! (at least 0.022 ms long) overrun!!! (at least 0.021 ms long) [10032.378621] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_free [10032.431634] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_shutdown root@TinaLinux:/#
提示缓冲区溢出,录制出来的音频文件听起来不连续,扩大alsa音频缓冲区即可解决问题。
root@TinaLinux:/# arecord -r 192000 -c 3 -f S32_LE --buffer-time 500000 -d 5 27.wav [24079.831625] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_startup [24079.839114] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_hw_params [24079.846570] sunxi-internal-cpudai cpudai: ======== hw_params ======== [24079.853815] sunxi-internal-cpudai cpudai: pcm_params->format:2 [24079.860461] sunxi-internal-cpudai cpudai: pcm_params->channels:5 [24079.867219] sunxi-internal-cpudai cpudai: pcm_params->rate:16000 [24079.873972] sunxi-internal-cpudai cpudai: pcm_params->period_size:1024 [24079.881310] sunxi-internal-cpudai cpudai: pcm_params->periods:4 [24079.887965] sunxi-internal-cpudai cpudai: pcm_params->pcm_frames:1024 [24079.895202] sunxi-internal-cpudai cpudai: pcm_params->buffer_size:4096 [24079.902582] sunxi-internal-cpudai cpudai: =========================== [24079.934899] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_params Recording WAVE '27.wav' : Signed 32 bit Little Endian, Rate 192000 Hz, Channels 3 [24085.699938] sunxi-internal-cpudai cpudai: sunxi_hifi_pcm_hw_free [24085.771732] sunxi-codec-machine sndcodec: sunxi_hifi_sndcodec_shutdown root@TinaLinux:/#
声道数,由于板载三颗MIC,测试使用3声道,看资料可知最高支持8声道。
结论:开发板最高支持192KHz采样率、8声道、32位采样精度,满足超高清音频应用要求。DSP核功能和性能没有直接测试,因为即便在https://www.synaptics.com/contact申请了多次也拿不到源码、lisence和编译工具链。有老哥以个人名义申请到这些了吗?
-
老哥,问一下你理想中的多房间音频组播系统是什么,类似于一个人在一个房间里说话,同时在多个房间中播放吗? 使用网络来进行传输?
-
@bedrock 这个系统主要用来听。家庭多个空间里的音箱同步播放相同的音频,在家里多个空间穿梭时能够听到连续的音乐,而不用随身携带发声源。用WiFi来传输。
-
@yimu163com 明白了,感谢,蹲一下进度
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号