我在一家远程医疗公司工作,为了向医生提供这些设备的实时信息,我们正在使用联网医疗设备,这些设备由一位训练有素的卫生专业人员使用。
这些设备与视频和音频一起工作。现在,我们使用的是对等连接(所以是对等连接),但我们试图摆脱这种情况,拥有一个RPI,他唯一的工作是传输数据(比如流媒体音频和视频)。
由于设备应该与医生的指示一起使用,所以我们需要医生实时接收数据。
但是我们也需要受过训练的健康专家来看看他在做什么(所以我们需要从设备中得到当地的饲料)。
我们如何捕捉音频和视频?
我们使用ffmpeg与一个go客户端,它负责管理ffmpeg客户端并将它们流到SRS服务器。这是可行的,但我们有2-3秒的延迟时,流数据。(前端来自ffmpeg和flv的rtmp)
ffmpeg设置:
("ffmpeg", "-f", "v4l2", `-i`, "*/video0", "-f", "flv", "-vcodec", "libx264", "-x264opts", "keyint=15", "-preset", "ultrafast", "-tune", "zerolatency", "-fflags", "nobuffer", "-b:a", "160k", "-threads", "0", "-g", "0", "rtmp://srs-url")
我的问题
流模式
数据交换和用例流:
注意:护士和医生使用
HTTP-FLV
来播放实时流,以降低延迟。
发布于 2022-04-24 00:02:43
在您的场景中,延迟由两个部分介绍:
FFmpeg in RPI
的音频/视频编码。RPI中的FFmpeg
我注意到您已经设置了一些arg,您可以看到ffmpeg --help full
为检查这些参数提供了充分的帮助。
keyint
等于-g
,所以请删除keyint
,并设置fps(-r
)。请设置将gop设置为1s或15 gop的-r 15 -g 15
:
-g <int> set the group of picture (GOP) size (from INT_MIN to INT_MAX) (default 12)
-r rate set frame rate (Hz value, fraction or abbreviation)
x264 options preset
和tune
对于低延迟非常有用,但也需要设置另一个profile
来关闭bframe。为了降低延迟,请设置为-profile baseline -preset ultrafast -tune zerolatency
:
-preset <string> Set the encoding preset (cf. x264 --fullhelp) (default "medium")
-tune <string> Tune the encoding params (cf. x264 --fullhelp)
-profile <string> Set profile restrictions (cf. x264 --fullhelp)
您设置了一个错误的-fflags nobuffer
,它用于解码器(播放器),相反,您应该使用-fflags flush_packets
作为编码器:
-fflags <flags> (default autobsf)
flush_packets E.......... reduce the latency by flushing out packets immediately
nobuffer .D......... reduce the latency introduced by optional buffering
请注意,
E
表示编码器,而D
表示解码器/播放机。
FFmpeg的cli,请隐蔽到您的params:
-vcodec libx264 \
-r 15 -g 15 \
-profile baseline -preset ultrafast -tune zerolatency \
-fflags flush_packets
但是,我认为这些设置只在您更改播放机设置时才有效,因为瓶颈现在在播放机中(延迟1~3s)。
播放器
对于HTTP,请对SRS服务器使用conf/realtime.conf
,并使用ffplay
测试延迟:
ffplay -fflags nobuffer -flags low_delay -i "http://your_server/live/stream.flv"
我认为延迟应该是<1s,好于H5播放器,后者使用MSE。你可以比较它们的潜伏期。
但是,您不能让用户使用ffplay,它只是用于开发的测试。所以我们必须使用一个低延迟的H5播放器,即WebRTC。
请用conf/rtmp2rtc.conf
配置SRS,它允许您在低延迟时间内通过RTMP发布FFmpeg,并按WebRTC播放流。
启动SRS时,有一个WebRTC播放器,例如:player.html,请阅读更多关于这里的WebRTC信息。
网址非常类似:
rtmp://ip/live/livestream
http://ip/live/livestream.flv
http://ip/live/livestream.m3u8
webrtc://ip/live/livestream
如果使用WebRTC播放器,则延迟应该是~500ms
,并且非常稳定。
https://stackoverflow.com/questions/71979139
复制相似问题