FFmpeg RTP_Mpegts 基于 RTP 协议

FFmpeg RTP_Mpegts over RTP protocol

我正在尝试实现一个基于 FFmpeg 的 client/server 应用程序。不幸的是 RTP_MPEGTS 没有在官方 FFmpeg Documentation - Formats 中记录。 不管怎样,我从这个 old thread.

中找到了灵感

服务器端

(1) 捕捉麦克风音频作为输入。 (2) 将其编码为 pcm 8khz 单声道 (3) 通过 rtp 协议将其作为 RTP_MPEGTS 格式在本地发送。

ffmpeg -f avfoundation -i none:2  -ar 8000 -acodec pcm_u8 -ac 1 -f rtp_mpegts rtp://127.0.0.1:41954

客户端(在同一台机器上)

(1)接收rtp音频流输入(2)写入文件或播放。

ffmpeg -i rtp://127.0.0.1:41954 -vcodec copy -y "output.wav"

  1. 我不明白客户端是否没有收到任何流,或者它无法将 rtp 数据包写入 "output.wav" 文件。 (客户端或服务器问题?)
  2. old thread 中解释了一种解决方法。在服务器上可以 运行 2 ffmpeg 实例: 由于 mpegts,一个生成 "tmp.ts" 文件,另一个将 "tmp.ts" 作为输入并通过 rtp 流式传输。可能吗?

  3. 是否有更好的方法以尽可能低的延迟实现此 client/server?


感谢您提供的任何帮助。

我用 .aac 文件对此进行了测试,它有效:

流媒体:

(注意我使用了多播地址。

但如果您在同一台机器上测试流式传输和接收,您可能会使用 127.0.0.1 作为本地主机的环回地址。)

ffmpeg -f lavfi -i testsrc \
-stream_loop -1 -re -i "music.aac" \
-map 0:v -map 1:a \
-ar 8000 -ac 1 \
-f rtp_mpegts "rtp://239.1.1.9:1234"

您需要 rtp_mpegts 混合器的视频源。我用 lavfi.

创建了一个

我使用 -stream_loop 为我的测试永远循环 .aac 文件。你不需要用麦克风作为输入。

捕获流:

ffmpeg -y -i "rtp://239.1.1.9:1234" -c:a pcm_u8 "captured_stream.wav"

我在捕获时故意使用 -c:a pcm_u8,因为在 Streaming 中使用它在捕获方面不起作用。

输出的是低质量 8bit8kHz mono 音频文件,但这正是您所要求的。