使用網路傳送音頻

... 2021-04-23
  • Comm
About 3 min

# 使用網路傳送音頻

這個小單元要利用網路來傳送音頻資料。一般網路傳送資料多使用 TCP 或 UDP,TCP 本身具有傳輸錯誤控制的能力,如果接收到的封包偵測到錯誤,會請傳送端重傳,因此可以保證傳輸資料的正確性。UDP 本身則不具傳輸錯誤控制的能力,因此傳送資料時,可能較 TCP 來得快速,但不保證所傳的資料都是正確的。由於 TCP 傳送時,如果資料重傳,將會增加封包傳送的延遲時間,這對於即時的語音或影像的通訊來說並不適合,因此大多數語音或影像的通訊,除了控制部份採用 TCP 之外,大部份資料的傳送,則是採用 UDP 來進行傳送。

本單元主要利用 GNU Radio 來示範網路資料的傳送,將忽略 TCP 控制的部份,只使用 UDP 來傳送及接收資料。

# 傳送端

從程式庫模組中選擇 Signal Source, Throttle, QT GUI Time Sink, 及 UDP Sink 模組。將四個模組如下圖方式連接在一起:

這邊四個模組的參數依次如下:

  • Signal Source: 把 Output Type 改成 float。
  • Throttle: 全部用預設值。
  • QT GUI Sink: 全部用預設值。
  • UDP Sink: 只改以下兩個參數
    • Destination IP Address 改成 127.0.0.1,代表本機
    • Destination Port 改成 12345

注意 UDP Sink 的參數,表示資料將會傳送到本機的 UDP Port 12345。另外我們額外接一個 QT GUI Sink,主要是用來觀察傳送的訊號。

接好之後,將檔案存檔,產出模型並執行,應該會看到輸出的弦波圖形,如下圖所示:

# 接收端

從程式庫模組中選擇 UDP Source, QT GUI Time Sink, 及 Audio Sink 模組。將三個模組如下圖方式連接在一起:

這邊三個模組的參數依次如下:

  • UDP Source: 只改以下兩個參數
    • IP Address 改成 0.0.0.0,代表來自任何 IP 位置皆可
    • Port 改成 12345,表示從 Port 12345 接收資料。
  • QT GUI Sink: 全部用預設值。
  • Audio Sink: 全部用預設值。

注意 UDP Source 的參數,表示會接收從任何網址傳到本機的 UDP Port 12345 的資料。另外 QT GUI Sink 可用來觀察接收到的訊號。

接好之後,將檔案存檔,產出模型並執行(先執行傳送端,再執行接收端),應該會看到與傳送端相同的弦波圖形,另外也會聽到音頻的聲音。

如果執行的時候,發現左下的視窗出現 aUaUaU... 的訊息,同時音頻有間斷的現象,表示資料無法 100% 即時傳送。在這種情況下,可以試著 Disable 掉傳送端或接收端的 QT GUI Sink,看情況是否有所改善。如果還是不行的話,就把接收端的 Audio Sink 拿掉,只使用 QT GUI Sink 觀察波形就好。


練習

  1. 試著加上一個 Range 元件,讓傳送的訊號頻率可以在執行時進行調整,並觀察接收端是否會跟著進行改變。
  2. 試著修改傳送端的 UDP Sink 參數,把資料傳到另一台電腦。另外把接收端搬到另一台電腦上執行,看是否可以正確接收到資料。
  3. 如果兩台電腦的資料傳送成功,試著加入第三台電腦,看能否正確傳送資料。(此時中間的電腦接收到第一台電腦的資料之後,其輸出應該為 UDP Sink,也就是用來轉傳到第三台電腦的意思。)這個方式可以不斷擴充,可加入更多的電腦。
Last update: April 23, 2021 23:18
Contributors: Jia-Yin