如何使用 ffmpeg 有意为输入流添加延迟

如何使用 ffmpeg 有意为输入流添加延迟

我有一个连接到 Windows PC 的帧抓取器。捕获输入设备是 1080p、60fps、4:4:4 原始视频。我想在测试设置中使用它,让用户在现有的 Windows 应用程序上工作并引入图像压缩、降低分辨率和减少帧率。这个想法是为了了解用户体验并让用户评价不同的设置。我的想法是使用 ffmpeg 获取 RAW 输入流并引入延迟,转码为 MJPEG 并添加不同的 JPEG 级别并添加延迟。虽然我已经可以访问捕获设备、更改分辨率和降低帧率,但我不确定是否有可能引入延迟,因为大多数时候人们要么想引入视频延迟来弥补音频延迟,要么想减少视频延迟,而不是故意添加视频延迟 :-) 这是我目前处理流的方式:

ffmpeg -f dshow -i video="framegrabber_capture_1" -vf format=yuv420p,scale=1280x1024,fps=5 -f sdl test

附注:我只需要纯视频,测试设置中不需要音频。

我不知道如何转码为 MJPEG,但我想这是可行的。我根本找不到有关视频延迟的信息,因为这也意味着流被缓存在某个地方。如果有人能给我指明正确的方向就太好了。

谢谢!

J.

答案1

FFmpeg 不是为延迟显示视频而设计的,因为 FFmpeg 不是视频播放器。

我们可以强制 FFmpeg 延迟视频,方法是在摄像头视频之前连接一段短视频,使用连接过滤器。
我们还必须添加即时的过滤器,用于强制 FFmpeg 将输出速率与输入速率匹配(如果没有它,FFmpeg 会尽快发送视频)。

使用 MJPEG 编码,我们不能使用-f sdl test,我们将我的 FFmpeg 输出管道传输到 FFplay,来显示视频。


将捕获的视频延迟 5 秒的示例:

ffmpeg -an -f dshow -rtbufsize 1G -i video="framegrabber_capture_1" -filter_complex "color=white:size=1280x1024:rate=5:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=5[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay pipe:


  • -rtbufsize 1G- 将输入缓冲区的大小增加到 1 GByte(允许存储“许多”输入视频帧)。
  • color=white:size=1280x1024:rate=5:duration=5[w]- 创建持续时间为 5 秒、速率为 5fps 的合成白色视频。存储在 中[w]
  • [0:v]scale=1280x1024,setsar=1,fps=5- 缩放输入视频,并设置帧速率。存储在 中[v0]
  • [w][v0]concat- 将5秒白色视频与缩放的输入视频连接起来(5秒白色视频在前)。
  • realtime=limit=10- 将输出速率减慢至输入速率(limit=10即暂停限制)。
  • -c:v mjpeg -f mjpeg- 使用 MJPEG 编解码器对输出视频进行编码,并将其存储为 MJPEG 容器格式。
  • pipe:- 使用 stdout 作为输出。
  • | ffplay pipe:将 FFmpeg 的 stdout 管道传递到 FFplay 的 stdin 管道(用作输入)。

注意:
延迟并不准确,因为有额外的内置延迟。

我们可以(尝试)使用更高的帧速率来提高延迟的准确性,并添加setpts=0到 FFplay 命令:

ffmpeg -an -f dshow -rtbufsize 1G -i video="Microsoft® LifeCam HD-3000" -filter_complex "color=white:size=1280x1024:rate=25:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=25[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay -vf setpts=0 pipe:

相关内容