我正在尝试实现一个基于 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
- 我不明白客户端是否没有收到任何流,或者它无法将 rtp 数据包写入“output.wav”文件。 (客户端问题还是服务器问题?)
在 old thread解释了一种解决方法。在服务器上可以运行 2 个 ffmpeg 实例: 一个由于 mpegts 而生成“tmp.ts”文件,另一个将“tmp.ts”作为输入并通过 rtp 进行流式传输。可以吗?
是否有更好的方法以尽可能低的延迟实现此客户端/服务器?
感谢您提供的任何帮助。
最佳答案
我用 .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
,因为在流式传输中使用它在捕获端不起作用。
输出是低质量的 8bit
、8kHz
mono
音频文件,但这正是您所要求的。
关于audio - 基于 RTP 协议(protocol)的 FFmpeg RTP_Mpegts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407760/