ffmpeg使用网络摄像头进行非常低延迟的流量传输

时间:2017-03-22 13:51:17

标签: ffmpeg video-streaming live-streaming video-encoding libx264

我尝试配置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.0s延迟的延迟。有没有办法将其减少到小于100毫秒的数字。此外,当我使用x11grab使用屏幕捕获替换v4l2摄像头捕获时,流几乎是实时的,并且我没有遇到明显的延迟。此外,将编码器从x264更改为mpeg2对延迟没有影响。此外,来自ffmpeg的统计数据显示编码器以30fps的速率运行,我相信这表明编码是实时的。这让我只有一个经历过延迟的原因。

  • 在网络摄像头的视频捕获过程中使用v4l2时缓冲区是否有明显延迟?
  • 我不认为传输延迟在这种情况下有效,因为在相同条件下使用屏幕捕获时我看不到延迟。
  • 这种延迟可以进一步降低吗?有人可能会想到使用不同的编码器配置而不是我曾使用过的编码器配置吗?

非常感谢任何建议或帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

我使用了相同的发送指令,并在ffplay中尝试了此操作,并且对我有用:

    ffplay -analyzeduration 1 -fflags -nobuffer -probesize 32 -sync ext -i rtmp://localhost/live/STREAM_NAME

答案 1 :(得分:0)

在odroid spc和Windows pc之间设置低延迟视频流系统时,我也遇到很多问题。最终,我发现设置导致最长约500ms的时间。 1秒的延迟。

设置:使用ubuntu 18.04的odroid xu4上的ffserver,通过wifi加密狗连接到网络。来自odroid的相同wifi网络中的Windows 10 PC。

我在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甚至提高分辨率会导致严重的延迟。