🔊 使用 FFmpeg 實現 RTP 音頻傳輸與播放(Ubuntu)
在音視頻開發或遠程通信場景中,RTP(Real-time Transport Protocol) 是一種常用的實時音頻傳輸協議。本文將介紹如何使用 FFmpeg 在 Ubuntu 上實現從一臺主機發送音頻流,另一臺主機接收并播放音頻的完整流程。
🎯 目標:從
192.168.1.129
推送test.wav
音頻文件,通過 RTP 發送到192.168.1.137
,后者通過ffplay
播放。
🧩 環境準備
-
兩臺 Ubuntu 主機(或一臺主機多個終端模擬)
-
安裝 FFmpeg:
sudo apt install ffmpeg
-
音頻測試文件
test.wav
,要求:- 格式:
PCM 16-bit Big Endian
(對應 RTP 中的L16
) - 采樣率:
16000 Hz
- 聲道:
單聲道
- 格式:
可用以下命令確認:
ffmpeg -i test.wav
🖥? 推送端配置(192.168.1.129)
使用 ffmpeg
推送音頻流:
ffmpeg -re -stream_loop -1 -i test.wav \-acodec pcm_s16be -ar 16000 -ac 1 \-payload_type 97 \-f rtp rtp://192.168.1.137:5004
📌 說明:
pcm_s16be
:必須是 Big Endian,才能對應 RTP 中的L16
-payload_type 97
:動態負載編號,需與 SDP 一致5004
:目標主機 RTP 監聽端口
📥 接收端配置(192.168.1.137)
Step 1??:創建 SDP 文件
RTP 接收端需要通過 SDP 文件了解流的參數。
新建 audio.sdp
文件:
v=0
o=- 0 0 IN IP4 192.168.1.137
s=RTP Audio
c=IN IP4 192.168.1.137
t=0 0
m=audio 5004 RTP/AVP 97
a=rtpmap:97 L16/16000/1
🎯
97
為動態 payload 類型,與推送端匹配
🎯L16/16000/1
表示16-bit PCM / 16000Hz / Mono
Step 2??:使用 ffplay 播放
運行:
ffplay -protocol_whitelist file,udp,rtp -i audio.sdp
? 如果推送成功,你將聽到 test.wav
被循環播放。
? 常見問題排查
問題 | 原因與解決方法 |
---|---|
聽到「嘟嘟」噪音 | 使用 nc 監聽原始 RTP 數據 → 無法解碼 RTP header,不能作為播放器使用 |
沒有聲音,ffplay 無報錯 | 編碼格式不匹配,確保 pcm_s16be 與 SDP 中的 L16 一致 |
ffplay 顯示 0KB 緩沖 | 推送沒啟動 / IP 寫錯 / 防火墻阻擋 |
播放器顯示 Unable to receive RTP payload | SDP 文件不完整或 payload type 不一致 |
🔍 網絡連通性驗證技巧
在接收端檢查 UDP 流是否達到:
tcpdump -n -i any udp port 5004
確認有數據包進來再進一步排查音頻格式問題。
🧪 附加:麥克風實時采集推流(可選)
使用 arecord
實時采集麥克風音頻并通過 FFmpeg 發送:
arecord -D hw:0,0 -f S16_LE -c 1 -r 16000 -t raw | \
ffmpeg -f s16le -ar 16000 -ac 1 -i - \-acodec pcm_s16be -f rtp rtp://192.168.1.137:5004
此時接收端仍可使用前文 SDP 文件播放。
🎯 總結
通過本文方法,你可以成功實現:
? RTP 音頻流從一臺主機傳輸到另一臺
? 使用標準 SDP 描述流參數
? 基于 FFmpeg 與 ffplay 全流程構建測試環境
📂 附錄:完整腳本示例
🎧 播放器腳本 play_rtp.sh
#!/bin/bash
cat > audio.sdp <<EOF
v=0
o=- 0 0 IN IP4 192.168.1.137
s=RTP Audio
c=IN IP4 192.168.1.137
t=0 0
m=audio 5004 RTP/AVP 97
a=rtpmap:97 L16/16000/1
EOFffplay -protocol_whitelist file,udp,rtp -i audio.sdp
📤 推流腳本 send_rtp.sh
#!/bin/bash
ffmpeg -re -stream_loop -1 -i test.wav \-acodec pcm_s16be -ar 16000 -ac 1 \-payload_type 97 -f rtp rtp://192.168.1.137:5004
如有更高需求,例如 RTP over RTSP 或 WebRTC,可以進一步拓展。