引言
在音视频开发或远程通信场景中,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 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,可以进一步拓展。
以上就是在ubuntu上使用ffmpeg实现rtp音频传输与播放的完整流程的详细内容,更多关于ubuntu ffmpeg rtp音频传输与播放的资料请关注代码网其它相关文章!
发表评论