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
- 这有效,但在启动时它会提醒“[mpegts @ 0x7fda13024600] 未设置帧大小”
客户端(在同一台机器上)
(1)接收rtp音频流输入(2)写入文件或播放。
ffmpeg -i rtp://127.0.0.1:41954 -vcodec copy -y "output.wav"
- 我正在使用
-vcodec copy
,因为我已经在另一个 rtp 流中验证了它,其中 -acodec copy
不起作用。
这卡住了,在使用 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 流式传输。可能吗?
是否有更好的方法以尽可能低的延迟实现此 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 中使用它在捕获方面不起作用。
输出的是低质量 8bit
、8kHz
mono
音频文件,但这正是您所要求的。
我正在尝试实现一个基于 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
- 这有效,但在启动时它会提醒“[mpegts @ 0x7fda13024600] 未设置帧大小”
客户端(在同一台机器上)
(1)接收rtp音频流输入(2)写入文件或播放。
ffmpeg -i rtp://127.0.0.1:41954 -vcodec copy -y "output.wav"
- 我正在使用
-vcodec copy
,因为我已经在另一个 rtp 流中验证了它,其中-acodec copy
不起作用。 这卡住了,在使用 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 流式传输。可能吗?
是否有更好的方法以尽可能低的延迟实现此 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 中使用它在捕获方面不起作用。
输出的是低质量 8bit
、8kHz
mono
音频文件,但这正是您所要求的。