在Ubuntu上使用FFmpeg實(shí)現(xiàn)RTP音頻傳輸與播放的完整流程
引言
在音視頻開發(fā)或遠(yuǎn)程通信場景中,RTP(Real-time Transport Protocol) 是一種常用的實(shí)時音頻傳輸協(xié)議。本文將介紹如何使用 FFmpeg 在 Ubuntu 上實(shí)現(xiàn)從一臺主機(jī)發(fā)送音頻流,另一臺主機(jī)接收并播放音頻的完整流程。
目標(biāo):從 192.168.1.129 推送 test.wav 音頻文件,通過 RTP 發(fā)送到 192.168.1.137,后者通過 ffplay 播放。
環(huán)境準(zhǔn)備
兩臺 Ubuntu 主機(jī)(或一臺主機(jī)多個終端模擬)
安裝 FFmpeg:
sudo apt install ffmpeg
音頻測試文件 test.wav,要求:
- 格式:
PCM 16-bit Big Endian(對應(yīng) RTP 中的L16) - 采樣率:
16000 Hz - 聲道:
單聲道
可用以下命令確認(rèn):
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,才能對應(yīng) RTP 中的 L16
- -payload_type 97:動態(tài)負(fù)載編號,需與 SDP 一致
- 5004:目標(biāo)主機(jī) RTP 監(jiān)聽端口
接收端配置(192.168.1.137)
Step 1:創(chuàng)建 SDP 文件
RTP 接收端需要通過 SDP 文件了解流的參數(shù)。
新建 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 為動態(tài) payload 類型,與推送端匹配
L16/16000/1 表示 16-bit PCM / 16000Hz / Mono
Step 2:使用 ffplay 播放
運(yùn)行:
ffplay -protocol_whitelist file,udp,rtp -i audio.sdp
如果推送成功,你將聽到 test.wav 被循環(huán)播放。
常見問題排查
| 問題 | 原因與解決方法 |
|---|---|
| 聽到「嘟嘟」噪音 | 使用 nc 監(jiān)聽原始 RTP 數(shù)據(jù) → 無法解碼 RTP header,不能作為播放器使用 |
| 沒有聲音,ffplay 無報錯 | 編碼格式不匹配,確保 pcm_s16be 與 SDP 中的 L16 一致 |
| ffplay 顯示 0KB 緩沖 | 推送沒啟動 / IP 寫錯 / 防火墻阻擋 |
| 播放器顯示 Unable to receive RTP payload | SDP 文件不完整或 payload type 不一致 |
網(wǎng)絡(luò)連通性驗(yàn)證技巧
在接收端檢查 UDP 流是否達(dá)到:
tcpdump -n -i any udp port 5004
確認(rèn)有數(shù)據(jù)包進(jìn)來再進(jìn)一步排查音頻格式問題。
附加:麥克風(fēng)實(shí)時采集推流(可選)
使用 arecord 實(shí)時采集麥克風(fēng)音頻并通過 FFmpeg 發(fā)送:
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 文件播放。
總結(jié)
通過本文方法,你可以成功實(shí)現(xiàn):
- RTP 音頻流從一臺主機(jī)傳輸?shù)搅硪慌_
- 使用標(biāo)準(zhǔn) SDP 描述流參數(shù)
- 基于 FFmpeg 與 ffplay 全流程構(gòu)建測試環(huán)境
附錄:完整腳本示例
播放器腳本 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 EOF ffplay -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,可以進(jìn)一步拓展。
以上就是在Ubuntu上使用FFmpeg實(shí)現(xiàn)RTP音頻傳輸與播放的完整流程的詳細(xì)內(nèi)容,更多關(guān)于Ubuntu FFmpeg RTP音頻傳輸與播放的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解虛擬機(jī)下CentOS 6.5配置IP地址的三種方法
本篇文章主要介紹了虛擬機(jī)下CentOS 6.5配置IP地址的三種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
Linux系統(tǒng)配置(服務(wù)控制)詳細(xì)介紹
大家好,本篇文章主要講的是Linux系統(tǒng)配置(服務(wù)控制)詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Linux gnome桌面環(huán)境切換KDE_Plasma實(shí)現(xiàn)過程
這篇文章主要介紹了Linux gnome桌面環(huán)境切換KDE_Plasma實(shí)現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2026-01-01
Linux服務(wù)器VPS的Windows?DD包詳細(xì)的制作教程
這里就說下Windows?dd包的制作過程,雖然網(wǎng)上很多這樣的dd包,但對于一些來歷不明的,也會有點(diǎn)不放心,所以我們有時間的話可以自己定制一個2022-08-08
PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法
這篇文章主要介紹了PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法,本文的原因是因?yàn)镸axRequestsPerChild參數(shù)沒有配置正確,配置MaxRequestsPerChild后解決了本文中的問題,需要的朋友可以參考下2014-09-09
關(guān)于VPS內(nèi)存不足的一些說明和解決辦法
關(guān)于VPS內(nèi)存不足的一些說明和解決辦法,需要的朋友可以參考下。2011-11-11

