两个树莓派(或香蕉派)之间的音频直播测试

一、场景介绍及准备工作

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

在终端中输入:

sudo apt-get install alsa-utils

安装完成后输入aplay -l来查看当前的声卡设备,输入arecord -l来查看当前的录音设备。

  • 声卡播放设备
    树莓派上如果显示不出播放设备,应该是没有把声音模块加入内核,需要输入:
 sudo modprobe snd-bcm2835 #把声音模块加入内核
  • 录音设备
    树莓派不自带mic的需要插入外置录音设备,香蕉派自带mic就能直接看到录音设备了

2. 测试单设备和录音和播放

  • 单录音(例:arecord -l中看到的是plughw:1,0 其他参数自行查用法)
arecord -D plughw:1,0 -t wav -f cd -r 8000 ./test.wav

在当前目录录音生成test.wav

  • 单播放
aplay ./test.wav
  • 边录边播
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设备录音:
arecord -D plughw:1,0 -t wav -f cd -r 8000 | nc -l 8888
  • 在B设备播放:
nc 192.168.1.102 8888 | aplay

得到期望的结果为在B设备能听到A设备的录音。但是实际测试延迟很高,本地环境有近5秒的延迟

  • 第二种方式(延迟低):

  • 在B设备设置播放监听:
nc -l -p 8888 | aplay
  • 在A设备推送录音:
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:

sudo apt-get install build-essential libssl-dev libffi-dev python-dev
sudo easy_install pip
  • b. 通过pip安装paramiko:

sudo pip install paramiko
  • c. 写python控制程序:

  • c1. 实现A设备控制B设备录音,并在A设备中播放 (采用延迟低的方式) :
#!/bin/python
# -*- coding: utf-8 -*-
import paramiko
import os
import threading

#B端的IP
ip='192.168.1.102'
port = 22
username = '用户名'
password = '密码'

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

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

ssh.close()
  • c2. 实现A设备控制 B设备录音,并在A设备中播放,同时A设备录音在B设备中播放。(双向录播)

c2.1先要在B端放置一个py以方便调用,位置如~/aplay-d.py,并加上可执行权限。内容如下:

#!/bin/python
# -*- coding: utf-8 -*-
import paramiko
import os
import threading

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

*c2.2 A端的代码: *

#!/bin/python
# -*- coding: utf-8 -*-
import paramiko
import os
import threading

#B端的IP
ip='192.168.1.102'
port = 22
username = '用户名'
password = '密码'

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


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


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

ssh.close()

arecord -f cd -D "plughw:1" -d 10 | ssh yanisyu@192.168.1.102 aplay -f cd 理论上这种方式也可行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容