使用 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 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,可以进一步拓展。