在Ubuntu上使用FFmpeg实现RTP音频传输与播放的完整流程

 更新时间:2025年07月28日 10:20:14   作者:is0815  
在音视频开发或远程通信场景中,RTP是一种常用的实时音频传输协议,本文将介绍如何使用 FFmpeg 在 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
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音频传输与播放的资料请关注脚本之家其它相关文章!

相关文章

  • 详解虚拟机下CentOS 6.5配置IP地址的三种方法

    详解虚拟机下CentOS 6.5配置IP地址的三种方法

    本篇文章主要介绍了虚拟机下CentOS 6.5配置IP地址的三种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • linux如何编写同步文件的脚本

    linux如何编写同步文件的脚本

    这篇文章主要介绍了linux如何编写同步文件的脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Linux系统配置(服务控制)详细介绍

    Linux系统配置(服务控制)详细介绍

    大家好,本篇文章主要讲的是Linux系统配置(服务控制)详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • linux服务器磁盘扩容的方法(图)

    linux服务器磁盘扩容的方法(图)

    如果你的linux服务器磁盘不够用了,那就需要给磁盘扩容了,下面我们介绍一下linux服务器磁盘扩容的方法,大家参考使用吧
    2014-01-01
  • Apache简介及安全配置方案

    Apache简介及安全配置方案

    Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
    2014-08-08
  • Linux gnome桌面环境切换KDE_Plasma实现过程

    Linux gnome桌面环境切换KDE_Plasma实现过程

    这篇文章主要介绍了Linux gnome桌面环境切换KDE_Plasma实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-01-01
  • Linux服务器VPS的Windows DD包详细的制作教程

    Linux服务器VPS的Windows DD包详细的制作教程

    这里就说下Windows dd包的制作过程,虽然网上很多这样的dd包,但对于一些来历不明的,也会有点不放心,所以我们有时间的话可以自己定制一个
    2022-08-08
  • PHP脚本内存泄露导致Apache频繁宕机解决方法

    PHP脚本内存泄露导致Apache频繁宕机解决方法

    这篇文章主要介绍了PHP脚本内存泄露导致Apache频繁宕机解决方法,本文的原因是因为MaxRequestsPerChild参数没有配置正确,配置MaxRequestsPerChild后解决了本文中的问题,需要的朋友可以参考下
    2014-09-09
  • 关于VPS内存不足的一些说明和解决办法

    关于VPS内存不足的一些说明和解决办法

    关于VPS内存不足的一些说明和解决办法,需要的朋友可以参考下。
    2011-11-11
  • Linux如何安装JDK 17

    Linux如何安装JDK 17

    本文详细介绍了在Linux系统上安装JDK17的步骤,包括下载安装包、创建安装目录、上传与解压、配置环境变量、使环境变量生效以及验证安装
    2025-02-02

最新评论