使用网络摄像头通过 ffmpeg 实现极低延迟的流媒体

问题描述 投票:0回答:2

我正在尝试配置 ffmpeg 以使用网络摄像头进行实时视频流。我使用的ffmpeg编码器命令如下

ffmpeg -f v4l2 -input_format yuyv422 -s 640x480 -i /dev/video0 -c:v libx264 -profile:v baseline -trellis 0 -subq 1 -level 32 -preset superfast -tune zerolatency -me_method epzs -crf 30 -threads 0 -bufsize 1 -refs 4 -coder 0 -b_strategy 0 -bf 0 -sc_threshold 0 -x264-params vbv-maxrate=2000:slice-max-size=1500:keyint=30:min-keyint=10: -pix_fmt yuv420p -an -f mpegts udp://192.168.1.8:5001

用于显示视频源的 ffplay 命令是,

ffplay -analyzeduration 1 -fflags -nobuffer -i udp://192.168.1.8:5001

但是,我在视频流中遇到了 0.5 - 1.0 秒的延迟。有没有办法将其减少到小于 100 毫秒。此外,当我用 x11grab 的屏幕捕获替换 v4l2 相机捕获时,流几乎是实时的,我没有遇到明显的延迟。此外,将编码器从 x264 更改为 mpeg2 对延迟没有影响。此外,来自 ffmpeg 的统计数据显示编码器以 30fps 的速率执行,我相信这表明编码是实时的。这使得我所经历的延误只有一个原因。

  • 在网络摄像头中进行视频捕获期间使用 v4l2 时,缓冲区是否存在明显延迟?
  • 我认为在这种情况下传输延迟不起作用,因为在相同条件下使用屏幕捕获时我没有看到任何延迟。
  • 这个延迟可以进一步减少吗?有人可以想到使用不同的编码器配置来代替我一直使用的编码器配置吗?
ffmpeg video-streaming live-streaming video-encoding libx264
2个回答
0
投票

我在 odroid spc 和 windows pc 之间设置低延迟视频流系统时也遇到了很多问题。最后我找到了最大大约 500 毫秒的设置。 1秒延迟。

设置:odroid xu4 上的 ffserver 和 ubuntu 18.04,通过 wifi dongle 连接到网络。 Windows 10 PC 位于同一 wifi 网络中,从 odroid 进行流式传输。

我在我的 odroid 上运行以下 ffserver 配置(/etc/ffserver.conf)

HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxClients 1000
MaxBandwidth 10000

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 50M
ACL allow 127.0.0.1
ACL allow localhost
</Feed>

<Stream test1.asf>
Format asf
Feed feed1.ffm
VideoFrameRate 30
VideoSize 640x480
VideoBitRate 600 
#VideoBufferSize 400
VideoQMin 1
VideoQMax 20
NoAudio
ACL allow 127.0.0.1
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

<Stream stat.html>
Format status
ACL allow 127.0.0.1
ACL allow localhost
</Stream>

并使用

在 odroid 上启动相机流
ffserver -f /etc/ffserver.conf & ffmpeg -f v4l2 -s 640x480 -r 15 -i /dev/video0 -vcodec libx265 -threads 2 -tune zerolatency http://localhost:8090/feed1.ffm

在我的 Windows PC 上,我尝试了多种设置来获得低延迟。使用 VLC-Player 我无法管理低于 8 到 10 秒的任何内容。 使用以下 ffplay 命令,我得到了大约 500 毫秒的延迟:

ffplay -fflags -nobuffer -probesize 32 -i mmsh://ubuntu1804:8090/test1.asf

因此,-sync ext 和 -analyzeduration 1 对减少延迟没有帮助。

当使用 libx264 而不是 libx265 并删除 -thread 2 标志时,odroid 上的“流生产”也以相同的低延迟运行。但将帧速率提高到 30 甚至提高分辨率会导致显着的延迟。


0
投票

我使用了相同的发送指令,我用 ffplay 尝试了这个,它对我有用:

ffplay -analyzeduration 1 -fflags -nobuffer -probesize 32 -sync ext -i rtmp://localhost/live/STREAM_NAME
© www.soinside.com 2019 - 2024. All rights reserved.