当前位置: 首页 > news >正文

使用 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.lryc.cn/news/599541.html

相关文章:

  • 视频质量检测效率提升28%!陌讯多模态融合方案在流媒体场景的技术实践
  • JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发
  • Spring 生态创新应用:现代架构与前沿技术实践
  • C++常见面试题之一
  • [NLP]UPF基本语法及其在 native low power verification中的典型流程
  • 【JavaEE】Spring Web MVC(上)
  • 焊接机器人节能先锋
  • 协作机器人掀起工厂革命:码垛场景如何用数据重塑制造业命脉?
  • MCP (Model Context Protocol) 与 HTTP API:大模型时代的通信新范式
  • 滚珠导轨:手术机器人与影像设备的精密支撑
  • 草木知音的认知进化:Deepoc具身智能如何让除草机器人读懂大地密语
  • [特殊字符] VLA 如何“绕过”手眼标定?—— 当机器人学会了“看一眼就动手”
  • [python][flask]flask蓝图使用方法
  • [python][flask]flask中session管理
  • 从 “能打” 到 “顶尖”:DeepSeek-V3 后训练拆解,微调 + 强化学习如何让大模型脱胎换骨?
  • 【js】Proxy学习笔记
  • spring boot项目使用Spring Security加密
  • HTML 常用标签速查表
  • 【STM32】FreeRTOS任务的挂起与解挂(四)
  • ServletRegistrationBean相关知识点
  • IIC协议详解与项目注意事项
  • Ant Design 结合 React 参考 Vben 逻辑实现的描述列表组件封装实践
  • C#模拟pacs系统接收并解析影像设备数据(DICOM文件解析)
  • 【unitrix】 6.16 非负整数类型( TUnsigned )特质(t_unsingned.rs)
  • Docker镜像导入解析:docker import vs docker load
  • 2025最新蜘蛛池在百度SEO中的应用
  • vue2+node+express+MongoDB项目安装启动启动
  • ELK Stack技术栈
  • 前端基础知识Vue系列 - 27(Vue项目中如何解决跨域)
  • 养老服务行业怎么解决采购管理难题?