使用 FFmpeg 實現 RTP 音頻傳輸與播放

🔊 使用 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 payloadSDP 文件不完整或 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,可以進一步拓展。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92775.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 導出聯系人為 vCard(.vcf)

有時需要將聯系人數據導出為可共享的標準格式&#xff1a;vCard&#xff08;.vcf&#xff09;格式&#xff0c;可被系統直接導入通訊錄一、導出聯系人為 vCard&#xff08;.vcf&#xff09;? 支持字段我們支持導出的字段包括&#xff1a;姓名個人電話家庭電話工作電話郵箱備注…

大模型-bacth之chunked prefills

一、chunked prefills 1.1 chunked prefills核心思想 ORCA雖然很優秀&#xff0c;但是依然存在兩個問題&#xff1a;GPU利用率不高&#xff0c;流水線依然可能導致氣泡問題。 我們來看sarathi-serve做的一個實驗。左右兩圖分別刻畫了在不同的batch size下&#xff0c;prefil…

multiprocessing模塊使用方法(一)

結合Python代碼示例說明multiprocessing模塊的使用方法、Linux啟動命令、服務部署及真實應用場景&#xff1a;一、multiprocessing基礎用法 Python的multiprocessing模塊通過創建子進程實現并行計算&#xff0c;核心步驟如下&#xff08;引用&#xff09;&#xff1a;創建進程對…

vector如何判斷應該擴容?

std::vector 的擴容機制是 C 容器性能優化的一個核心點。它的判斷標準、行為特征和實現細節如下所示&#xff1a;? 一、vector 的核心結構 std::vector 內部維護三個指針&#xff1a; begin -> 指向數據起始位置 end -> 指向當前已使用的元素末尾&#xff08;size…

ICMP考點

在網絡工程師、運維工程師、安全工程師等崗位的面試中&#xff0c;??ICMP&#xff08;Internet Control Message Protocol&#xff0c;互聯網控制報文協議&#xff09;?? 是高頻必考知識點。ICMP作為IP協議的“輔助協議”&#xff0c;雖然不直接傳輸用戶數據&#xff0c;但…

服務器帶寬具體是指什么意思?

企業在選擇服務器租用或托管服務時&#xff0c;需要根據自身的業務情況來選擇合適的服務器帶寬&#xff0c;以便于能夠讓其業務持續穩定的運行工作&#xff0c;做到及時響應用戶的訪問請求&#xff0c;但是很多用戶對于帶寬一詞沒有過多的概念&#xff0c;本文就來探討一下服務…

CANape之ASAP2 Studio介紹

提到ECU的測量標定工具&#xff0c;很多小伙伴第一個想到的就是CANape。但其實&#xff0c;除了強大的測量標定功能之外&#xff0c;CANape還有很多其他功能。例如&#xff0c;CANape中集成的小工具——ASAP2 Studio&#xff0c;其支持對A2L文件&#xff08;由ASAM組織所定義&a…

【debug日記】MONAI SwinUNETR 目標檢測項目調試總結(AI自動總結)

MONAI SwinUNETR 目標檢測項目調試總結 日期: 2025年7月25日 項目: 使用 MONAI&#xff0c;以預訓練的 SwinUNETR 為骨干網絡&#xff0c;微調 RetinaNet 進行3D肺結節檢測。 本文檔旨在記錄在項目配置、數據處理和模型訓練過程中遇到的一系列問題及其解決方案&#xff0c;作為…

AI同傳領域,字節跳動與科大訊飛激戰進行時

在AI同聲傳譯市場&#xff0c;行業巨頭科大訊飛長期占據主導地位&#xff0c;但新晉玩家字節跳動正以迅猛姿態發起挑戰。7月24日&#xff0c;字節旗下火山引擎正式發布豆包同聲傳譯模型 Seed LiveInterpret 2.0&#xff0c;主打“人類級延遲”和“0樣本聲音復刻”&#xff0c;試…

[C++]string::substr

string substr (size_t pos 0, size_t len npos) const;substr() 主要功能是復制&#xff08;截取更準確&#xff09;子字符串&#xff0c;要求從指定位置 pos 開始&#xff0c;并具有指定的長度 len 。如果沒有指定長度或者超出了源字符串的長度&#xff0c;則子字符串將延續…

