chakokuのブログ(rev4)

日々のごった煮ブログです

BeagleBoneで音声(MP3)をストリーミング配信させる

アマチュア無線機をリモート運用できるようにと、以下の組み合わせでリグを制御できるように取り組んでいた。

      居間      |    屋根裏部屋  
[PC]<----LAN----|------->[BeagleBone]<--Serial-->[iCOM]
                |            ||(USB)
                |       [SoundBlaster]<-Analog---[MIC]

リグの操作(周波数切り替えとか)は、居間のパソコンからBeagleBone(以降、BBW)のicomアプリ経由で、シリアル入出力を使ってiCOMを操作する。リグの受信音声はMICで拾って、SoundBlasterでデジタル化して、BBWでストリーミングさせるという方法。これだと音は聞こえても発信(発話?)できないのでは?という疑問もあろうかと思いますが、、自分はCWなので、電鍵の信号が送れればOK。さらに言うと、、今は受信の練習中なので、打つレベルではないので発信することがない。

前回の取り組みでBeagleBoneからのシリアル出力はなんとかなったが、どうしても音声のストリーミングがうまくいかなかった。試行錯誤した結果、BBW側でVideoLAN(VLC)を動かしてストリーミングサーバとし、PC側でVLCを走らせてクライアントとしてサーバに接続して再生する方法とした。左の写真は、BeagleBoneとSoundBlasterをUSBで接続して、マイクを取り付けたところ。

BBW側の起動コマンドは以下。試行錯誤してたまたま動いた組み合わせ


debian@beaglebone:~$ cvlc -vvv alsa://hw:1,0 --sout '#transcode{acodec=mp3,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8085/}'
ご参考にオプション類を説明:
alsa://hw:1,0はALSAドライバ経由でSoundBalsterから音声を取得、hw:1,0はSoundBlasterが(カード:1、デバイス:0)で認識されているのでそのように指定(下記補足参照)、transcodeはMP3にフォーマット変換する仕様を指定、rtpはストリーミングプロトコルで配信、rtsp://:8085と指定することで、BBW側がサーバとなって、8085ポートで待ち受ける。
なお、普通のユーザIDで走らせるとALSA経由で録音デバイス(SoundBlaster)が見えない状況になるので、ある程度高い権限が与えられている(ようである)debianユーザでvlcを起動しています。rootだとデバイスが問題なく見えるけど、今度はvlcが権限強すぎると警告を出して起動されない。

PC側はVLCGUI付きで動作させて、以下で受信 (10.0.128.160はBBWに割り当てられたIP)


rtsp://10.0.128.160:8085/

今分かっている問題:
ストリーミングは遅延が発生するので、リモート運用でチューニングする際、受信できる音が5秒ぐらい遅れるので、ダイヤルを回しすぎてしまいそうだ。DXクラスタ?とかで特定の局を周波数して受信するのなら問題ないと思いますが。

■補足(録音デバイスの確認方法)
arecord -l を実行すると、認識されている録音デバイスとIDが表示される

debian@beaglebone:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: U0x41e0x30d3 [USB Device 0x41e:0x30d3], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

■参考になった情報
vlcの起動オプション例
http://ubuntuforums.org/showthread.php?t=1544946