兩個樹莓派(或香蕉派)之間的音頻直播測試

一、場景介紹及準備工作

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 理論上這種方式也可行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容