查看: 6276|回复: 0

[项目] 音频直播测试,在两个树莓派(或香蕉派)之间

[复制链接]
  • TA的每日心情
    开心
    2013-12-17 13:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2017-12-6 18:29:52 | 显示全部楼层 |阅读模式
    分享到:
    一、场景介绍及准备工作1. 场景
    • 一共两个设备(树莓派或香蕉派)。一个设备做录音端,一个设备做播放端,通过网络的方式建立连接。
    • 网络连接采用netcat的方式在录音端建立监听(arecord -D 'xxx(录音设备名)' |nc -l 8888),在播放端连接上监听后播放(nc  xxx.xxx.xxx(ip地址) xxxx(端口) | aplay)。
    • 为了简化手工输入命令,用python来实现在一个设备来控制另外一个设备自动录音、播放。
    2. 准备工作
    • 两个设备(树莓派或香蕉派,我手上有一个树莓派一个香蕉派,香蕉派自带mic)、设备安装好系统(本场景中以debian为例)、网络环境(设备可以上网、两个设备可以互相访问)、3.5插头喇叭----这部分工作在本文不做介绍
    • 安装好声卡驱动、alsa工具、python-pip环境


    二、步骤说明1、安装alsa-utils
    在终端中输入:
    1. sudo apt-get install alsa-utils
    复制代码
    安装完成后输入aplay -l来查看当前的声卡设备,输入arecord -l来查看当前的录音设备。
    • 声卡播放设备
      树莓派上如果显示不出播放设备,应该是没有把声音模块加入内核,需要输入:
    1. sudo modprobe snd-bcm2835 #把声音模块加入内核
    复制代码
    • 录音设备
      树莓派不自带mic的需要插入外置录音设备,香蕉派自带mic就能直接看到录音设备了
    2. 测试单设备和录音和播放
    • 单录音(例:arecord -l中看到的是plughw:1,0 其他参数自行查用法)
    1. arecord -D plughw:1,0 -t wav -f cd -r 8000 ./test.wav
    复制代码
    在当前目录录音生成test.wav
    • 单播放
    1. aplay ./test.wav
    复制代码
    • 边录边播
    1. arecord -D plughw:1,0 -t wav -f cd -r 8000 | aplay
    复制代码
    得到期望的结果为录音和播放正常。
    3.测试一个设备录音,另一个设备播放
    输入nc -h看一下系统中是否已安装netcat,如果未安装,通过sudo apt-get install netcat进行安装。

    这里两台设备的ip分别为:
    • A设备:192.168.1.101
    • B设备:192.168.1.102

    第一种方式(延迟高):
    • 在A设备录音:
    1. arecord -D plughw:1,0 -t wav -f cd -r 8000 | nc -l 8888
    复制代码
    • 在B设备播放:
    1. nc 192.168.1.102 8888 | aplay
    复制代码
    得到期望的结果为在B设备能听到A设备的录音。但是实际测试延迟很高,本地环境有近5秒的延迟
    • 第二种方式(延迟低):
    • 在B设备设置播放监听:
    1. nc -l -p 8888 | aplay
    复制代码
    • 在A设备推送录音:
    1. arecord -D plughw:1,0 -t wav -f cd -r 8000 | nc 192.168.199.102 8888
    复制代码
    得到期望的结果为在B设备能听到A设备的录音。实际测试延迟为0.5秒
    4. 自动化控制
    只在一个设备里控制另一个设备进行录音或者播放。
    这里用python的paramiko库来实现这个测试。
    a. 首先安装pip:
    1. sudo apt-get install build-essential libssl-dev libffi-dev python-dev
    2. sudo easy_install pip
    复制代码
    b. 通过pip安装paramiko:
    1. sudo pip install paramiko
    复制代码
    • c. 写python控制程序:
    • c1. 实现A设备控制B设备录音,并在A设备中播放 (采用延迟低的方式) :
    1. #!/bin/python
    2. # -*- coding: utf-8 -*-
    3. import paramiko
    4. import os
    5. import threading

    6. #B端的IP
    7. ip='192.168.1.102'
    8. port = 22
    9. username = '用户名'
    10. password = '密码'

    11. def aplay(i):
    12.         os.system('nc -l -p 5555|aplay')
    13. #A端建立监听
    14. t1=threading.Thread(target=aplay,args=('',))
    15. t1.setDaemon(True)  #让线程在后台方式运行
    16. t1.start()

    17. #操作B端推送录音
    18. ssh = paramiko.SSHClient()
    19. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    20. ssh.connect(ip, port,username, password)
    21. cmd='arecord -D plughw:1,0 -t wav -f cd -r 8000 | nc 192.168.199.101 5555'
    22. stdin, stdout, stderr = ssh.exec_command(cmd)

    23. ssh.close()
    复制代码
    • c2. 实现A设备控制 B设备录音,并在A设备中播放,同时A设备录音在B设备中播放。(双向录播)
    c2.1先要在B端放置一个py以方便调用,位置如~/aplay-d.py,并加上可执行权限。内容如下:
    1. #!/bin/python
    2. # -*- coding: utf-8 -*-
    3. import paramiko
    4. import os
    5. import threading

    6. def aplay(i):
    7.         os.system('nc -l -p 6666|aplay')
    8. #建立监听
    9. t1=threading.Thread(target=aplay,args=('',))
    10. t1.setDaemon(True)  #让线程在后台方式运行
    11. t1.start()
    复制代码
    *c2.2 A端的代码: *
    1. #!/bin/python
    2. # -*- coding: utf-8 -*-
    3. import paramiko
    4. import os
    5. import threading

    6. #B端的IP
    7. ip='192.168.1.102'
    8. port = 22
    9. username = '用户名'
    10. password = '密码'

    11. def aplay(i):
    12.         os.system('nc -l -p 5555|aplay')
    13. def arecord(i):
    14.         os.system('arecord -D plughw:1,0 -f cd -t wav | nc 192.168.1.102 6666')
    15. #A端建立监听
    16. t1=threading.Thread(target=aplay,args=('',))
    17. t1.setDaemon(True)  #让线程在后台方式运行
    18. t1.start()


    19. #操作B端建立监听,并推送录音给A端
    20. ssh = paramiko.SSHClient()
    21. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    22. ssh.connect(ip, port,username, password)
    23. cmd1='python ~/aplay-d.py'  #在B端建立监听
    24. cmd2='arecord -D plughw:1,0 -t wav -f cd -r 8000 | nc 192.168.199.101 5555'  #将录音推送给A端
    25. stdin, stdout, stderr = ssh.exec_command(cmd1)
    26. stdin, stdout, stderr = ssh.exec_command(cmd2)


    27. #A端推送录音给B端
    28. t2=threading.Thread(target=arecord,args=('',))
    29. t2.setDaemon(True)  #让线程在后台方式运行
    30. t2.start()

    31. ssh.close()
    复制代码
    1. arecord -f cd -D "plughw:1" -d 10 | ssh yanisyu@192.168.1.102 aplay -f cd
    复制代码
    理论上这种方式也可行

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 00:42 , Processed in 0.110985 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.