audio - 基于 RTP 协议(protocol)的 FFmpeg RTP_Mpegts

标签 audio ffmpeg udp rtp mpeg2-ts

我正在尝试实现一个基于 FFmpeg 的客户端/服务器应用程序。不幸的是,RTP_MPEGTS 没有记录在官方 FFmpeg Documentation - Formats 中。 。 无论如何,我从中找到了灵感old thread .

服务器端

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

ffmpeg -f avfoundation -i none:2  -ar 8000 -acodec pcm_u8 -ac 1 -f rtp_mpegts rtp://127.0.0.1:41954
  • 这有效,但启动时会发出警报“[mpegts @ 0x7fda13024600] 帧大小未设置”

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

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

ffmpeg -i rtp://127.0.0.1:41954 -vcodec copy -y "output.wav"
  • 我正在使用 -vcodec copy,因为我已经在另一个 -acodec copy 不起作用的 rtp 流中验证了它。
  • 这被卡住了,当使用 Ctrl+C 快捷键关闭时,它会打印:

    Input #0, rtp, from 'rtp://127.0.0.1:41954':
    Duration: N/A, start: 8.956122, bitrate: N/A
    Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0: Data: bin_data ([6][0][0][0] / 0x0006)
    Output #0, wav, to 'output.wav':
    Output file #0 does not contain any stream
    

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

  3. 是否有更好的方法以尽可能低的延迟实现此客户端/服务器?


感谢您提供的任何帮助。

最佳答案

我用 .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,因为在流式传输中使用它在捕获端不起作用。

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

关于audio - 基于 RTP 协议(protocol)的 FFmpeg RTP_Mpegts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407760/

相关文章:

python - UDP 打洞在非对称 NAT 上失败

kubernetes - 无法在 ingress-nginx-controller 上配置 UDP

android - 在播放音乐时通过 android 中的蓝牙耳机进行语音识别

ffmpeg - 启用音频时帧速率慢 x11

ffmpeg mp3 转换失败

video - 如何使用ffmpeg分块下载m3u8?

sockets - 套接字编程,如果我写的数据超过一个 TCP/UDP 数据包会发生什么?

audio - 如何使用Erlang播放AIFF声音文件?

通过 NFC 启用的 Android 录音机

iphone - 如何检查音乐在AudioQueue中是播放还是暂停