开发者

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

目录
  • 引言
  • 环境准备
  • 推送端配置(192.168.1.129)
  • 接收端配置(192.168.1.137)
    • Step 1:创建 SDP 文件
    • Step 2:使用 ffplay 播放
  • 常见问题排查
    • 网络连通性验证技巧
      • 附加:麦克风实时采集推流(可选)
        • 总结
          • 附录:完整脚本示例
            • 播放器脚本 play_rtp.sh
            • 推流脚本 send_rtp.sh

          引言

          在音视频开发或远程通信场景中,RTP(Real-time Transport Protocol) 是一种常用的实时音频传输协议。本文将介绍如何使用 FFmpeg 在 Ubuntu 上实现从一台主机发送音频流,另一台主机接python收并播放音频的完整流程。

          目标:从 192.168.1.129 推送 test.wav 音频文件,通过 RTP 发送到 192.168.1.137,后者通过 ffplay 播放。

          环境准备

          两台 Ubuntu 主机(或一台主机多个终端模拟)

          安装 FFmpeg:

          sudo apt install ffmpeg
          

          音频测试文件 test.wav,要求:

          • 格式:PCM 16-bit Big Endjsian(对应 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:使用 fjavascriptfplay 播放

          运行:

          ffplay -protocol_whitelist file,udp,rtp -i audio.sdp
          

          如果推送成功,你将听到 test.wav 被循环播放。

          常见问题排查

          问题原因与解决方法
          听到「嘟嘟」噪音使用 nc 监听原始 RTP 数据 → 无法解码 RTP header,不能作为播放器使用
          没有声音,ffplay 无报错编码格式不匹配,确保 pcm_s16be 与 SDP 中的&编程nbsp;L16 一致
          ffplay 显示 0KB 缓冲推送没启动 / IP 写错 / 防火墙阻挡
          播放器显示 Unable to receive RTP payloadSDP 文件不完整或 payload type 不一致

          网络连通性验证技巧

          在接收端检查 UDP 流是否达到:Uwvehnwq

          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音频传输与播放的资料请关注编程客栈(www.devze.com)其它相关文章!

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新运维

          运维排行榜