使用 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;线程上下文切换成本比进程上下…