KNN算法:從原理到實戰全解析

一 算法介紹 K近鄰&#xff08;K-Nearest Neighbors, KNN&#xff09;是一種基于實例的監督學習算法&#xff0c;適用于分類和回歸任務。其核心思想是通過計算待預測樣本與訓練集中樣本的距離&#xff0c;選取距離最近的K個鄰居&#xff0c;根據這些鄰居的標簽進行投票&#xf…

醫療器械:DFEMA和PFEMA

在醫療器械行業&#xff0c;DFMEA&#xff08;Design FMEA&#xff0c;設計失效模式及影響分析&#xff09;和 PFMEA&#xff08;Process FMEA&#xff0c;過程失效模式及影響分析&#xff09;是核心的風險管理工具&#xff0c;旨在通過系統性識別潛在風險、分析影響并采取預防…

Qt 與 SQLite 嵌入式數據庫開發

Qt 與 SQLite 的結合是開發輕量級、跨平臺嵌入式數據庫應用的理想選擇。SQLite 作為一種零配置、文件型數據庫&#xff0c;無需獨立的服務器進程&#xff0c;非常適合集成到 Qt 應用中。本文將深入探討 Qt 與 SQLite 的嵌入式數據庫開發&#xff0c;包括基礎操作、高級特性、性…

Oracle OMF 非OMF 文件 轉化 不需要重建 file#.incarnation#

不需要重建就要重啟&#xff0c; alter database datafile move 就可以在線 file#.incarnation# 是 incarnation 不是dbid Goal How to convert non OMF files to OMF files with ASM storage Datafiles are not deleted at dropping tablespace if files are non-OMF and …

大型微服務項目:聽書——11 Redisson分布式布隆過濾器+Redisson分布式鎖改造專輯詳情接口

11 Redisson分布式布隆過濾器Redisson分布式鎖改造專輯詳情接口 11.1 緩存穿透解決方案&布隆過濾器 緩存穿透解決方案&#xff1a; 布隆過濾器&#xff1a; 布隆過濾器的使用&#xff1a; 11.2 遠程調用查詢所有的專輯id集合 修改&#xff1a; /*** 查詢所有的專輯…

STM32與ADS1220實現多通道數據采集的完整分析和源程序

以下是基于STM32與ADS1220實現多通道數據采集的完整分析和源程序,結合硬件設計、通信協議及軟件優化,提供高精度采集解決方案: 一、系統設計關鍵要點 ADS1220特性 24位高精度ΔΣ ADC,支持4路單端或2路差分輸入 集成PGA(增益1~128)、基準電壓和可編程電流源 多通道限制:…

百特搭AI低代碼平臺助力企業國際化業務敏捷拓展

在全球化浪潮下&#xff0c;企業揚帆出海或服務全球客戶已成為重要戰略。然而&#xff0c;開拓國際市場面臨多重挑戰&#xff1a;語言文化差異顯著、本地化需求復雜多變、智能化應用需求激增、各國IT基礎設施與合規要求各異。企業亟需一個能夠快速響應、靈活適應&#xff0c;并…

epoll_event數據結構及使用案例詳解

epoll_event 數據結構詳解 在 Linux 的 I/O 多路復用機制 epoll 中&#xff0c;epoll_event 是關鍵的數據結構&#xff0c;用于描述文件描述符&#xff08;fd&#xff09;上的事件和關聯數據。其定義在頭文件 <sys/epoll.h> 中&#xff1a; struct epoll_event {uint32_t…

C++11STL容器map和set簡單介紹

一、引言map和set底層結構比較復雜&#xff0c;我認為我們先談基本介紹再談C11&#xff0c;最后再談map和set底層以及map和set封裝。二、簡單介紹一下map和setmap和set底層都是紅黑樹&#xff0c;是二叉搜索樹的一種&#xff0c;查找非常快。不像數組、鏈表一樣一個一個對比&am…

Java線程基礎面試復習筆記

1. 線程與進程的區別進程是正在運行程序的實例&#xff0c;線程是進程中的執行單元。主要區別&#xff1a; 內存空間&#xff1a;不同進程使用不同的內存空間&#xff0c;同一進程下的線程共享內存空間資源開銷&#xff1a;線程更輕量&#xff0c;線程上下文切換成本比進程上下…